]> granicus.if.org Git - apache/commitdiff
Fix case where a shared keepalive connection results in
authorJim Jagielski <jim@apache.org>
Tue, 29 Nov 2005 15:05:16 +0000 (15:05 +0000)
committerJim Jagielski <jim@apache.org>
Tue, 29 Nov 2005 15:05:16 +0000 (15:05 +0000)
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

modules/proxy/proxy_util.c

index 96a743eadc01f20d791222681dabd0f28bdeac26..8d49f82f2c4864ee6308d9a2fabaa78c0ccbd71b 100644 (file)
@@ -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;
         }
     }