Commit 12bdf398 authored by dgaudet's avatar dgaudet
Browse files

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
parent 9c026382
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -30,6 +30,10 @@ Changes with Apache 1.2.1
     [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]

+1 −0
Original line number Diff line number Diff line
@@ -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
+4 −1
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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));