From: dgaudet Date: Tue, 1 Jul 1997 01:37:09 +0000 (+0000) Subject: Added begun_read_body to request_rec so that subreqs and internal redirects X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3a476382670183a6a591d9d25811c6fb594bb9bf;p=thirdparty%2Fapache%2Fhttpd.git Added begun_read_body to request_rec so that subreqs and internal redirects 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 --- diff --git a/APACHE_1_2_X/src/CHANGES b/APACHE_1_2_X/src/CHANGES index 3ddd2d19ec2..da3a0c2b6ce 100644 --- a/APACHE_1_2_X/src/CHANGES +++ b/APACHE_1_2_X/src/CHANGES @@ -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] diff --git a/APACHE_1_2_X/src/include/httpd.h b/APACHE_1_2_X/src/include/httpd.h index deea1f015d4..24fd9083581 100644 --- a/APACHE_1_2_X/src/include/httpd.h +++ b/APACHE_1_2_X/src/include/httpd.h @@ -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 diff --git a/APACHE_1_2_X/src/main/http_protocol.c b/APACHE_1_2_X/src/main/http_protocol.c index 9b7c4da6e80..681fdf60634 100644 --- a/APACHE_1_2_X/src/main/http_protocol.c +++ b/APACHE_1_2_X/src/main/http_protocol.c @@ -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); diff --git a/APACHE_1_2_X/src/main/http_request.c b/APACHE_1_2_X/src/main/http_request.c index ee34deb51a4..515b6c336bb 100644 --- a/APACHE_1_2_X/src/main/http_request.c +++ b/APACHE_1_2_X/src/main/http_request.c @@ -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));