X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl.c;h=ffd4901763c280068b70b19809ddfbec408fe80f;hb=8e9bdd5a63e67c6adb403c2aac4a25e0595ea147;hp=2160b980de5a18c3ca9a0f98a8ddf37469f18bf2;hpb=f1ba2733d2c58fed90c13e9ae31cb7c1f3c5613e;p=collectd.git diff --git a/src/curl.c b/src/curl.c index 2160b980..ffd49017 100644 --- a/src/curl.c +++ b/src/curl.c @@ -60,6 +60,8 @@ struct web_page_s /* {{{ */ int verify_peer; int verify_host; char *cacert; + struct curl_slist *headers; + char *post_body; int response_time; CURL *curl; @@ -148,6 +150,8 @@ static void cc_web_page_free (web_page_t *wp) /* {{{ */ sfree (wp->pass); sfree (wp->credentials); sfree (wp->cacert); + sfree (wp->post_body); + curl_slist_free_all (wp->headers); sfree (wp->buffer); @@ -173,6 +177,23 @@ static int cc_config_add_string (const char *name, char **dest, /* {{{ */ return (0); } /* }}} int cc_config_add_string */ +static int cc_config_append_string (const char *name, struct curl_slist **dest, /* {{{ */ + oconfig_item_t *ci) +{ + if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) + { + WARNING ("curl plugin: `%s' needs exactly one string argument.", name); + return (-1); + } + + *dest = curl_slist_append(*dest, ci->values[0].value.string); + if (*dest == NULL) + return (-1); + + return (0); +} /* }}} int cc_config_append_string */ + + static int cc_config_set_boolean (const char *name, int *dest, /* {{{ */ oconfig_item_t *ci) { @@ -370,14 +391,15 @@ static int cc_page_init_curl (web_page_t *wp) /* {{{ */ return (-1); } - curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (wp->curl, CURLOPT_WRITEFUNCTION, cc_curl_callback); curl_easy_setopt (wp->curl, CURLOPT_WRITEDATA, wp); curl_easy_setopt (wp->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION); curl_easy_setopt (wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf); curl_easy_setopt (wp->curl, CURLOPT_URL, wp->url); - curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt (wp->curl, CURLOPT_MAXREDIRS, 50L); if (wp->user != NULL) { @@ -399,11 +421,15 @@ static int cc_page_init_curl (web_page_t *wp) /* {{{ */ curl_easy_setopt (wp->curl, CURLOPT_USERPWD, wp->credentials); } - curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, wp->verify_peer); + curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, (long) wp->verify_peer); curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYHOST, - wp->verify_host ? 2 : 0); + wp->verify_host ? 2L : 0L); if (wp->cacert != NULL) curl_easy_setopt (wp->curl, CURLOPT_CAINFO, wp->cacert); + if (wp->headers != NULL) + curl_easy_setopt (wp->curl, CURLOPT_HTTPHEADER, wp->headers); + if (wp->post_body != NULL) + curl_easy_setopt (wp->curl, CURLOPT_POSTFIELDS, wp->post_body); return (0); } /* }}} int cc_page_init_curl */ @@ -465,6 +491,10 @@ static int cc_config_add_page (oconfig_item_t *ci) /* {{{ */ else if (strcasecmp ("Match", child->key) == 0) /* Be liberal with failing matches => don't set `status'. */ cc_config_add_match (page, child); + else if (strcasecmp ("Header", child->key) == 0) + status = cc_config_append_string ("Header", &page->headers, child); + else if (strcasecmp ("Post", child->key) == 0) + status = cc_config_add_string ("Post", &page->post_body, child); else { WARNING ("curl plugin: Option `%s' not allowed here.", child->key); @@ -582,7 +612,8 @@ static void cc_submit (const web_page_t *wp, const web_match_t *wm, /* {{{ */ sstrncpy (vl.plugin, "curl", sizeof (vl.plugin)); sstrncpy (vl.plugin_instance, wp->instance, sizeof (vl.plugin_instance)); sstrncpy (vl.type, wm->type, sizeof (vl.type)); - sstrncpy (vl.type_instance, wm->instance, sizeof (vl.type_instance)); + if (wm->instance != NULL) + sstrncpy (vl.type_instance, wm->instance, sizeof (vl.type_instance)); plugin_dispatch_values (&vl); } /* }}} void cc_submit */ @@ -615,7 +646,7 @@ static int cc_read_page (web_page_t *wp) /* {{{ */ wp->buffer_fill = 0; status = curl_easy_perform (wp->curl); - if (status != 0) + if (status != CURLE_OK) { ERROR ("curl plugin: curl_easy_perform failed with staus %i: %s", status, wp->curl_errbuf);