Hi, I posted a patch some time ago which solves your problem : it ignores lines that do not match the rfc. It seems IIS's often do this and since most commercial proxies allow them too ...
It was a patch for the 2.0.39, but maybe it is ok for a 1.3.x too. Anyway, I think it is better the mod_proxy tries to work with faulty headers rather than denying them. Of course, printing out some error messages so the sysadm can contact the offending sites to upgrade to a working server ( or to switch to apache ;-) ). CU, Peter. Brett Hutley wrote: > > Greetings all. > > A couple of days ago I was trying to proxy Zope through Apache (1.3.26) > on OpenBSD. Zope was listening on port 8080, and I had a rewrite rule in > my http.conf file to proxy requests through to the Zope web server. > Unfortunately, when I tried to test this setup, I ended up getting > multiple HTTP headers in the response, which ended up appearing on the > client browser. > > What I discovered was that when mod_proxy was processing the headers, if > it got a line that didn't have a colon in it, (other than the first > line), it would return an NULL header list back to the calling function > indicating that the headers were invalid. Unfortunately, the Zope server > was sending back the string: > > Server: Zope/(Zope 2.5.1b1 (OpenBSD package zope-2.5.1b1) > , python 2.1.2, openbsd3) ZServer/1.1b1 > > split on two lines, which meant mod_proxy wouldn't process the headers > properly. Of course, this is a problem with the zope compilation rather > than mod_proxy, but I was wondering just how strict the proxying code > should be in parsing the headers from the remote server? It seems to me > that if the header parsing stuff in proxy_util.c was slightly more > forgiving of irregularities then life would be just that little bit > better :) > > Here is a patch to proxy_util.c that will allow certain header fields to > have (up to) a certain number additional continuation lines... at the > moment I've only defined the "Server" field name and specified that it > can have up to 2 additional invalid lines after it, but more header > fields can be added to fields_allowing_additional_lines array. > > Cheers, Brett > > ------------------------------------------------------------------------ > diff -Naur old/proxy_util.c new/proxy_util.c > --- old/proxy_util.c Fri Aug 16 10:16:56 2002 > +++ new/proxy_util.c Fri Aug 16 10:17:05 2002 > @@ -377,12 +377,23 @@ > * headers, which contain commas within the date field) do not get stuffed > * up. > */ > +static struct field_allowing_additional_lines { > + char *field_name; > + unsigned short max_num_additional_lines; > +} fields_allowing_additional_lines[] = { > + { "Server", 2 } /* allow the server field a max of 2 additional lines > */ > +}; > + > table *ap_proxy_read_headers(request_rec *r, char *buffer, int size, BUFF *f) > { > table *resp_hdrs; > int len; > char *value, *end; > char field[MAX_STRING_LEN]; > + char field_name[MAX_STRING_LEN]; /* to store the last field name read */ > + int num_additional_lines = 0; /* to count the number of crap header > lines */ > + > + field_name[0] = '\0'; > > resp_hdrs = ap_make_table(r->pool, 20); > > @@ -391,8 +402,33 @@ > * the connection closes (EOF), or we timeout. > */ > while ((len = ap_getline(buffer, size, f, 1)) > 0) { > - > if (!(value = strchr(buffer, ':'))) { /* Find the colon separator > */ > + /* check to see if the last header field read is > + one we can have continuation lines for... > + */ > + if (field_name[0]) /* check the 1st byte for null to > be quick */ > + { > + int i = 0; > + int i_max = > sizeof(fields_allowing_additional_lines) / sizeof(struct > field_allowing_additional_lines); > + int ok_to_continue = 0; > + > + while (i < i_max) > + { > + if (!strcmp(field_name, > fields_allowing_additional_lines[i].field_name)) > + { > + if (num_additional_lines < > fields_allowing_additional_lines[i].max_num_additional_lines) > + ok_to_continue = 1; > + break; > + } > + i++; > + } > + > + if (ok_to_continue) > + { > + num_additional_lines++; > + continue; > + } > + } > > /* > * Buggy MS IIS servers sometimes return invalid headers (an > @@ -415,6 +451,12 @@ > > *value = '\0'; > ++value; > + > + /* woo hoo! We got a new header! Do some stuff! */ > + /* copy the header field name into a buffer so we can check > it later */ > + strcpy(field_name, buffer); > + num_additional_lines = 0; /* reset the number of additional > lines */ > + > /* > * XXX: RFC2068 defines only SP and HT as whitespace, this test is > * wrong... and so are many others probably.