From 685cf698b7329e7ef2aa45178813efe7457bd0c1 Mon Sep 17 00:00:00 2001 From: Christophe Jaillet Date: Fri, 9 Jan 2015 21:33:12 +0000 Subject: [PATCH] Merge r1640495, r1644031 from trunk * mod_proxy_fcgi: Ignore body data from backend for 304 responses. PR 57198. Submitted by: jkaluza Reviewed by: jkaluza, ylavic, covener Backported by: jailletc36 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1650677 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ STATUS | 6 ------ modules/proxy/mod_proxy_fcgi.c | 19 +++++++++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 689a888378..6856108527 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,9 @@ Changes with Apache 2.4.11 request headers earlier. Adds "MergeTrailers" directive to restore legacy behavior. [Edward Lu, Yann Ylavic, Joe Orton, Eric Covener] + *) mod_proxy_fcgi: Ignore body data from backend for 304 responses. PR 57198. + [Jan Kaluza] + *) mod_ssl: Do not crash when looking up SSL related variables during expression evaluation on non SSL connections. PR 57070 [Ruediger Pluem] diff --git a/STATUS b/STATUS index 1cc9042203..04070ab98b 100644 --- a/STATUS +++ b/STATUS @@ -104,12 +104,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_proxy_fcgi: Ignore body data from backend for 304 responses. PR 57198. - trunk patch: http://svn.apache.org/r1640495 - http://svn.apache.org/r1644031 - 2.4.x patch: trunk works - +1 jkaluza, ylavic, covener - * mod_cgi: Log CGI script stderr to ScriptLog, use APLOGNO for log_scripterror errors. trunk patch: http://svn.apache.org/r1626978 diff --git a/modules/proxy/mod_proxy_fcgi.c b/modules/proxy/mod_proxy_fcgi.c index ac8e920667..a261b6762a 100644 --- a/modules/proxy/mod_proxy_fcgi.c +++ b/modules/proxy/mod_proxy_fcgi.c @@ -367,7 +367,7 @@ static apr_status_t dispatch(proxy_conn_rec *conn, proxy_dir_conf *conf, const char **err) { apr_bucket_brigade *ib, *ob; - int seen_end_of_headers = 0, done = 0; + int seen_end_of_headers = 0, done = 0, ignore_body = 0; apr_status_t rv = APR_SUCCESS; int script_error_status = HTTP_OK; conn_rec *c = r->connection; @@ -577,9 +577,16 @@ recv_again: APR_BRIGADE_INSERT_TAIL(ob, tmp_b); r->status = status; ap_pass_brigade(r->output_filters, ob); - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01070) - "Error parsing script headers"); - rv = APR_EINVAL; + if (status == HTTP_NOT_MODIFIED) { + /* The 304 response MUST NOT contain + * a message-body, ignore it. */ + ignore_body = 1; + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01070) + "Error parsing script headers"); + rv = APR_EINVAL; + } break; } @@ -598,7 +605,7 @@ recv_again: } if (script_error_status == HTTP_OK - && !APR_BRIGADE_EMPTY(ob)) { + && !APR_BRIGADE_EMPTY(ob) && !ignore_body) { /* Send the part of the body that we read while * reading the headers. */ @@ -626,7 +633,7 @@ recv_again: * but that could be a huge amount of data; so we pass * along smaller chunks */ - if (script_error_status == HTTP_OK) { + if (script_error_status == HTTP_OK && !ignore_body) { rv = ap_pass_brigade(r->output_filters, ob); if (rv != APR_SUCCESS) { *err = "passing brigade to output filters"; -- 2.40.0