X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_http.c;h=c2968290055013ada258b019461a7d454130f36a;hb=99eb08be924850cf76e3dece205d5cbf9c7d74c7;hp=3035e43a99611ec3daf9e3b5b99f2ec3a2d71316;hpb=f1ba2733d2c58fed90c13e9ae31cb7c1f3c5613e;p=collectd.git diff --git a/src/write_http.c b/src/write_http.c index 3035e43a..c2968290 100644 --- a/src/write_http.c +++ b/src/write_http.c @@ -56,6 +56,7 @@ struct wh_callback_s int format; CURL *curl; + struct curl_slist *headers; char curl_errbuf[CURL_ERROR_SIZE]; char send_buffer[4096]; @@ -88,7 +89,7 @@ static int wh_send_buffer (wh_callback_t *cb) /* {{{ */ curl_easy_setopt (cb->curl, CURLOPT_POSTFIELDS, cb->send_buffer); status = curl_easy_perform (cb->curl); - if (status != 0) + if (status != CURLE_OK) { ERROR ("write_http plugin: curl_easy_perform failed with " "status %i: %s", @@ -99,8 +100,6 @@ static int wh_send_buffer (wh_callback_t *cb) /* {{{ */ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ { - struct curl_slist *headers; - if (cb->curl != NULL) return (0); @@ -111,17 +110,17 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ return (-1); } - curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION); - headers = NULL; - headers = curl_slist_append (headers, "Accept: */*"); + cb->headers = NULL; + cb->headers = curl_slist_append (cb->headers, "Accept: */*"); if (cb->format == WH_FORMAT_JSON) - headers = curl_slist_append (headers, "Content-Type: application/json"); + cb->headers = curl_slist_append (cb->headers, "Content-Type: application/json"); else - headers = curl_slist_append (headers, "Content-Type: text/plain"); - headers = curl_slist_append (headers, "Expect:"); - curl_easy_setopt (cb->curl, CURLOPT_HTTPHEADER, headers); + cb->headers = curl_slist_append (cb->headers, "Content-Type: text/plain"); + cb->headers = curl_slist_append (cb->headers, "Expect:"); + curl_easy_setopt (cb->curl, CURLOPT_HTTPHEADER, cb->headers); curl_easy_setopt (cb->curl, CURLOPT_ERRORBUFFER, cb->curl_errbuf); curl_easy_setopt (cb->curl, CURLOPT_URL, cb->location); @@ -147,9 +146,9 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ curl_easy_setopt (cb->curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); } - curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER, cb->verify_peer); + curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER, (long) cb->verify_peer); curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYHOST, - cb->verify_host ? 2 : 0); + cb->verify_host ? 2L : 0L); if (cb->cacert != NULL) curl_easy_setopt (cb->curl, CURLOPT_CAINFO, cb->cacert); @@ -264,6 +263,13 @@ static void wh_callback_free (void *data) /* {{{ */ wh_flush_nolock (/* timeout = */ 0, cb); curl_easy_cleanup (cb->curl); + + if (cb->headers != NULL) + { + curl_slist_free_all (cb->headers); + cb->headers = NULL; + } + sfree (cb->location); sfree (cb->user); sfree (cb->pass); @@ -506,6 +512,7 @@ static int wh_config_url (oconfig_item_t *ci) /* {{{ */ { wh_callback_t *cb; user_data_t user_data; + char callback_name[DATA_MAX_NAME_LEN]; int i; cb = malloc (sizeof (*cb)); @@ -524,6 +531,7 @@ static int wh_config_url (oconfig_item_t *ci) /* {{{ */ cb->cacert = NULL; cb->format = WH_FORMAT_COMMAND; cb->curl = NULL; + cb->headers = NULL; pthread_mutex_init (&cb->send_lock, /* attr = */ NULL); @@ -556,16 +564,18 @@ static int wh_config_url (oconfig_item_t *ci) /* {{{ */ } } - DEBUG ("write_http: Registering write callback with URL %s", + ssnprintf (callback_name, sizeof (callback_name), "write_http/%s", cb->location); + DEBUG ("write_http: Registering write callback '%s' with URL '%s'", + callback_name, cb->location); memset (&user_data, 0, sizeof (user_data)); user_data.data = cb; user_data.free_func = NULL; - plugin_register_flush ("write_http", wh_flush, &user_data); + plugin_register_flush (callback_name, wh_flush, &user_data); user_data.free_func = wh_callback_free; - plugin_register_write ("write_http", wh_write, &user_data); + plugin_register_write (callback_name, wh_write, &user_data); return (0); } /* }}} int wh_config_url */ @@ -590,9 +600,18 @@ static int wh_config (oconfig_item_t *ci) /* {{{ */ return (0); } /* }}} int wh_config */ +static int wh_init (void) /* {{{ */ +{ + /* Call this while collectd is still single-threaded to avoid + * initialization issues in libgcrypt. */ + curl_global_init (CURL_GLOBAL_SSL); + return (0); +} /* }}} int wh_init */ + void module_register (void) /* {{{ */ { plugin_register_complex_config ("write_http", wh_config); + plugin_register_init ("write_http", wh_init); } /* }}} void module_register */ /* vim: set fdm=marker sw=8 ts=8 tw=78 et : */