1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-08 15:02:10 +03:00

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
This commit is contained in:
Jim Jagielski
2005-11-29 15:05:16 +00:00
parent a2a903da53
commit 35f692c8fa

View File

@@ -1824,12 +1824,22 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
uri->fragment ? "#" : "", uri->fragment ? "#" : "",
uri->fragment ? uri->fragment : "", NULL); 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) { if (proxyname) {
conn->hostname = proxyname; conn->hostname = apr_pstrdup(conn->pool, proxyname);
conn->port = proxyport; conn->port = proxyport;
} else { } else {
conn->hostname = uri->hostname; conn->hostname = apr_pstrdup(conn->pool, uri->hostname);
conn->port = uri->port; conn->port = uri->port;
} }
} }