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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user