2016-08-02 15:23 GMT+02:00 Yann Ylavic <ylavic....@gmail.com>:

> On Tue, Aug 2, 2016 at 2:59 PM, Luca Toscano <toscano.l...@gmail.com>
> wrote:
> >
> > 2016-08-02 10:48 GMT+02:00 Yann Ylavic <ylavic....@gmail.com>:
> >>
> >> What I don't know is whether or not we need to read AP_FCGI_END_REQUEST
> >> anyway?
> >> If that's the case, we should indeed not break until then, and
> >> conn->close=1+done+break if we read anything else before.
> >
> > But wouldn't this be like reading the whole response (headers +
> > message-body) and then discard what not needed? I am not getting how
> would
> > we get to the AP_FCGI_END_REQUEST bytes without reading the other ones.
>
> Actually I don't know if (but I now suppose that) the end of the
> response for the current current is marked by AP_FCGI_END_REQUEST,
> irrespective of the HTTP status code.
>

I will do some research but afaik it should be always present. Any other
opinion from the list?


> If that's correct, we indeed shouldn't break until we got
> AP_FCGI_END_REQUEST, so that we can reuse the connection when all goes
> well.
>

This was exactly what I way trying to do with this commit, but only when
the connection is reused. It has an annoying downside, like introducing a
bit of latency between the HTTP headers flush to the client and the end of
the request for the use case described below (but it works well).


> But since it's a 304 (or a 204 which should be handled the same here),
> we don't expect any body between the header and AP_FCGI_END_REQUEST,
> so if that happens (something else than AP_FCGI_END_REQUEST is read
> while ignore_body == 1), we must bail out with conn->close=1 to avoid
> reusing the connection for any further request.
> If the response header has not been forwarded already, we could either
> respond with a BAD_GATEWAY instead or forward it before leaving
> (possibly be lenient with CGIs).
>

There is one case in which a mod_proxy_fcgi returns a 304 but there is also
body to read/process, namely when a "regular" FCGI response is returned by
a backend script with a Last-Modified header and the client uses something
like If-Modified-Since. In this case ap_scan_script_header_err_brigade_ex
(through ap_scan_script_header_err_core_ex -> ap_meets_conditions) sets the
"status" variable in mod_proxy_fcgi to HTTP_NOT_MODIFIED, but the
message-body has been sent anyway. I am not sure if the FCGI script would
be in violation of the RFC behaving like this but if not it is a valid use
case.

In any case we must not forward any body bytes to the client (with
> 304/204) or reuse this out of sync connection with the backend later.
>

+1,  I agree 100%


Regards,

Luca

Reply via email to