On Wed, Nov 19, 2014 at 8:19 AM,  <[email protected]> wrote:
> Author: jkaluza
> Date: Wed Nov 19 07:19:13 2014
> New Revision: 1640495
>
> URL: http://svn.apache.org/r1640495
> Log:
> * mod_proxy_fcgi: Ignore body data from backend for 304 responses. PR 57198.
>
> Modified:
>     httpd/httpd/trunk/modules/proxy/mod_proxy_fcgi.c
>
[]
> --- httpd/httpd/trunk/modules/proxy/mod_proxy_fcgi.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_fcgi.c Wed Nov 19 07:19:13 2014
> @@ -369,7 +369,7 @@ static apr_status_t dispatch(proxy_conn_
>                               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;
> @@ -579,9 +579,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;
>                              }
>

There seems to be another case below this point where we "Send the
part of the body that we read while reading the headers" (as the
comment says), with no !ignore_body check.

Also, the backend may use a "Status: 304 Not Modified" header, which
would not result in ap_scan_script_header_err_brigade_ex() returning
that status but setting it to r->status.
So, more generally, shouldn't we check both
ap_scan_script_header_err_brigade_ex()'s returned status AND r->status
against 304 to ignore the body (ie. bypass ap_pass_brigade() for
anything but EOS)?

Regards,
Yann.

Reply via email to