diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-16 04:25:46 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-16 04:25:46 +0000 |
commit | 79a60fb12410e12dc9bb3cd78972cc47149f197d (patch) | |
tree | d7eff11e949ec68e7e5fa35bdeffde462e20bf10 /funcs | |
parent | 22ccdccccee09665c4e49bc02476bef372d8ad22 (diff) |
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: http://svn.digium.com/svn/asterisk/trunk@48514 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'funcs')
-rw-r--r-- | funcs/func_curl.c | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/funcs/func_curl.c b/funcs/func_curl.c index f6091d025..08e786eaf 100644 --- a/funcs/func_curl.c +++ b/funcs/func_curl.c @@ -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 int curl_internal(struct MemoryStruct *chunk, char *url, char *post) +static const char *global_useragent = "asterisk-libcurl-agent/1.0"; + +static void curl_instance_cleanup(void *data) { - CURL *curl; + CURL **curl = data; - curl = curl_easy_init(); + curl_easy_cleanup(*curl); +} + +AST_THREADSTORAGE_CUSTOM(curl_instance, curl_instance_init, curl_instance_cleanup); - if (!curl) { +static int curl_internal(struct MemoryStruct *chunk, char *url, char *post) +{ + CURL **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; } |