Attached is a patch that should allow ap_get_brigade() modules to
determine EOS on the same roundtrip as the last read of the request
body contents.

Right now, the caller won't receive an EOS.  Coupled with our useless
r->remaining req_rec member, there is no way to determine if there is
no data left to read.

With this patch, pulling a small (say, 200 byte) POST request will
now return the 200 byte bucket, plus the EOS bucket signifying that
we have nothing left to read from the client.

I don't have any immediate proposal on chunked post bodies, but this
should be considered separately any ways.

Bill

Index: CHANGES
===================================================================
RCS file: /home/cvs/httpd-2.0/CHANGES,v
retrieving revision 1.868
diff -u -r1.868 CHANGES
--- CHANGES     17 Jul 2002 17:55:58 -0000      1.868
+++ CHANGES     17 Jul 2002 18:43:16 -0000
@@ -1,5 +1,10 @@
 Changes with Apache 2.0.40
 
+  *) Modified the HTTP_IN filter to immediately append the EOS (end of
+     stream) bucket for C-L POST bodies, saving a roundtrip and allowing
+     the caller to determine that no content remains without prefetching
+     additional POST body.  [William Rowe]
+
   *) Get proxy ftp to work over IPv6.  [Shoichi Sakane <[EMAIL PROTECTED]>]
 
   *) Look for OpenSSL libraries in /usr/lib64.  [Peter Poeml <[EMAIL PROTECTED]>]
Index: modules/http/http_protocol.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/http/http_protocol.c,v
retrieving revision 1.448
diff -u -r1.448 http_protocol.c
--- modules/http/http_protocol.c        17 Jul 2002 13:50:26 -0000      1.448
+++ modules/http/http_protocol.c        17 Jul 2002 18:43:22 -0000
@@ -1025,6 +1025,14 @@
         ctx->remaining -= totalread;
     }
 
+    /* If we have no more bytes remaining on a C-L request, 
+     * save the callter a roundtrip to discover EOS.
+     */
+    if (ctx->state == BODY_LENGTH && ctx->remaining == 0) {
+        e = apr_bucket_eos_create(f->c->bucket_alloc);
+        APR_BRIGADE_INSERT_TAIL(b, e);
+    }
+
     /* We have a limit in effect. */
     if (ctx->limit) {
         /* FIXME: Note that we might get slightly confused on chunked inputs



Reply via email to