You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apache-bugdb@apache.org by "Sergei A.Golubchik" <se...@infomag.mipt.rssi.ru> on 1997/11/07 20:47:24 UTC
mod_headers/1383: I make mod_headers to modify request headers as well as response ones.
>Number: 1383
>Category: mod_headers
>Synopsis: I make mod_headers to modify request headers as well as response ones.
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: apache
>State: open
>Class: change-request
>Submitter-Id: apache
>Arrival-Date: Fri Nov 7 11:50:00 PST 1997
>Last-Modified:
>Originator: serg@infomag.mipt.rssi.ru
>Organization:
apache
>Release: 1.2.4
>Environment:
Doesn't matter
>Description:
I don't want to inform you in such a way, but you wrote in ABOUT_APACHE:
> If you just want to send in an occasional suggestion/fix, then you can
> just use the bug reporting form at <http://www.apache.org/bugdb.cgi>
So, you asked for it.
---------------------------------cut here--------------------------------
I just changed mod_headers.c slightly to add a new feature - it now is
able to modify request headers as well as response ones.
So, two new directives are added: HeaderIn and (for symmetry) HeaderOut.
Old directive Header remains as an alias for HeaderOut.
Why it is useful ? I don't know, really. I don't know how directive Header and
HeaderOut can be used. As for me I am using only HeaderIn to support multi-
lingual site. I switched MultiViews on and created files with language suffixes
*.ru *.en *.fr etc. But I also created a page for language selection. I did it
in such a way:
Choose one: <A HREF="http://myhost:8000/">Russian</A>,
<A HREF="http://myhost:8010/">English</A> etc.
'cause all files have language-independed links.
And in httpd.conf I wrote
Listen 80
Listen 8000
Listen 8010
<VirtualHost myhost:8000>
LanguagePriority ru en fr
</Virtualhost>
<Virtualhost myhost:8010>
Languagepriority en ru fr
</virtualhost>
etc.
but it wouldn't work if user agent sent Accept-Language: en
It would be always English.
And, you know, Rule Number One: Users Are Stupid!
I cannot tell them, please, go to the menu item "Options", and change
language order in the list "Languages". (Of course I do it anyway, but I
have to supply the easier soluton).
So, in the <Virtualhost> environment I changed the line
LanguagePriority ru en fr
to the
HeaderIn set Accept-Language: "ru; q=1, *; q=0.1"
and voila! every port has its own language
(and the default port 80 relies on Accept-Language and LanguagePriority)
that's all.
Regards,
SerG.
P.S. To say the truth, I am also using HeaderIn to modify
Accept-Charset header in the same way.
>How-To-Repeat:
What ???
>Fix:
--- mod_headers.c.orig Fri Mar 7 17:15:40 1997
+++ mod_headers.c Fri Nov 7 19:18:49 1997
@@ -52,13 +52,15 @@
/*
- * mod_headers.c: Add/append/remove HTTP response headers
+ * mod_headers.c: Add/append/remove HTTP request and response headers
* Written by Paul Sutton, paul@ukweb.com, 1 Oct 1996
+ * Request headers support added by SerG, serg@infomag.mipt.rssi.ru, 5 Nov 1997
*
* New directive, Header, can be used to add/replace/remove HTTP headers.
* Valid in both per-server and per-dir configurations.
+ * Use HeaderIn for modifying request headers.
*
* Syntax is:
*
- * Header action header value
+ * Header[In/Out] action header value
*
* Where action is one of:
@@ -95,4 +97,7 @@
* Header unset Author
*
+ * To make French answers dominating:
+ * HeaderIn set Accept-Language: fr; q=1, *; q=0.1
+ *
*/
@@ -104,5 +109,7 @@
hdr_set = 's', /* set (replace old value) */
hdr_append = 'm', /* append (merge into any old value) */
- hdr_unset = 'u' /* unset header */
+ hdr_unset = 'u', /* unset header */
+ hdr_out = 0x00, /* apply to response header */
+ hdr_in = 0x80 /* apply to request header */
} hdr_actions;
@@ -157,4 +164,5 @@
(headers_conf *)get_module_config(s->module_config,&headers_module);
char *colon;
+ hdr_actions hdr_where=*((hdr_actions *)(cmd->cmd->cmd_data));
if ( cmd->path )
@@ -167,16 +175,16 @@
}
- if (!strcasecmp(action, "set")) new->action = hdr_set;
- else if (!strcasecmp(action, "add")) new->action = hdr_add;
- else if (!strcasecmp(action, "append")) new->action = hdr_append;
- else if (!strcasecmp(action, "unset")) new->action = hdr_unset;
+ if (!strcasecmp(action, "set")) new->action = hdr_set | hdr_where;
+ else if (!strcasecmp(action, "add")) new->action = hdr_add | hdr_where;
+ else if (!strcasecmp(action, "append")) new->action = hdr_append | hdr_where;
+ else if (!strcasecmp(action, "unset")) new->action = hdr_unset | hdr_where;
else
return "first argument must be add, set, append or unset.";
- if (new->action == hdr_unset) {
- if (value) return "Header unset takes two arguments";
+ if (new->action == (hdr_unset|hdr_where)) {
+ if (value) return "Header[In|Out] unset takes two arguments";
}
else if (!value)
- return "Header requires three arguments";
+ return "Header[In|Out] requires three arguments";
if ((colon = strchr(hdr, ':')))
@@ -189,6 +197,12 @@
}
+hdr_actions hdr_actlist[]={hdr_out, hdr_in};
+
command_rec headers_cmds[] = {
-{ "Header", header_cmd, NULL, OR_FILEINFO, TAKE23,
+{ "Header", header_cmd, hdr_actlist, OR_FILEINFO, TAKE23,
+ "an action, header and value"},
+{ "HeaderOut", header_cmd, hdr_actlist, OR_FILEINFO, TAKE23,
+ "an action, header and value"},
+{ "HeaderIn", header_cmd, hdr_actlist+1, OR_FILEINFO, TAKE23,
"an action, header and value"},
{ NULL }
@@ -202,16 +216,28 @@
header_entry *hdr = &((header_entry*)(headers->elts))[i];
switch (hdr->action) {
- case hdr_add:
+ case hdr_add | hdr_out :
table_add(r->headers_out, hdr->header, hdr->value);
break;
- case hdr_append:
+ case hdr_append | hdr_out :
table_merge(r->headers_out, hdr->header, hdr->value);
break;
- case hdr_set:
+ case hdr_set | hdr_out :
table_set(r->headers_out, hdr->header, hdr->value);
break;
- case hdr_unset:
+ case hdr_unset | hdr_out :
table_unset(r->headers_out, hdr->header);
break;
+ case hdr_add | hdr_in :
+ table_add(r->headers_in, hdr->header, hdr->value);
+ break;
+ case hdr_append | hdr_in :
+ table_merge(r->headers_in, hdr->header, hdr->value);
+ break;
+ case hdr_set | hdr_in :
+ table_set(r->headers_in, hdr->header, hdr->value);
+ break;
+ case hdr_unset | hdr_in :
+ table_unset(r->headers_in, hdr->header);
+ break;
}
}
@@ -252,2 +278,3 @@
NULL /* header parser */
};
+
%0
>Audit-Trail:
>Unformatted: