X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcurl_json.c;h=deee460bb3327e6291d6536190ac68e7a7d87cb0;hb=HEAD;hp=cc8b4ad3cb487360fee998148cfeaa67ca4dfd93;hpb=3427c2e266c04d67848bda913caa730a395c7295;p=collectd.git diff --git a/src/curl_json.c b/src/curl_json.c index cc8b4ad3..deee460b 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -67,6 +67,8 @@ struct cj_s /* {{{ */ _Bool verify_peer; _Bool verify_host; char *cacert; + struct curl_slist *headers; + char *post_body; CURL *curl; char curl_errbuf[CURL_ERROR_SIZE]; @@ -111,16 +113,9 @@ static size_t cj_curl_callback (void *buf, /* {{{ */ if (db == NULL) return (0); - status = yajl_parse(db->yajl, (unsigned char *) buf, len); + status = yajl_parse(db->yajl, (unsigned char *)buf, len); if (status == yajl_status_ok) - { -#if HAVE_YAJL_V2 - status = yajl_complete_parse(db->yajl); -#else - status = yajl_parse_complete(db->yajl); -#endif return (len); - } #if !HAVE_YAJL_V2 else if (status == yajl_status_insufficient_data) return (len); @@ -374,6 +369,8 @@ static void cj_free (void *arg) /* {{{ */ sfree (db->pass); sfree (db->credentials); sfree (db->cacert); + sfree (db->post_body); + curl_slist_free_all (db->headers); sfree (db); } /* }}} void cj_free */ @@ -385,6 +382,22 @@ static c_avl_tree_t *cj_avl_create(void) return c_avl_create ((int (*) (const void *, const void *)) strcmp); } +static int cj_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_json 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 cj_config_append_string */ + static int cj_config_add_key (cj_t *db, /* {{{ */ oconfig_item_t *ci) { @@ -521,7 +534,7 @@ static int cj_init_curl (cj_t *db) /* {{{ */ return (-1); } - curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (db->curl, CURLOPT_WRITEFUNCTION, cj_curl_callback); curl_easy_setopt (db->curl, CURLOPT_WRITEDATA, db); curl_easy_setopt (db->curl, CURLOPT_USERAGENT, @@ -549,11 +562,15 @@ static int cj_init_curl (cj_t *db) /* {{{ */ curl_easy_setopt (db->curl, CURLOPT_USERPWD, db->credentials); } - curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYPEER, (int) db->verify_peer); + curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYPEER, (long) db->verify_peer); curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYHOST, - (int) (db->verify_host ? 2 : 0)); + db->verify_host ? 2L : 0L); if (db->cacert != NULL) curl_easy_setopt (db->curl, CURLOPT_CAINFO, db->cacert); + if (db->headers != NULL) + curl_easy_setopt (db->curl, CURLOPT_HTTPHEADER, db->headers); + if (db->post_body != NULL) + curl_easy_setopt (db->curl, CURLOPT_POSTFIELDS, db->post_body); return (0); } /* }}} int cj_init_curl */ @@ -615,6 +632,10 @@ static int cj_config_add_url (oconfig_item_t *ci) /* {{{ */ status = cf_util_get_boolean (child, &db->verify_host); else if (strcasecmp ("CACert", child->key) == 0) status = cf_util_get_string (child, &db->cacert); + else if (strcasecmp ("Header", child->key) == 0) + status = cj_config_append_string ("Header", &db->headers, child); + else if (strcasecmp ("Post", child->key) == 0) + status = cf_util_get_string (child, &db->post_body); else if (strcasecmp ("Key", child->key) == 0) status = cj_config_add_key (db, child); else @@ -770,7 +791,7 @@ static int cj_curl_perform (cj_t *db, CURL *curl) /* {{{ */ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url); status = curl_easy_perform (curl); - if (status != 0) + if (status != CURLE_OK) { ERROR ("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)", status, db->curl_errbuf, (url != NULL) ? url : "");