curl: allow --header and --proxy-header read from file

So many headers can be provided as @filename.

Suggested-by: Timothe Litt

Closes #1486
This commit is contained in:
Daniel Stenberg 2017-06-15 11:08:31 +02:00
parent b3e3a08c3c
commit 84b9458837
3 changed files with 48 additions and 11 deletions

View File

@ -1,10 +1,9 @@
Long: header Long: header
Short: H Short: H
Arg: <header> Arg: <header/@file>
Help: Pass custom header LINE to server Help: Pass custom header(s) to server
Protocols: HTTP Protocols: HTTP
--- ---
Extra header to include in the request when sending HTTP to a server. You may 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 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 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 content: do not add newlines or carriage returns, they will only mess things up
for you. 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. See also the --user-agent and --referer options.
Starting in 7.37.0, you need --proxy-header to send custom headers intended Starting in 7.37.0, you need --proxy-header to send custom headers intended

View File

@ -1,6 +1,6 @@
Long: proxy-header Long: proxy-header
Arg: <header> Arg: <header/@file>
Help: Pass custom header LINE to proxy Help: Pass custom header(s) to proxy
Protocols: HTTP Protocols: HTTP
Added: 7.37.0 Added: 7.37.0
--- ---
@ -17,4 +17,8 @@ up for you.
Headers specified with this option will not be included in requests that curl Headers specified with this option will not be included in requests that curl
knows will not be sent to a proxy. 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. This option can be used multiple times to add/replace/remove multiple headers.

View File

@ -1602,12 +1602,42 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
break; break;
case 'H': case 'H':
/* A custom header to append to a list */ /* A custom header to append to a list */
if(subletter == 'p') /* --proxy-header */ if(nextarg[0] == '@') {
err = add2list(&config->proxyheaders, nextarg); /* read many headers from a file or stdin */
else char *string;
err = add2list(&config->headers, nextarg); size_t len;
if(err) bool use_stdin = !strcmp(&nextarg[1], "-");
return err; 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; break;
case 'i': case 'i':
config->include_headers = toggle; /* include the headers as well in the config->include_headers = toggle; /* include the headers as well in the