]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Added begun_read_body to request_rec so that subreqs and internal redirects
authordgaudet <dgaudet@unknown>
Tue, 1 Jul 1997 01:37:09 +0000 (01:37 +0000)
committerdgaudet <dgaudet@unknown>
Tue, 1 Jul 1997 01:37:09 +0000 (01:37 +0000)
won't try to read the request body twice.

Submitted by: Roy Fielding
Reviewed by:  Alexei Kosut, Dean Gaudet

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/1.3@78483 13f79535-47bb-0310-9956-ffa450edef68

APACHE_1_2_X/src/CHANGES
APACHE_1_2_X/src/include/httpd.h
APACHE_1_2_X/src/main/http_protocol.c
APACHE_1_2_X/src/main/http_request.c

index 3ddd2d19ec2d80434b43570efd1999ff4ffffc2b..da3a0c2b6ce4815dfdfd4e75b00458eb4763fcb9 100644 (file)
@@ -29,7 +29,11 @@ Changes with Apache 1.2.1
      lockfile in any location.  It previously defaulted to /usr/tmp/htlock.
      [Somehow it took four of us: Randy Terbush, Jim Jagielski, Dean Gaudet,
      Marc Slemko]
-  
+
+  *) Request processing now retains state of whether or not the request
+     body has been read, so that internal redirects and subrequests will
+     not try to read it twice (and block). [Roy Fielding]
+
   *) Add a placeholder in modules/Makefile to avoid errors with certain
      makes. [Marc Slemko]
 
index deea1f015d45392ab2c906f8088378ba24739310..24fd908358164c2200269ba9e915244ae49adf7c 100644 (file)
@@ -472,6 +472,7 @@ struct request_rec {
   long read_length;            /* bytes that have been read */
   int read_body;               /* how the request body should be read */
   int read_chunked;            /* reading chunked transfer-coding */
+  int begun_read_body;         /* false (0) until first get_client_block */
 
   /* MIME header environments, in and out.  Also, an array containing
    * environment variables to be passed to subprocesses, so people can
index 9b7c4da6e802fecbe315151e7002e32fb684fea3..681fdf606346bf2c41257c871e0070c7ddb9d8a9 100644 (file)
@@ -868,6 +868,7 @@ void set_sub_req_protocol (request_rec *rnew, const request_rec *r)
     
     rnew->read_length = r->read_length;
     rnew->read_body   = REQUEST_NO_BODY;
+    rnew->begun_read_body = r->begun_read_body;
     
     rnew->main = (request_rec *)r;
 }
@@ -1345,7 +1346,7 @@ int setup_client_block (request_rec *r, int read_policy)
 
 int should_client_block (request_rec *r)
 {
-    if (is_HTTP_ERROR(r->status))
+    if (r->begun_read_body || is_HTTP_ERROR(r->status))
         return 0;
 
     if (!r->read_chunked && (r->remaining <= 0))
@@ -1397,6 +1398,8 @@ long get_client_block (request_rec *r, char *buffer, int bufsiz)
     long len_read, len_to_read;
     long chunk_start = 0;
 
+    r->begun_read_body = 1;
+
     if (!r->read_chunked) {                 /* Content-length read */
         len_to_read = (r->remaining > bufsiz) ? bufsiz : r->remaining;
         len_read = bread(r->connection->client, buffer, len_to_read);
index ee34deb51a4b1715156a96ebb887778471286754..515b6c336bbf9da9b6cd011f5c18892cd9bb7c43 100644 (file)
@@ -1095,6 +1095,8 @@ request_rec *internal_internal_redirect (const char *new_uri, request_rec *r)
                                  */
     new->no_local_copy = r->no_local_copy;
 
+    new->begun_read_body = r->begun_read_body;  /* We can only read it once */
+
     ap_snprintf (t, sizeof(t), "%d", r->status);
     table_set (new->subprocess_env, "REDIRECT_STATUS", pstrdup (r->pool, t));