On Jan 3, 2006, at 8:07 AM, Justin Erenkrantz wrote:

AFAICT, ap_read_async_request() on the branch can't handle a partial
line correctly.

Noting of course that ap_core_input_filter is 'cute' and masks EAGAIN.
 So, you'll never see EAGAIN from this code path!  As I said earlier,
the EAGAIN logic in httpd is completely suspect.

Furthermore, as I read it, ap_read_async_request is assuming that it
gets a complete line from getline_nonblocking - which almost certainly
won't be the case.  -- justin

I'm currently working on changing ap_core_input_filter so that it
doesn't mask the EAGAIN in AP_MODE_GETLINE mode.  There's
a catch, though:

    if (mode == AP_MODE_GETLINE) {
        /* we are reading a single LF line, e.g. the HTTP headers */
        rv = apr_brigade_split_line(b, ctx->b, block, HUGE_STRING_LEN);

if apr_brigade_split_line returns APR_EAGAIN, it will have
consumed the partial line and put it in b.  So if core_input_filter
returns rv at this point, the caller will receive the partial line and
EAGAIN.  We'll need to do one of two things:

- Buffer the partial line in ap_core_input_filter, by removing the
  buckets from b and putting them back at the start of ctx->b.

- Or buffer the partial line in getline_nonblocking (or read_partial_request).

Anybody have a preference among these options?

Brian

Reply via email to