Re: svn commit: r1615289 - in /httpd/httpd/trunk: CHANGES modules/proxy/mod_proxy_http.c
Am 21.08.2014 um 14:57 schrieb Yann Ylavic: On Sat, Aug 2, 2014 at 10:24 AM, rj...@apache.org wrote: Author: rjung Date: Sat Aug 2 08:24:35 2014 New Revision: 1615289 URL: http://svn.apache.org/r1615289 Log: PR53420: Proxy responses with error status and ProxyErrorOverride On hang until proxy timeout. Regression from 2.2. It was introduced by r912063 in order to fix PR41646. Modified: httpd/httpd/trunk/CHANGES httpd/httpd/trunk/modules/proxy/mod_proxy_http.c [...] Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_http.c URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_http.c?rev=1615289r1=1615288r2=1615289view=diff == --- httpd/httpd/trunk/modules/proxy/mod_proxy_http.c (original) +++ httpd/httpd/trunk/modules/proxy/mod_proxy_http.c Sat Aug 2 08:24:35 2014 @@ -1637,6 +1637,18 @@ int ap_proxy_http_process_response(apr_p if (!r-header_only /* not HEAD request */ (proxy_status != HTTP_NO_CONTENT) /* not 204 */ (proxy_status != HTTP_NOT_MODIFIED)) { /* not 304 */ +const char *tmp; +/* Add minimal headers needed to allow http_in filter + * detecting end of body without waiting for a timeout. */ +if ((tmp = apr_table_get(r-headers_out, Content-Length))) { +apr_table_set(backend-r-headers_in, Content-Length, tmp); +} +else if ((tmp = apr_table_get(r-headers_out, Transfer-Encoding))) { +apr_table_set(backend-r-headers_in, Transfer-Encoding, tmp); +} +else if (te) { +apr_table_set(backend-r-headers_in, Transfer-Encoding, te); +} Shouldn't these tests be in reverse order, ie. : if ((tmp = apr_table_get(r-headers_out, Transfer-Encoding))) { ... } else if ((tmp = apr_table_get(r-headers_out, Content-Length))) { ... } else if (te) { ... } ? This is what http_in filter does, since according to the RFC, when both TE and CL are there, the former wins. I'm not sure it can happen because mod_proxy_http removes the CL above in this case, but OTOH the code and comment below suggest r-headers_out may change in between, so we probably want to be safe about possible response splitting... Thanks for the review Yann. Fixed in r1620324 and added to backport proposal. Regards, Rainer
Re: svn commit: r1615289 - in /httpd/httpd/trunk: CHANGES modules/proxy/mod_proxy_http.c
On Sat, Aug 2, 2014 at 10:24 AM, rj...@apache.org wrote: Author: rjung Date: Sat Aug 2 08:24:35 2014 New Revision: 1615289 URL: http://svn.apache.org/r1615289 Log: PR53420: Proxy responses with error status and ProxyErrorOverride On hang until proxy timeout. Regression from 2.2. It was introduced by r912063 in order to fix PR41646. Modified: httpd/httpd/trunk/CHANGES httpd/httpd/trunk/modules/proxy/mod_proxy_http.c [...] Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_http.c URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_http.c?rev=1615289r1=1615288r2=1615289view=diff == --- httpd/httpd/trunk/modules/proxy/mod_proxy_http.c (original) +++ httpd/httpd/trunk/modules/proxy/mod_proxy_http.c Sat Aug 2 08:24:35 2014 @@ -1637,6 +1637,18 @@ int ap_proxy_http_process_response(apr_p if (!r-header_only /* not HEAD request */ (proxy_status != HTTP_NO_CONTENT) /* not 204 */ (proxy_status != HTTP_NOT_MODIFIED)) { /* not 304 */ +const char *tmp; +/* Add minimal headers needed to allow http_in filter + * detecting end of body without waiting for a timeout. */ +if ((tmp = apr_table_get(r-headers_out, Content-Length))) { +apr_table_set(backend-r-headers_in, Content-Length, tmp); +} +else if ((tmp = apr_table_get(r-headers_out, Transfer-Encoding))) { +apr_table_set(backend-r-headers_in, Transfer-Encoding, tmp); +} +else if (te) { +apr_table_set(backend-r-headers_in, Transfer-Encoding, te); +} Shouldn't these tests be in reverse order, ie. : if ((tmp = apr_table_get(r-headers_out, Transfer-Encoding))) { ... } else if ((tmp = apr_table_get(r-headers_out, Content-Length))) { ... } else if (te) { ... } ? This is what http_in filter does, since according to the RFC, when both TE and CL are there, the former wins. I'm not sure it can happen because mod_proxy_http removes the CL above in this case, but OTOH the code and comment below suggest r-headers_out may change in between, so we probably want to be safe about possible response splitting... Regards, Yann.