Alexander Hall wrote: > I don't have any actual interest in the change myself, nor the time to > test it, but now at least the diff has the fixes I expected to see > regarding my prior concerns. >
Anyone else who would test or comment on this one? Tested so far by me: telnetting to apache, and see what comes back, so the old headers still seem to work for me. Tested the new RequestHeader directive in conjunction with mod_proxy configured as reverse proxy. Have seen with tcpdump that the headers were sent to the application server. Sebastian > /Alexander > > On 09/13/10 19:50, Sebastian Reitenbach wrote: > >> Again, >> >> as I was pointed out the patch was borked, and actually documentation >> missing, here is a new one, including the documentation. >> >> Sebastian >> >> On Monday, September 13, 2010 18:26 CEST, Sebastian Reitenbach >> <sebas...@l00-bugdead-prods.de> wrote: >> >> >>> Hi, >>> >>> attached a new revision of the patch. Please comment, and let me know >>> whether its OK to add or still sth. wrong. >>> >>> thanks, >>> Sebastian >>> >>> Alexander Hall wrote: >>> > On 09/12/10 18:20, Sebastian Reitenbach wrote: >>> > >>> >> - table *tbl = (hdr->do_err ? r->err_headers_out : r->headers_out); >>> >> + table *tbl; >>> >> + switch (hdr->inout) { >>> >> + case hdrs_out: >>> >> + tbl = r->headers_out; >>> >> + break; >>> >> + case hdrs_in: >>> >> + tbl = r->headers_in; >>> >> + break; >>> >> + } >>> >> + tbl = (hdr->do_err ? r->err_headers_out : r->headers_out); >>> > >>> > Err... Set tbl above and then set it again? >>> > >>> > Also, what's with the indentation? >>> > >>> >> switch (hdr->action) { >>> >> case hdr_add: >>> >> ap_table_addn(tbl, hdr->header, hdr->value); >>> >> >>> > >>> >> Index: src/modules/standard/mod_headers.c >> =================================================================== >> RCS file: /cvs/src/usr.sbin/httpd/src/modules/standard/mod_headers.c,v >> retrieving revision 1.8 >> diff -u -r1.8 mod_headers.c >> --- src/modules/standard/mod_headers.c 21 Aug 2003 13:11:36 -0000 >> 1.8 >> +++ src/modules/standard/mod_headers.c 13 Sep 2010 17:45:35 -0000 >> @@ -59,13 +59,19 @@ >> /* >> * mod_headers.c: Add/append/remove HTTP response headers >> * Written by Paul Sutton, p...@ukweb.com, 1 Oct 1996 >> + * Updated with RequestHeader by Martin Algesten, >> + * puck...@taglab.com, 13 Jul 2002. >> * >> * New directive, Header, can be used to add/replace/remove HTTP headers. >> * Valid in both per-server and per-dir configurations. >> + * In addition directive, RequestHeader, can be used exactly as Header but >> + * with the difference that the header is added to the request headers >> rather >> + * than the response. >> * >> * Syntax is: >> * >> - * Header action header value >> + * Header action header value >> + * RequestHeader action header value >> * >> * Where action is one of: >> * set - set this header, replacing any old value >> @@ -77,7 +83,7 @@ >> * Where action is unset, the third argument (value) should not be given. >> * The header name can include the colon, or not. >> * >> - * The Header directive can only be used where allowed by the FileInfo >> + * The directives can only be used where allowed by the FileInfo >> * override. >> * >> * When the request is processed, the header directives are processed in >> @@ -112,7 +118,15 @@ >> hdr_unset = 'u' /* unset header */ >> } hdr_actions; >> >> + >> +typedef enum { >> + hdrs_in = 'i', /* Add header to incoming (request) headers >> */ >> + hdrs_out = 'o' /* Add header to outgoing (response) >> headers */ >> +} hdrs_inout; >> + >> + >> typedef struct { >> + hdrs_inout inout; >> hdr_actions action; >> char *header; >> char *value; >> @@ -154,7 +168,7 @@ >> return a; >> } >> >> -static const char *header_cmd(cmd_parms *cmd, headers_conf * dirconf, char >> *action, char *hdr, char *value) >> +static const char *header_cmd(cmd_parms *cmd, headers_conf * dirconf, char >> *action, char *hdr, char *value, hdrs_inout inout ) >> { >> header_entry *new; >> server_rec *s = cmd->server; >> @@ -175,6 +189,8 @@ >> new->do_err = 0; >> } >> >> + new->inout = inout; >> + >> if (!strcasecmp(action, "set")) >> new->action = hdr_set; >> else if (!strcasecmp(action, "add")) >> @@ -202,11 +218,23 @@ >> return NULL; >> } >> >> +static const char *outheader_cmd(cmd_parms *cmd, headers_conf * dirconf, >> char *action, char *hdr, char *value) >> +{ >> + header_cmd( cmd, dirconf, action, hdr, value, hdrs_out ); >> +} >> + >> +static const char *inheader_cmd(cmd_parms *cmd, headers_conf * dirconf, >> char *action, char *hdr, char *value) >> +{ >> + header_cmd( cmd, dirconf, action, hdr, value, hdrs_in ); >> +} >> + >> static const command_rec headers_cmds[] = >> { >> - {"Header", header_cmd, (void *)0, OR_FILEINFO, TAKE23, >> + {"Header", outheader_cmd, NULL, OR_FILEINFO, TAKE23, >> + "an action, header and value"}, >> + {"RequestHeader", inheader_cmd, NULL, OR_FILEINFO, TAKE23, >> "an action, header and value"}, >> - {"ErrorHeader", header_cmd, (void *)1, OR_FILEINFO, TAKE23, >> + {"ErrorHeader", outheader_cmd, (void *)1, OR_FILEINFO, TAKE23, >> "an action, header and value"}, >> {NULL} >> }; >> @@ -217,7 +245,15 @@ >> >> for (i = 0; i < headers->nelts; ++i) { >> header_entry *hdr = &((header_entry *) (headers->elts))[i]; >> - table *tbl = (hdr->do_err ? r->err_headers_out : r->headers_out); >> + table *tbl; >> + switch (hdr->inout) { >> + case hdrs_out: >> + tbl = (hdr->do_err ? r->err_headers_out : r->headers_out); >> + break; >> + case hdrs_in: >> + tbl = r->headers_in; >> + break; >> + } >> switch (hdr->action) { >> case hdr_add: >> ap_table_addn(tbl, hdr->header, hdr->value); >> Index: htdocs/manual/mod/mod_headers.html >> =================================================================== >> RCS file: /cvs/src/usr.sbin/httpd/htdocs/manual/mod/mod_headers.html,v >> retrieving revision 1.6 >> diff -u -r1.6 mod_headers.html >> --- htdocs/manual/mod/mod_headers.html 7 Oct 2002 21:04:44 -0000 >> 1.6 >> +++ htdocs/manual/mod/mod_headers.html 13 Sep 2010 17:45:35 -0000 >> @@ -44,6 +44,7 @@ >> <ul> >> <li><a href="#header">Header</a></li> >> <li><a href="#errorheader">ErrorHeader</a></li> >> + <li><a href="#requestheader">RequestHeader</a></li> >> </ul> >> <hr /> >> >> @@ -158,6 +159,33 @@ >> <p>This directive can replace, merge or remove HTTP response >> headers during 3xx, 4xx and 5xx replies. For normal replies >> use the Header directive. >> + </p> >> + <p>This directive is identical to the <a href="#header">Header</a> >> + directive in all other respects. Consult this directive for >> + more information on the syntax. >> + </P> >> + >> + <h2><a id="requestheader" name="requestheader">RequestHeader</a> >> directive</h2> >> + <a href="directive-dict.html#Syntax" >> + rel="Help"><strong>Syntax:</strong></a> RequestHeader set|append|add >> + <em>header</em> <em>value</em><br /> >> + <a href="directive-dict.html#Syntax" >> + rel="Help"><strong>Syntax:</strong></a> RequestHeader unset >> + <em>header</em><br /> >> + <a href="directive-dict.html#Context" >> + rel="Help"><strong>Context:</strong></a> server config, virtual >> + host, access.conf, .htaccess<br /> >> + <a href="directive-dict.html#Override" >> + rel="Help"><strong>Override:</strong></a> FileInfo<br /> >> + <a href="directive-dict.html#Status" >> + rel="Help"><strong>Status:</strong></a> Extension<br /> >> + <a href="directive-dict.html#Module" >> + rel="Help"><strong>Module:</strong></a> mod_headers >> + >> + <p>This directive can replace, merge or remove HTTP request >> + headers. As opposed to the <a href="#header">Header</a> directive, >> + this directive modifies incoming request headers instead of outgoing >> + responses. >> </p> >> <p>This directive is identical to the <a href="#header">Header</a> >> directive in all other respects. Consult this directive for