From: Florian Forster Date: Wed, 20 Feb 2013 07:36:46 +0000 (+0100) Subject: curl_json plugin: Call yajl_complete_parse() / yajl_parse_complete() only once. X-Git-Tag: collectd-4.10.9~12 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=59c22282427eb6c38d6651cdaa205533752284cb;p=collectd.git curl_json plugin: Call yajl_complete_parse() / yajl_parse_complete() only once. The cURL callback may be called several times, so we need to call the complete() function after perform() returns. --- diff --git a/src/curl_json.c b/src/curl_json.c index 51c1b2ed..a7997907 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -113,14 +113,7 @@ static size_t cj_curl_callback (void *buf, /* {{{ */ 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); @@ -826,9 +819,6 @@ static int cj_curl_perform (cj_t *db, CURL *curl) /* {{{ */ status = curl_easy_perform (curl); - yajl_free (db->yajl); - db->yajl = yprev; - curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url); curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rc); @@ -837,6 +827,8 @@ static int cj_curl_perform (cj_t *db, CURL *curl) /* {{{ */ { ERROR ("curl_json plugin: curl_easy_perform failed with response code %ld (%s)", rc, url); + yajl_free (db->yajl); + db->yajl = yprev; return (-1); } @@ -844,9 +836,30 @@ static int cj_curl_perform (cj_t *db, CURL *curl) /* {{{ */ { ERROR ("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)", status, db->curl_errbuf, url); + yajl_free (db->yajl); + db->yajl = yprev; return (-1); } +#if HAVE_YAJL_V2 + status = yajl_complete_parse(db->yajl); +#else + status = yajl_parse_complete(db->yajl); +#endif + if (status != yajl_status_ok) + { + ERROR ("curl_json plugin: %s failed with status %i.", +#if HAVE_YAJL_V2 + "yajl_complete_parse", +#else + "yajl_parse_complete", +#endif + status); + } + + yajl_free (db->yajl); + db->yajl = yprev; + return (0); } /* }}} int cj_curl_perform */