return a && ascii_is_valid(a) && !string_has_cc(a, /* ok= */ NULL) && !strchr(a, ':');
}
-static bool http_header_valid(const char *a) {
- return a && ascii_is_valid(a) && !string_has_cc(a, /* ok= */ NULL) && strchr(a, ':');
-}
-
static int parse_argv(int argc, char *argv[]) {
int r;
if (r < 0)
return log_error_errno(r, "Failed to create curl header: %m");
+ r = curl_append_to_header(&header, arg_extra_headers);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create curl header: %m");
+
_cleanup_(curl_easy_cleanupp) CURL *curl = curl_easy_init();
if (!curl)
return log_error_errno(SYNTHETIC_ERRNO(ENOSR),
#include "time-util.h"
#include "varlink-idl-util.h"
#include "verbs.h"
+#include "web-util.h"
#define METRICS_OR_FACTS_MAX 4096U
#define METRICS_OR_FACTS_LINKS_MAX 128U
char *arg_key = NULL;
char *arg_cert = NULL;
char *arg_trust = NULL;
+char **arg_extra_headers = NULL;
usec_t arg_network_timeout_usec = TIMEOUT_USEC;
STATIC_DESTRUCTOR_REGISTER(arg_matches, strv_freep);
STATIC_DESTRUCTOR_REGISTER(arg_key, freep);
STATIC_DESTRUCTOR_REGISTER(arg_cert, freep);
STATIC_DESTRUCTOR_REGISTER(arg_trust, freep);
+STATIC_DESTRUCTOR_REGISTER(arg_extra_headers, strv_freep);
typedef struct LinkInfo {
Context *context;
if (r < 0)
return log_error_errno(r, "Failed to parse --network-timeout value: %s", arg);
break;
+
+ OPTION_LONG("extra-header", "NAME: VALUE",
+ "Inject additional header into the upload request"):
+ if (isempty(arg)) {
+ arg_extra_headers = strv_free(arg_extra_headers);
+ break;
+ }
+
+ if (!http_header_valid(arg))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid HTTP header: %s", arg);
+
+ if (strv_extend(&arg_extra_headers, arg) < 0)
+ return log_oom();
+ break;
}
- if ((arg_url || arg_key || arg_cert || arg_trust) && !HAVE_LIBCURL)
+ if ((arg_url || arg_key || arg_cert || arg_trust || arg_extra_headers) && !HAVE_LIBCURL)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Compiled without libcurl.");
*ret_args = option_parser_get_args(&state);
#define REPORT_TRUST_FILE CERTIFICATE_ROOT "/ca/trusted.pem"
extern char *arg_url, *arg_key, *arg_cert, *arg_trust;
+extern char **arg_extra_headers;
extern usec_t arg_network_timeout_usec;
typedef enum Action {
return ascii_is_valid(p);
}
+bool http_header_valid(const char *header) {
+ return header &&
+ ascii_is_valid(header) &&
+ !string_has_cc(header, /* ok= */ NULL) &&
+ strchr(header, ':');
+}
+
bool http_etag_is_valid(const char *etag) {
if (isempty(etag))
return false;
bool http_url_is_valid(const char *url) _pure_;
bool file_url_is_valid(const char *url) _pure_;
bool documentation_url_is_valid(const char *url) _pure_;
+bool http_header_valid(const char *header) _pure_;
bool http_etag_is_valid(const char *etag) _pure_;