From d121992ce9a43e699eaf7b8b5f854aa02874f0d4 Mon Sep 17 00:00:00 2001 From: Nick Kew Date: Tue, 9 Oct 2007 15:26:41 +0000 Subject: [PATCH] mod_proxy_http: Correctly parse all Connection headers in proxy. PR 43509 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@583194 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ STATUS | 12 ------------ modules/proxy/mod_proxy_http.c | 28 ++++++++++++++++++---------- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/CHANGES b/CHANGES index 40c24292990..3d5f415672b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.7 + *) mod_proxy_http: Correctly parse all Connection headers in proxy. + PR 43509 [Nick Kew] + *) mod_proxy_http: add Via header correctly (if enabled) to response, even where other Via headers exist. PR 19439 [Nick Kew] diff --git a/STATUS b/STATUS index 28edd89de39..2fd3bf24a42 100644 --- a/STATUS +++ b/STATUS @@ -79,18 +79,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_proxy_http: Correctly parse all Connection headers in proxy. - PR 43509 - trunk: http://svn.apache.org/viewvc?view=rev&revision=580457 - 2.2.x: http://people.apache.org/~niq/43509.patch - +1: niq, rpluem - niq: changed the name. Resisted temptation to use "pooltabletime". - rpluem says: Revision of name change is r581030. - -1: jim. r580457 and r581030 conflict. Likely because of - r580782 - niq: separate 2.2.x patch fixes jim's objection - +1: jim - * mod_proxy_http: Remove Warning headers with wrong date PR 16138 trunk: http://svn.apache.org/viewvc?view=rev&revision=580782 diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index d88881756e2..7b867cd146d 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -98,29 +98,37 @@ static int proxy_http_canon(request_rec *r, char *url) } /* Clear all connection-based headers from the incoming headers table */ -static void ap_proxy_clear_connection(apr_pool_t *p, apr_table_t *headers) +typedef struct header_dptr { + apr_pool_t *pool; + apr_table_t *table; +} header_dptr; +static int clear_conn_headers(void *data, const char *key, const char *val) { + apr_table_t *headers = ((header_dptr*)data)->table; + apr_pool_t *pool = ((header_dptr*)data)->pool; const char *name; - char *next = apr_pstrdup(p, apr_table_get(headers, "Connection")); - - apr_table_unset(headers, "Proxy-Connection"); - if (!next) - return; - + char *next = apr_pstrdup(pool, val); while (*next) { name = next; while (*next && !apr_isspace(*next) && (*next != ',')) { ++next; } while (*next && (apr_isspace(*next) || (*next == ','))) { - *next = '\0'; - ++next; + *next++ = '\0'; } apr_table_unset(headers, name); } + return 1; +} +static void ap_proxy_clear_connection(apr_pool_t *p, apr_table_t *headers) +{ + header_dptr x; + x.pool = p; + x.table = headers; + apr_table_unset(headers, "Proxy-Connection"); + apr_table_do(clear_conn_headers, &x, headers, "Connection", NULL); apr_table_unset(headers, "Connection"); } - static void add_te_chunked(apr_pool_t *p, apr_bucket_alloc_t *bucket_alloc, apr_bucket_brigade *header_brigade) -- 2.47.2