From: Ryan Bloom Date: Thu, 5 Oct 2000 22:40:28 +0000 (+0000) Subject: Modify ap_get_client_block to use the bucket brigades instead of BUFF. X-Git-Tag: APACHE_2_0_ALPHA_7~39 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1999084b360ca0da1615415542ac1a45a2155fa7;p=apache Modify ap_get_client_block to use the bucket brigades instead of BUFF. I'm pretty sure this isn't complete, but it has worked in my tests with a very simple CGI. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86410 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/http/http_protocol.c b/modules/http/http_protocol.c index 645459e056..3ae2198bcd 100644 --- a/modules/http/http_protocol.c +++ b/modules/http/http_protocol.c @@ -2354,17 +2354,37 @@ API_EXPORT(long) ap_get_client_block(request_rec *r, char *buffer, int bufsiz) long chunk_start = 0; long max_body; apr_status_t rv; + apr_int32_t timeout; + if (!r->read_chunked) { /* Content-length read */ + ap_bucket *b; + const char *tempbuf; + len_to_read = (r->remaining > bufsiz) ? bufsiz : r->remaining; - rv = ap_bread(r->connection->client, buffer, len_to_read, &len_read); - if (len_read == 0) { /* error or eof */ + if (AP_BRIGADE_EMPTY(r->connection->input_data)) { + apr_getsocketopt(r->connection->client->bsock, APR_SO_TIMEOUT, &timeout); + apr_setsocketopt(r->connection->client->bsock, APR_SO_TIMEOUT, 0); + rv = ap_get_brigade(r->connection->input_filters, r->connection->input_data); + apr_setsocketopt(r->connection->client->bsock, APR_SO_TIMEOUT, timeout); + } + if (AP_BRIGADE_EMPTY(r->connection->input_data)) { if (rv != APR_SUCCESS) { r->connection->keepalive = -1; return -1; } return 0; } + b = AP_BRIGADE_FIRST(r->connection->input_data); + len_read = len_to_read; + rv = b->read(b, &tempbuf, &len_read, 0); + if (len_read < b->length) { + b->split(b, len_read); + } + memcpy(buffer, tempbuf, len_read); + AP_BUCKET_REMOVE(b); + b->destroy(b); + r->read_length += len_read; r->remaining -= len_read; return len_read;