diff --git a/CHANGES b/CHANGES index c78b4e01f2..8764bddc03 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.3.0 [ When backported to 2.2.x, remove entry from this file ] + *) mod_proxy_http: Introduce environment variable proxy-initial-not-pooled to + avoid reusing pooled connections if the client connection is an initial + connection. PR 37770. [Ruediger Pluem] + *) mod_proxy: Add connectiontimeout parameter for proxy workers in order to be able to set the timeout for connecting to the backend separately. PR 45445. [Ruediger Pluem, rahul ] diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index c7be88ff71..4b99128442 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -1927,6 +1927,19 @@ static int proxy_http_handler(request_rec *r, proxy_worker *worker, ap_proxy_ssl_connection_cleanup(backend, r); } + /* + * In the case that we are handling a reverse proxy connection and this + * is not a request that is coming over an already kept alive connection + * with the client, do NOT reuse the connection to the backend, because + * we cannot forward a failure to the client in this case as the client + * does NOT expects this in this situation. + * Yes, this creates a performance penalty. + */ + if ((r->proxyreq == PROXYREQ_REVERSE) && (!c->keepalives) + && (apr_table_get(r->subprocess_env, "proxy-initial-not-pooled"))) { + backend->close = 1; + } + /* Step One: Determine Who To Connect To */ if ((status = ap_proxy_determine_connection(p, r, conf, worker, backend, uri, &url, proxyname, diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 2a55c5bcac..fd46206ebe 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -2167,6 +2167,11 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, else { conn->addr = worker->cp->addr; } + /* Close a possible existing socket if we are told to do so */ + if (conn->close) { + socket_cleanup(conn); + conn->close = 0; + } if (err != APR_SUCCESS) { return ap_proxyerror(r, HTTP_BAD_GATEWAY,