From: Ruediger Pluem Date: Thu, 6 Oct 2005 21:30:58 +0000 (+0000) Subject: Merge r293123, r293293 from trunk: X-Git-Tag: 2.1.9~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4dddfbc7d8f4797741952ab4cded799591db8b4;p=thirdparty%2Fapache%2Fhttpd.git Merge r293123, r293293 from trunk: * run the request_status hook in proxy_handler if HTTP_SERVICE_UNAVAILABLE is returned by ap_proxy_pre_request. Suggested by: Brian Akins , Mladen Turk Reviewed by: Jim Jagielski git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@306900 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index ea7f7be622c..65c62b1ee2b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.1.9 + *) mod_proxy: Run the request_status hook also if there are no free workers + or all workers are in error state. + [Ruediger Pluem, Brian Akins ] + *) mod_proxy_connect: Fix high CPU loop on systems like UnixWare which trigger POLL_ERR or POLL_HUP on a terminated connection. PR 36951. [Jeff Trawick, Ruediger Pluem] diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index f49493a25ee..568c9be777e 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -679,8 +679,22 @@ static int proxy_handler(request_rec *r) char *url = uri; /* Try to obtain the most suitable worker */ access_status = ap_proxy_pre_request(&worker, &balancer, r, conf, &url); - if (access_status != OK) - return access_status; + if (access_status != OK) { + /* + * Only return if access_status is not HTTP_SERVICE_UNAVAILABLE + * This gives other modules the chance to hook into the + * request_status hook and decide what to do in this situation. + */ + if (access_status != HTTP_SERVICE_UNAVAILABLE) + return access_status; + /* + * Ensure that balancer is NULL if worker is NULL to prevent + * potential problems in the post_request hook. + */ + if (!worker) + balancer = NULL; + goto cleanup; + } if (balancer && balancer->max_attempts_set && !max_attempts) max_attempts = balancer->max_attempts; /* firstly, try a proxy, unless a NoProxy directive is active */