Yann Ylavic wrote:
> On Tue, May 13, 2014 at 9:20 AM, Ruediger Pluem <[email protected]> wrote:
>> Daniel Ruggeri wrote:
>>> On 5/12/2014 7:31 AM, Ruediger Pluem wrote:
>>>> While trying to use the failonstatus option of a balancer for the first 
>>>> time I noticed that it only works on status
>>>> codes provided by the backend not on status codes only set by the proxy 
>>>> (in my case a 502 because the backend timed
>>>> out). Is this intentional?
>>>
>>> Hi, Ruediger;
>>>    Yes, that was the original goal. The use case I was tackling was a
>>> case where a backend application server started accepting HTTP requests
>>> before the Servlets had all completed init(). In that case, the backend
>>> returns a 503.
>>
>> But in case we do ProxyErrorOverride this also fails, because r->status is 
>> set to HTTP_OK then. Wouldn't it be better to
>> take care of this and my case, so that the worker is set into error mode in 
>> this case as well?
>> Or do you think that this would destroy wanted behavior?
> 
> It makes sense to set the worker in error based only on the remote
> status, proxy error (connect, timeout...) is a different criterion
> that may break things...
> But clearly one should be able to also include proxy errors
> (optionally, eg. failonproxyerror=on/off).
> 
> The ProxyErrorOverride case is orthogonal imho, although it should be
> fixed to work with failonstatus.

No really. The issue with ProxyErrorOverride and proxy generated errors is the 
same: r->status is set to HTTP_OK and and
this is the only source available for failonstatus to check. To supply the 
access_status available in proxy_handler
we would need to change the API as we would need an additional parameter to 
ap_proxy_post_request. This is something
I would like to avoid. I was thinking around something like the following:

Index: mod_proxy.c
===================================================================
--- mod_proxy.c (revision 1593906)
+++ mod_proxy.c (working copy)
@@ -1200,8 +1200,21 @@
         goto cleanup;
     }
 cleanup:
+    {
+        int saved_status;
+
+        saved_status = r->status;
+        r->status = access_status;
     ap_proxy_post_request(worker, balancer, r, conf);
+        /*
+         * Only restore r->status if it has not been changed by
+         * ap_proxy_post_request
+         */
+        if (r->status == access_status) {
+            r->status = saved_status;
+        }

+    }
     proxy_run_request_status(&access_status, r);
     AP_PROXY_RUN_FINISHED(r, attempts, access_status);



Regards

RĂ¼diger

Reply via email to