aboutsummaryrefslogtreecommitdiffstats
path: root/funcs/func_curl.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-12-16 04:25:46 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-12-16 04:25:46 +0000
commit79a60fb12410e12dc9bb3cd78972cc47149f197d (patch)
treed7eff11e949ec68e7e5fa35bdeffde462e20bf10 /funcs/func_curl.c
parent22ccdccccee09665c4e49bc02476bef372d8ad22 (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/func_curl.c')
-rw-r--r--funcs/func_curl.c48
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;
}