Commit f1abc1c3 authored by Justin Erenkrantz's avatar Justin Erenkrantz
Browse files

Allow the core input filter to handle AP_NONBLOCK_READ request for a

finite number of bytes (i.e. *readbytes > 0).

ap_brigade_partition does a blocking read.  So, what we should do is
apr_bucket_read on the socket for non-blocking.  If we get less than
what they asked for, that's okay and we should just return that amount.
If they were non-blocking, we should always be non-blocking.

Ryan, Greg, and others can figure out if ap_brigade_partition should
be tweaked to handle AP_NONBLOCK_READ natively.  I'm of a mixed mind,
but this addresses the short term need.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@91312 13f79535-47bb-0310-9956-ffa450edef68
parent b75b6c0a
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -2853,7 +2853,16 @@ static int core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, ap_input_mod
        apr_bucket *e;
        apr_bucket_brigade *newbb;

        if (mode == APR_NONBLOCK_READ) {
            e = APR_BRIGADE_FIRST(ctx->b);
            rv = apr_bucket_read(e, &str, &len, mode);

            if (len < *readbytes)
                *readbytes = len;
        }

        apr_brigade_partition(ctx->b, *readbytes, &e);

        /* Must do split before CONCAT */
        newbb = apr_brigade_split(ctx->b, e);
        APR_BRIGADE_CONCAT(b, ctx->b);