You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Richard Reiner <rr...@fscinternet.com> on 2004/01/08 22:35:46 UTC

[PATCH] mod_proxy hangs on 304 from backend

mod_proxy hangs when both KeepAlive and ProxyErrorOverride are enabled, 
and a non-200 response without a body is generated by the backend 
server.

(e.g.: a client makes a request containing the "If-Modified-Since" and 
"If-None-Match" headers, to which the backend server respond with 
status 304.)

The following patch corrects this:

--- proxy_http.c        1 Jan 2004 13:26:21 -0000      1.176
+++ proxy_http.c        8 Jan 2004 18:24:09 -0000
@@ -992,7 +992,13 @@
              */
             int status = r->status;
             r->status = HTTP_OK;
-            ap_discard_request_body(rp);
+            /* Discard body, if one is expected */
+            if ((status > 199) && /* not any 1xx response */
+                (status != HTTP_NO_CONTENT) && /* not 204 */
+                (status != HTTP_RESET_CONTENT) && /* not 205 */
+                (status != HTTP_NOT_MODIFIED)) { /* not 304 */
+               ap_discard_request_body(rp);
+           }
             return status;
         }
     } else


Extra details for those who care:

Conditions:
- mod_proxy acting as a forward or reverse proxy
- KeepAlive On
- ProxyErrorOverride On
- Persistent connection to backend server
- backend server responds with a non-200 status
- backend server does not send a body

Details:
In proxy_http.c, ap_discard_request_body() is called on a request with 
a non-200 status when ProxyErrorOverride is enabled. 
ap_discard_request_body() eventually calls ap_http_filter() which, when 
called with a proxy response request_rec, attempts to read a body even 
when there is no indication that one exists (response bodies can be 
terminated with a connection close, instead of using a CL header or 
chunked encoding). However, on a persistent connection to the backend, 
the read blocks until a timeout occurs (apr_wait_for_io_or_timeout()).

(This patch was originally submitted by Graham Wiseman <gwiseman AT  
fscinternet.com>, but hasn't been committed...)

Thanks,

Richard


Re: [PATCH] mod_proxy hangs on 304 from backend

Posted by Bill Stoddard <bi...@wstoddard.com>.
Richard Reiner wrote:

> mod_proxy hangs when both KeepAlive and ProxyErrorOverride are enabled, 
> and a non-200 response without a body is generated by the backend 
> server.
> 

Commited to 2.1 and called a vote to backport to 2.0.

Thanks,
Bill