From: Jim Jagielski Date: Wed, 15 Feb 2006 16:44:42 +0000 (+0000) Subject: *) mod_proxy: Fix KeepAlives not being allowed and set to X-Git-Tag: 2.3.0~2544 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d05d878779e6b84ffa4e610f95147699ae16899c;p=thirdparty%2Fapache%2Fhttpd.git *) mod_proxy: Fix KeepAlives not being allowed and set to backend servers. PR38602. [Ruediger Pluem, Jim Jagielski] Also, document previous patch: *) Correctly initialize mod_proxy workers, which use a combination of local and shared datasets. Adjust logging to better trace usage. PR38403. [Jim Jagielski] git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@378032 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 86780ab1c33..1de0f3cbad9 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,13 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) mod_proxy: Fix KeepAlives not being allowed and set to + backend servers. PR38602. [Ruediger Pluem, Jim Jagielski] + + *) Correctly initialize mod_proxy workers, which use a + combination of local and shared datasets. Adjust logging + to better trace usage. PR38403. [Jim Jagielski] + *) Respect GracefulShutdownTimeout in the worker and event MPMs. [Chris Darroch , Garrett Rooney] diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index f1bb31d4352..4d59be05ed5 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -981,9 +981,18 @@ apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, /* Yes I hate gotos. This is the subrequest shortcut */ skip_body: - /* Handle Connection: header */ - if (!force10 && p_conn->close) { - buf = apr_pstrdup(p, "Connection: close" CRLF); + /* + * Handle Connection: header if we do HTTP/1.1 request: + * If we plan to close the backend connection sent Connection: close + * otherwise sent Connection: Keep-Alive. + */ + if (!force10) { + if (p_conn->close) { + buf = apr_pstrdup(p, "Connection: close" CRLF); + } + else { + buf = apr_pstrdup(p, "Connection: Keep-Alive" CRLF); + } ap_xlate_proto_to_ascii(buf, strlen(buf)); e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(header_brigade, e); @@ -1510,12 +1519,6 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, /* found the last brigade? */ if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) { - /* if this is the last brigade, cleanup the - * backend connection first to prevent the - * backend server from hanging around waiting - * for a slow client to eat these bytes - */ - backend->close = 1; /* signal that we must leave */ finish = TRUE; } @@ -1584,18 +1587,7 @@ static apr_status_t ap_proxy_http_cleanup(const char *scheme, request_rec *r, proxy_conn_rec *backend) { - /* If there are no KeepAlives, or if the connection has been signalled - * to close, close the socket and clean up - */ - - /* if the connection is < HTTP/1.1, or Connection: close, - * we close the socket, otherwise we leave it open for KeepAlive support - */ - if (backend->close || (r->proto_num < HTTP_VERSION(1,1))) { - backend->close_on_recycle = 1; - ap_set_module_config(r->connection->conn_config, &proxy_http_module, NULL); - ap_proxy_release_connection(scheme, backend, r->server); - } + ap_proxy_release_connection(scheme, backend, r->server); return OK; } @@ -1673,26 +1665,13 @@ static int proxy_http_handler(request_rec *r, proxy_worker *worker, "proxy: HTTP: serving URL %s", url); - /* only use stored info for top-level pages. Sub requests don't share - * in keepalives - */ - if (!r->main) { - backend = (proxy_conn_rec *) ap_get_module_config(c->conn_config, - &proxy_http_module); - } /* create space for state information */ - if (!backend) { - if ((status = ap_proxy_acquire_connection(proxy_function, &backend, - worker, r->server)) != OK) - goto cleanup; + if ((status = ap_proxy_acquire_connection(proxy_function, &backend, + worker, r->server)) != OK) + goto cleanup; - if (!r->main) { - ap_set_module_config(c->conn_config, &proxy_http_module, backend); - } - } backend->is_ssl = is_ssl; - backend->close_on_recycle = 1; /* Step One: Determine Who To Connect To */ if ((status = ap_proxy_determine_connection(p, r, conf, worker, backend, @@ -1732,10 +1711,8 @@ static int proxy_http_handler(request_rec *r, proxy_worker *worker, cleanup: if (backend) { - if (status != OK) { + if (status != OK) backend->close = 1; - backend->close_on_recycle = 1; - } ap_proxy_http_cleanup(proxy_function, r, backend); } return status; diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index be4db5abd1b..a52a146b839 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1868,16 +1868,6 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, conn->hostname = apr_pstrdup(conn->pool, uri->hostname); conn->port = uri->port; } - } - /* - * TODO: add address cache for generic forward proxies. - * At least level 0 -> compare with previous hostname:port - */ - if (r->proxyreq == PROXYREQ_PROXY || r->proxyreq == PROXYREQ_REVERSE || - !worker->is_address_reusable) { - /* - * TODO: Check if the connection can be reused - */ if (conn->connection) { if (conn->sock) { apr_socket_close(conn->sock);