From: Luca Toscano Date: Tue, 12 Jul 2016 21:13:37 +0000 (+0000) Subject: Force mod_proxy_fcgi to read the whole FCGI response X-Git-Tag: 2.5.0-alpha~1411 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3c4feb149b9ca8e71b4b820e173398c603c27c8;p=thirdparty%2Fapache%2Fhttpd.git Force mod_proxy_fcgi to read the whole FCGI response even when the content has not been modified (HTTP 304). The problem is described in PR 59838. This patch should avoid bogus reads causing the following issues with HTTP 304 responses: - AH01068: Got bogus version X, expected 1 - AH01069: Got bogus rid X, expected 1 - AH01075: Error dispatching request to : - HTTP 503 logged instead of 304 (even if the external client gets correctly a 304) As discussed on IRC the HTTP_PRECONDITION_FAILED use case should be handled like the HTTP_NOT_MODIFIED one but it will be done in a separate commit. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1752347 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index d5515d0aa0a..3a6bb8fd00b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_proxy_fcgi: read the whole FCGI response even when the content has + not been modified (HTTP 304) to avoid subsequent bougus reads and + confusing error messages logged. [Luca Toscano] + *) mod_http2: removing timeouts on master connection while requests are being processed. Requests may timeout, but the master only times out when no more requests are active. [Stefan Eissing] diff --git a/modules/proxy/mod_proxy_fcgi.c b/modules/proxy/mod_proxy_fcgi.c index 1be9a091f85..7737642806c 100644 --- a/modules/proxy/mod_proxy_fcgi.c +++ b/modules/proxy/mod_proxy_fcgi.c @@ -658,18 +658,24 @@ recv_again: rv = ap_pass_brigade(r->output_filters, ob); if (rv != APR_SUCCESS) { *err = "passing headers brigade to output filters"; + break; } else if (status == HTTP_NOT_MODIFIED) { /* The 304 response MUST NOT contain - * a message-body, ignore it. */ + * a message-body, ignore it. + * The break is not added since there might + * be more bytes to read from the FCGI + * connection. Even if the message-body is + * ignored we want to avoid subsequent + * bogus reads. */ ignore_body = 1; } else { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01070) "Error parsing script headers"); rv = APR_EINVAL; + break; } - break; } if (conf->error_override &&