From 956c85915da4060e9f16318bc94fb26f640ec218 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 16 May 2017 08:37:09 +0200 Subject: curl: allow --header and --proxy-header read from file So many headers can be provided as @filename. Suggested-by: Timothe Litt --- docs/cmdline-opts/header.d | 9 ++++++--- docs/cmdline-opts/proxy-header.d | 8 ++++++-- src/tool_getparam.c | 42 ++++++++++++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/docs/cmdline-opts/header.d b/docs/cmdline-opts/header.d index 90af7359e..d8292ed77 100644 --- a/docs/cmdline-opts/header.d +++ b/docs/cmdline-opts/header.d @@ -1,10 +1,9 @@ Long: header Short: H -Arg:
-Help: Pass custom header LINE to server +Arg:
+Help: Pass custom header(s) to server Protocols: HTTP --- - Extra header to include in the request when sending HTTP to a server. You may specify any number of extra headers. Note that if you should add a custom header that has the same name as one of the internal ones curl would use, your @@ -21,6 +20,10 @@ end-of-line marker, you should thus \fBnot\fP add that as a part of the header content: do not add newlines or carriage returns, they will only mess things up for you. +Starting in 7.55.0, this option can take an argument in @filename style, which +then adds a header for each line in the input file. Using @- will make curl +read the header file from stdin. + See also the --user-agent and --referer options. Starting in 7.37.0, you need --proxy-header to send custom headers intended diff --git a/docs/cmdline-opts/proxy-header.d b/docs/cmdline-opts/proxy-header.d index 1ef696bc7..c1b0bb7c4 100644 --- a/docs/cmdline-opts/proxy-header.d +++ b/docs/cmdline-opts/proxy-header.d @@ -1,6 +1,6 @@ Long: proxy-header -Arg:
-Help: Pass custom header LINE to proxy +Arg:
+Help: Pass custom header(s) to proxy Protocols: HTTP Added: 7.37.0 --- @@ -17,4 +17,8 @@ up for you. Headers specified with this option will not be included in requests that curl knows will not be sent to a proxy. +Starting in 7.55.0, this option can take an argument in @filename style, which +then adds a header for each line in the input file. Using @- will make curl +read the header file from stdin. + This option can be used multiple times to add/replace/remove multiple headers. diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 56bbbf18f..fabe8f04b 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -1602,12 +1602,42 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ break; case 'H': /* A custom header to append to a list */ - if(subletter == 'p') /* --proxy-header */ - err = add2list(&config->proxyheaders, nextarg); - else - err = add2list(&config->headers, nextarg); - if(err) - return err; + if(nextarg[0] == '@') { + /* read many headers from a file or stdin */ + char *string; + size_t len; + bool use_stdin = !strcmp(&nextarg[1], "-"); + FILE *file = use_stdin?stdin:fopen(&nextarg[1], FOPEN_READTEXT); + if(!file) + warnf(global, "Failed to open %s!\n", &nextarg[1]); + else { + if(PARAM_OK == file2memory(&string, &len, file)) { + /* Allow strtok() here since this isn't used threaded */ + /* !checksrc! disable BANNEDFUNC 2 */ + char *h = strtok(string, "\r\n"); + while(h) { + if(subletter == 'p') /* --proxy-header */ + err = add2list(&config->proxyheaders, h); + else + err = add2list(&config->headers, h); + if(err) + return err; + h = strtok(NULL, "\r\n"); + } + free(string); + } + if(!use_stdin) + fclose(file); + } + } + else { + if(subletter == 'p') /* --proxy-header */ + err = add2list(&config->proxyheaders, nextarg); + else + err = add2list(&config->headers, nextarg); + if(err) + return err; + } break; case 'i': config->include_headers = toggle; /* include the headers as well in the -- cgit v1.2.1