Skip to content

Commit

Permalink
curl: allow --header and --proxy-header read from file
Browse files Browse the repository at this point in the history
So many headers can be provided as @filename.

Suggested-by: Timothe Litt

Closes curl#1486
  • Loading branch information
bagder committed Jun 15, 2017
1 parent b3e3a08 commit 84b9458
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 11 deletions.
9 changes: 6 additions & 3 deletions docs/cmdline-opts/header.d
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
Long: header
Short: H
Arg: <header>
Help: Pass custom header LINE to server
Arg: <header/@file>
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
Expand All @@ -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
Expand Down
8 changes: 6 additions & 2 deletions docs/cmdline-opts/proxy-header.d
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Long: proxy-header
Arg: <header>
Help: Pass custom header LINE to proxy
Arg: <header/@file>
Help: Pass custom header(s) to proxy
Protocols: HTTP
Added: 7.37.0
---
Expand All @@ -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.
42 changes: 36 additions & 6 deletions src/tool_getparam.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 84b9458

Please sign in to comment.