From: Paul Querna Date: Sat, 1 Apr 2006 06:54:11 +0000 (+0000) Subject: Merge r377053, r377057 and r377525 from trunk, fixing several issues with mod_proxy_h... X-Git-Tag: 2.2.1~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=40f57ebb46c99672e17f7283b206d74e31588105;p=thirdparty%2Fapache%2Fhttpd.git Merge r377053, r377057 and r377525 from trunk, fixing several issues with mod_proxy_http and keep-alive headers. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@390608 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index bf62e8a24b9..87742c066ec 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,9 @@ Changes with Apache 2.2.1 made to ap_escape_html so we escape quotes. Reported by JPCERT. [Mark Cox] + *) mod_proxy_http: Send HTTP Keep-Alive Headers. PR 38524. + [Rüdiger Plüm, Joe Orton] + *) mod_disk_cache: Return the correct error codes from bucket read failures, instead of APR_EGENERAL. [Brian Akins ] diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index 4b98da51390..4d59be05ed5 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -595,6 +595,7 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, apr_off_t bytes_read = 0; apr_off_t bytes; int force10; + apr_table_t *headers_in_copy; header_brigade = apr_brigade_create(p, origin->bucket_alloc); @@ -602,23 +603,6 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, * Send the HTTP/1.1 request to the remote server */ - /* strip connection listed hop-by-hop headers from the request */ - /* even though in theory a connection: close coming from the client - * should not affect the connection to the server, it's unlikely - * that subsequent client requests will hit this thread/process, - * so we cancel server keepalive if the client does. - */ - if (ap_proxy_liststr(apr_table_get(r->headers_in, - "Connection"), "close")) { - p_conn->close++; - /* XXX: we are abusing r->headers_in rather than a copy, - * give the core output handler a clue the client would - * rather just close. - */ - c->keepalive = AP_CONN_CLOSE; - } - ap_proxy_clear_connection(p, r->headers_in); - if (apr_table_get(r->subprocess_env, "force-proxy-request-1.0")) { buf = apr_pstrcat(p, r->method, " ", url, " HTTP/1.0" CRLF, NULL); force10 = 1; @@ -736,9 +720,22 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, r->server->server_hostname); } - /* send request headers */ proxy_run_fixups(r); - headers_in_array = apr_table_elts(r->headers_in); + /* + * Make a copy of the headers_in table before clearing the connection + * headers as we need the connection headers later in the http output + * filter to prepare the correct response headers. + * + * Note: We need to take r->pool for apr_table_copy as the key / value + * pairs in r->headers_in have been created out of r->pool and + * p might be (and actually is) a longer living pool. + * This would trigger the bad pool ancestry abort in apr_table_copy if + * apr is compiled with APR_POOL_DEBUG. + */ + headers_in_copy = apr_table_copy(r->pool, r->headers_in); + ap_proxy_clear_connection(p, headers_in_copy); + /* send request headers */ + headers_in_array = apr_table_elts(headers_in_copy); headers_in = (const apr_table_entry_t *) headers_in_array->elts; for (counter = 0; counter < headers_in_array->nelts; counter++) { if (headers_in[counter].key == NULL