martin 98/08/31 12:52:04
Modified: src CHANGES src/include ap_mmn.h src/modules/proxy mod_proxy.h proxy_cache.c proxy_http.c proxy_util.c Log: As per Rick Ohnemus' <[EMAIL PROTECTED]> suggestion in PR#2914, apache now (logs and) ignores duplicate occurences of "HTTP/1.0 200 OK" lines often generated by IIS servers. PR: 2914 Revision Changes Path 1.1042 +6 -1 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1041 retrieving revision 1.1042 diff -u -r1.1041 -r1.1042 --- CHANGES 1998/08/31 13:33:50 1.1041 +++ CHANGES 1998/08/31 19:51:53 1.1042 @@ -1,5 +1,10 @@ Changes with Apache 1.3.2 + *) As duplicate "HTTP/1.0 200 OK" lines within the header seem to be + a common problem of (mis-administrated?) IIS servers, make the apache + proxy immune to these errors (and ignore the duplicates, but log + the fact to error_log). [Martin Kraemer], after the proposal in PR#2914 + *) The <IfModule and <IfDefine block starting directives now only allow exactly one argument. Previously, the optional negation character '!' could be separated by whitespace without a syntax @@ -31,7 +36,7 @@ dump core for replies with invalid headers (e.g., duplicate "HTTP/1.0 200 OK" lines). These errors are now logged and the core dump is avoided. Also, broken replies are not cached. - [Martin Kraemer] + [Martin Kraemer] PR#2914 *) new `GprofDir' directive when compiled with -DGPROF, where gprof can plop gmon.out profile data for each child [Doug MacEachern] 1.6 +5 -1 apache-1.3/src/include/ap_mmn.h Index: ap_mmn.h =================================================================== RCS file: /export/home/cvs/apache-1.3/src/include/ap_mmn.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ap_mmn.h 1998/08/25 09:15:29 1.5 +++ ap_mmn.h 1998/08/31 19:51:58 1.6 @@ -172,12 +172,16 @@ * ap_proxy_send_fb() and ap_proxy_cache_error(). * Add ap_proxy_send_hdr_line() and ap_proxy_bputs2(). * 19980825 (1.3.2-dev) - renamed is_HTTP_xxx() macros to ap_is_HTTP_xxx() + * 19980825.1 - mod_proxy only (minor change): modified interface of + * ap_proxy_read_headers() and rdcache() to use a + * request_rec* instead of pool* + * (for implementing better error reporting). */ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 19980825 #endif -#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 1 /* 0...n */ #define MODULE_MAGIC_NUMBER MODULE_MAGIC_NUMBER_MAJOR /* backward compat */ /* Useful for testing for features. */ 1.40 +1 -1 apache-1.3/src/modules/proxy/mod_proxy.h Index: mod_proxy.h =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/mod_proxy.h,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- mod_proxy.h 1998/08/16 20:51:55 1.39 +++ mod_proxy.h 1998/08/31 19:51:59 1.40 @@ -292,7 +292,7 @@ char *ap_proxy_canon_netloc(pool *p, char **const urlp, char **userp, char **passwordp, char **hostp, int *port); const char *ap_proxy_date_canon(pool *p, const char *x); -table *ap_proxy_read_headers(pool *p, char *buffer, int size, BUFF *f); +table *ap_proxy_read_headers(request_rec *r, char *buffer, int size, BUFF *f); long int ap_proxy_send_fb(BUFF *f, request_rec *r, cache_req *c); void ap_proxy_send_headers(request_rec *r, const char *respline, table *hdrs); int ap_proxy_liststr(const char *list, const char *val); 1.52 +5 -5 apache-1.3/src/modules/proxy/proxy_cache.c Index: proxy_cache.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/proxy_cache.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- proxy_cache.c 1998/08/25 09:15:34 1.51 +++ proxy_cache.c 1998/08/31 19:51:59 1.52 @@ -535,7 +535,7 @@ * 0 on failure (bad file or wrong URL) * -1 on UNIX error */ -static int rdcache(pool *p, BUFF *cachefp, cache_req *c) +static int rdcache(request_rec *r, BUFF *cachefp, cache_req *c) { char urlbuff[1034], *strp; int len; @@ -580,19 +580,19 @@ return 0; urlbuff[--len] = '\0'; - c->resp_line = ap_pstrdup(p, urlbuff); + c->resp_line = ap_pstrdup(r->pool, urlbuff); strp = strchr(urlbuff, ' '); if (strp == NULL) return 0; c->status = atoi(strp); - c->hdrs = ap_proxy_read_headers(p, urlbuff, sizeof urlbuff, cachefp); + c->hdrs = ap_proxy_read_headers(r, urlbuff, sizeof urlbuff, cachefp); if (c->hdrs == NULL) return -1; if (c->len != -1) { /* add a content-length header */ if (ap_table_get(c->hdrs, "Content-Length") == NULL) { ap_table_set(c->hdrs, "Content-Length", - ap_psprintf(p, "%lu", (unsigned long)c->len)); + ap_psprintf(r->pool, "%lu", (unsigned long)c->len)); } } return 1; @@ -677,7 +677,7 @@ } if (cachefp != NULL) { - i = rdcache(r->pool, cachefp, c); + i = rdcache(r, cachefp, c); if (i == -1) ap_log_rerror(APLOG_MARK, APLOG_ERR, r, "proxy: error reading cache file %s", 1.60 +1 -1 apache-1.3/src/modules/proxy/proxy_http.c Index: proxy_http.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/proxy_http.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -r1.59 -r1.60 --- proxy_http.c 1998/08/27 16:02:37 1.59 +++ proxy_http.c 1998/08/31 19:51:59 1.60 @@ -398,7 +398,7 @@ /* N.B. for HTTP/1.0 clients, we have to fold line-wrapped headers */ /* Also, take care with headers with multiple occurences. */ - resp_hdrs = ap_proxy_read_headers(p, buffer, HUGE_STRING_LEN, f); + resp_hdrs = ap_proxy_read_headers(r, buffer, HUGE_STRING_LEN, f); if (resp_hdrs == NULL) { ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server, "proxy: Bad HTTP/%d.%d header returned by %s (%s)", 1.70 +19 -3 apache-1.3/src/modules/proxy/proxy_util.c Index: proxy_util.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/proxy/proxy_util.c,v retrieving revision 1.69 retrieving revision 1.70 diff -u -r1.69 -r1.70 --- proxy_util.c 1998/08/16 20:21:28 1.69 +++ proxy_util.c 1998/08/31 19:51:59 1.70 @@ -62,6 +62,7 @@ #include "multithread.h" #include "http_log.h" #include "util_uri.h" +#include "util_date.h" /* get ap_checkmask() decl. */ static int proxy_match_ipaddr(struct dirconn_entry *This, request_rec *r); static int proxy_match_domainname(struct dirconn_entry *This, request_rec *r); @@ -424,14 +425,14 @@ * @@@: XXX: FIXME: currently the headers are passed thru un-merged. * Is that okay, or should they be collapsed where possible? */ -table *ap_proxy_read_headers(pool *p, char *buffer, int size, BUFF *f) +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]; - resp_hdrs = ap_make_table(p, 20); + resp_hdrs = ap_make_table(r->pool, 20); /* * Read header lines until we get the empty separator line, a read error, @@ -440,7 +441,22 @@ while ((len = proxy_getline(buffer, size, f, 1)) > 0) { if (!(value = strchr(buffer, ':'))) { /* Find the colon separator */ - return NULL; + + /* Buggy MS IIS servers sometimes return invalid headers + * (an extra "HTTP/1.0 200, OK" line sprinkled in between + * the usual MIME headers). Try to deal with it in a sensible + * way, but log the fact. + * XXX: The mask check is buggy if we ever see an HTTP/1.10 */ + + if (!ap_checkmask(buffer, "HTTP/#.# ###*")) { + /* Nope, it wasn't even an extra HTTP header. Give up. */ + return NULL; + } + + ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, r->server, + "proxy: Ignoring duplicate HTTP header " + "returned by %s (%s)", r->uri, r->method); + continue; } *value = '\0';