Checkout
Yann Ylavic
committed
on 24 Jul 18
mod_proxy_http: forward 100-continue.

Handle end-to-end 100-continue, according to RFC 7231, such that the client
request body is not read/… Show more
mod_proxy_http: forward 100-continue.

Handle end-to-end 100-continue, according to RFC 7231, such that the client

request body is not read/forwarded (according to its "Expect:" header) until

the backend wants to receive it (with interim 100 continue response), or never

forwarded if the backend provides a (non-interim) response and doesn't need

the client body at all.

This is achieved by filling the header_brigade in ap_proxy_http_prefetch()

and letting ap_proxy_http_request() determine whether it should forward that

brigade only (with the "Expect: 100-continue" specified by the client or added

according to "ping=" configuration), or forward the whole body for the usual

case (as before).

When 100-continue expectation is in place, the body is actually forwarded by

ap_proxy_http_process_response() when/if a "100 continue" response is sent by

the backend, otherwise the body is discarded; a future enhancement could make

so that in a balancer configuration, the body could be forwarded to another

balancer member depending on the status/error from the backend.

So stream_reqbody_cl() and stream_reqbody_chunked() functions are adapted to be

called by either ap_proxy_http_request() or ap_proxy_http_process_response(),

while spool_reqbody_cl() still spools the body in ap_proxy_http_prefetch() thus

before the backend is connected/reused to avoid inactivity on the connection

for the prefetch time (the prefetched body is also forwarded according to the

100-continue expectation, though).

Also, since the brigades and other runtime objects now need to be shared by the

ap_proxy_http_*() functions chain, a proxy_http_req_t struct/context is created

from the start and passed to them as (the single) argument. This is also a good

candidate for a future async baton, if we wanted to let the MPM event wait for

connection data for us at any stage and be called back ;)

Finally, ap_send_interim_response() is modified to correcly handle 100 continue

responses once, and take care of clearing r->expecting_100 only for them.

PR 60330.

Show less