From: Jim Jagielski Date: Tue, 29 Nov 2005 15:05:16 +0000 (+0000) Subject: Fix case where a shared keepalive connection results in X-Git-Tag: 2.3.0~2724 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=35f692c8fad03366fc5ffdc676f36c5ce8b05e69;p=apache Fix case where a shared keepalive connection results in different workers from being accessed. Try to be wise and fast about the tests before we do the expensive string comparison. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@349723 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 96a743eadc..8d49f82f2c 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1824,12 +1824,22 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, uri->fragment ? "#" : "", uri->fragment ? uri->fragment : "", NULL); } - if (!worker->is_address_reusable) { + /* + * If a single keepalive connection triggers different workers, + * then we have a problem (we don't select the correct one). + * Do an expensive check in this case. + * + * TODO: Handle this much better... + */ + if (!worker->is_address_reusable || + (r->connection->keepalives && + (r->proxyreq == PROXYREQ_PROXY || r->proxyreq == PROXYREQ_REVERSE) && + (strcasecmp(conn->hostname, uri->hostname) != 0) ) ) { if (proxyname) { - conn->hostname = proxyname; + conn->hostname = apr_pstrdup(conn->pool, proxyname); conn->port = proxyport; } else { - conn->hostname = uri->hostname; + conn->hostname = apr_pstrdup(conn->pool, uri->hostname); conn->port = uri->port; } }