curl_json plugin: Call yajl_complete_parse() / yajl_parse_complete() only once.
[collectd.git] / src / curl_json.c
index 968fc93..a799790 100644 (file)
@@ -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);
@@ -579,7 +572,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,
@@ -607,9 +600,9 @@ 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, db->verify_peer);
+  curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYPEER, (long) db->verify_peer);
   curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYHOST,
-                    db->verify_host ? 2 : 0);
+                    db->verify_host ? 2L : 0L);
   if (db->cacert != NULL)
     curl_easy_setopt (db->curl, CURLOPT_CAINFO, db->cacert);
 
@@ -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 */