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
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]
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
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;
}
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))
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);
*/
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));