]> granicus.if.org Git - apache/commitdiff
Modify ap_get_client_block to use the bucket brigades instead of BUFF.
authorRyan Bloom <rbb@apache.org>
Thu, 5 Oct 2000 22:40:28 +0000 (22:40 +0000)
committerRyan Bloom <rbb@apache.org>
Thu, 5 Oct 2000 22:40:28 +0000 (22:40 +0000)
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

modules/http/http_protocol.c

index 645459e05681d05e9a6f00181bf365f97bbabc8d..3ae2198bcdf50d7143938fb66d77b09d4afb3446 100644 (file)
@@ -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;