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