mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Merged revisions 48513 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r48513 | kpfleming | 2006-12-15 22:25:09 -0600 (Fri, 15 Dec 2006) | 2 lines instead of initializing the curl library every time the CURL() function is invoked, do it only once per thread (this allows multiple calls to CURL() in the dialplan for a channel to run much more quickly, and also to re-use connections to the server) (thanks to JerJer for frequently complaining about this performance problem) ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48514 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -51,13 +51,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| #include "asterisk/module.h" | ||||
| #include "asterisk/app.h" | ||||
| #include "asterisk/utils.h" | ||||
| #include "asterisk/threadstorage.h" | ||||
|  | ||||
| struct MemoryStruct { | ||||
| 	char *memory; | ||||
| 	size_t size; | ||||
| }; | ||||
|  | ||||
|  | ||||
| static void *myrealloc(void *ptr, size_t size) | ||||
| { | ||||
| 	/* There might be a realloc() out there that doesn't like reallocing | ||||
| @@ -82,32 +82,46 @@ static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *da | ||||
| 	return realsize; | ||||
| } | ||||
|  | ||||
| static const char *global_useragent = "asterisk-libcurl-agent/1.0"; | ||||
|  | ||||
| static void curl_instance_cleanup(void *data) | ||||
| { | ||||
| 	CURL **curl = data; | ||||
|  | ||||
| 	curl_easy_cleanup(*curl); | ||||
| } | ||||
|  | ||||
| AST_THREADSTORAGE_CUSTOM(curl_instance, curl_instance_init, curl_instance_cleanup); | ||||
|  | ||||
| static int curl_internal(struct MemoryStruct *chunk, char *url, char *post) | ||||
| { | ||||
| 	CURL *curl; | ||||
| 	CURL **curl; | ||||
|  | ||||
| 	curl = curl_easy_init(); | ||||
|  | ||||
| 	if (!curl) { | ||||
| 	if (!(curl = ast_threadstorage_get(&curl_instance, sizeof(*curl)))) | ||||
| 		return -1; | ||||
|  | ||||
| 	if (!*curl) { | ||||
| 		if (!(*curl = curl_easy_init())) | ||||
| 			return -1; | ||||
| 		curl_easy_setopt(*curl, CURLOPT_NOSIGNAL, 1); | ||||
| 		curl_easy_setopt(*curl, CURLOPT_TIMEOUT, 180); | ||||
| 		curl_easy_setopt(*curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); | ||||
| 		curl_easy_setopt(*curl, CURLOPT_USERAGENT, global_useragent); | ||||
| 	} | ||||
|  | ||||
| 	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); | ||||
| 	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 180); | ||||
| 	curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 1); | ||||
| 	curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); | ||||
| 	curl_easy_setopt(curl, CURLOPT_URL, url); | ||||
| 	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); | ||||
| 	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)chunk); | ||||
| 	curl_easy_setopt(curl, CURLOPT_USERAGENT, "asterisk-libcurl-agent/1.0"); | ||||
| 	curl_easy_setopt(*curl, CURLOPT_URL, url); | ||||
| 	curl_easy_setopt(*curl, CURLOPT_WRITEDATA, (void *) chunk); | ||||
|  | ||||
| 	if (post) { | ||||
| 		curl_easy_setopt(curl, CURLOPT_POST, 1); | ||||
| 		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post); | ||||
| 		curl_easy_setopt(*curl, CURLOPT_POST, 1); | ||||
| 		curl_easy_setopt(*curl, CURLOPT_POSTFIELDS, post); | ||||
| 	} | ||||
|  | ||||
| 	curl_easy_perform(curl); | ||||
| 	curl_easy_cleanup(curl); | ||||
| 	curl_easy_perform(*curl); | ||||
|  | ||||
| 	if (post) | ||||
| 		curl_easy_setopt(*curl, CURLOPT_POST, 0); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user