Merge pull request #1634 from BrandonArp/add_write_http_headers
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 15 Apr 2016 18:40:11 +0000 (20:40 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 15 Apr 2016 18:40:11 +0000 (20:40 +0200)
add http headers functionality to write_http plugin

1  2 
src/collectd.conf.pod
src/write_http.c

diff --combined src/collectd.conf.pod
@@@ -208,7 -208,9 +208,7 @@@ I<pattern> may be specified to filter w
  in combination with recursively including a directory to easily be able to
  arbitrarily mix configuration files and other documents (e.g. README files).
  The given example is similar to the first example above but includes all files
 -matching C<*.conf> in any subdirectory of C</etc/collectd.d>:
 -
 -  Include "/etc/collectd.d" "*.conf"
 +matching C<*.conf> in any subdirectory of C</etc/collectd.d>.
  
  =back
  
@@@ -7575,6 -7577,12 +7575,12 @@@ authentication
  
  Password required to load the private key in B<ClientKey>.
  
+ =item B<Header> I<Header>
+ A HTTP header to add to the request.  Multiple headers are added if this option is specified more than once.  Example:
+   Header "X-Custom-Header: custom_value"
  =item B<SSLVersion> B<SSLv2>|B<SSLv3>|B<TLSv1>|B<TLSv1_0>|B<TLSv1_1>|B<TLSv1_2>
  
  Define which SSL protocol version must be used. By default C<libcurl> will
@@@ -8948,8 -8956,6 +8954,8 @@@ Available options
  
  =item B<TypeInstance> I<String>
  
 +=item B<MetaDataSet> I<String> I<String>
 +
  Set the appropriate field to the given string. The strings for plugin instance
  and type instance may be empty, the strings for host and plugin may not be
  empty. It's currently not possible to set the type of a value this way.
diff --combined src/write_http.c
@@@ -156,7 -156,6 +156,6 @@@ static int wh_callback_init (wh_callbac
          curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L);
          curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
  
-         cb->headers = NULL;
          cb->headers = curl_slist_append (cb->headers, "Accept:  */*");
          if (cb->format == WH_FORMAT_JSON)
                  cb->headers = curl_slist_append (cb->headers, "Content-Type: application/json");
                  if (cb->pass != NULL)
                          credentials_size += strlen (cb->pass);
  
 -                cb->credentials = (char *) malloc (credentials_size);
 +                cb->credentials = malloc (credentials_size);
                  if (cb->credentials == NULL)
                  {
                          ERROR ("curl plugin: malloc failed.");
@@@ -540,6 -539,25 +539,25 @@@ static int config_set_format (wh_callba
          return (0);
  } /* }}} int config_set_format */
  
+ static int wh_config_append_string (const char *name, struct curl_slist **dest, /* {{{ */
+     oconfig_item_t *ci)
+ {
+   struct curl_slist *temp = NULL;
+   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING))
+   {
+     WARNING ("write_http plugin: `%s' needs exactly one string argument.", name);
+     return (-1);
+   }
+   temp = curl_slist_append(*dest, ci->values[0].value.string);
+   if (temp == NULL)
+     return (-1);
+   *dest = temp;
+   return (0);
+ } /* }}} int wh_config_append_string */
  static int wh_config_node (oconfig_item_t *ci) /* {{{ */
  {
          wh_callback_t *cb;
          int status = 0;
          int i;
  
 -        cb = malloc (sizeof (*cb));
 +        cb = calloc (1, sizeof (*cb));
          if (cb == NULL)
          {
 -                ERROR ("write_http plugin: malloc failed.");
 +                ERROR ("write_http plugin: calloc failed.");
                  return (-1);
          }
 -        memset (cb, 0, sizeof (*cb));
          cb->verify_peer = 1;
          cb->verify_host = 1;
          cb->format = WH_FORMAT_COMMAND;
                          status = cf_util_get_int (child, &cb->timeout);
                  else if (strcasecmp ("LogHttpError", child->key) == 0)
                          status = cf_util_get_boolean (child, &cb->log_http_error);
+                 else if (strcasecmp ("Header", child->key) == 0)
+                         status = wh_config_append_string ("Header", &cb->headers, child);
                  else
                  {
                          ERROR ("write_http plugin: Invalid configuration "