You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Roy T. Fielding" <fi...@kiwi.ICS.UCI.EDU> on 1997/07/01 04:41:51 UTC
Re: [PATCH] Maintain state of request body read across internal redirs
>> *) 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]
>
>Can't this same thing be gleaned from r->read_length without adding the
>new field? I haven't stared at Alexei's code enough though to say for
>sure.
Argh, yes, of course it can. I even wrote the r->read_length code, so
it's just a case of a few lost brain cells on my part. A new patch
against the current cvs HEAD is below.
.....Roy
Index: httpd.h
===================================================================
RCS file: /export/home/cvs/apache/src/httpd.h,v
retrieving revision 1.122
diff -c -r1.122 httpd.h
*** httpd.h 1997/07/01 01:13:42 1.122
--- httpd.h 1997/07/01 02:41:54
***************
*** 502,508 ****
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
--- 502,507 ----
Index: http_protocol.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_protocol.c,v
retrieving revision 1.130
diff -c -r1.130 http_protocol.c
*** http_protocol.c 1997/07/01 01:13:41 1.130
--- http_protocol.c 1997/07/01 02:41:54
***************
*** 871,877 ****
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;
}
--- 871,876 ----
***************
*** 1349,1355 ****
int should_client_block (request_rec *r)
{
! if (r->begun_read_body || is_HTTP_ERROR(r->status))
return 0;
if (!r->read_chunked && (r->remaining <= 0))
--- 1348,1354 ----
int should_client_block (request_rec *r)
{
! if (r->read_length || is_HTTP_ERROR(r->status))
return 0;
if (!r->read_chunked && (r->remaining <= 0))
***************
*** 1400,1407 ****
int c;
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;
--- 1399,1404 ----
Index: http_request.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_request.c,v
retrieving revision 1.55
diff -c -r1.55 http_request.c
*** http_request.c 1997/07/01 01:13:42 1.55
--- http_request.c 1997/07/01 02:41:54
***************
*** 1112,1118 ****
*/
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));
--- 1112,1118 ----
*/
new->no_local_copy = r->no_local_copy;
! new->read_length = r->read_length; /* We can only read body once */
ap_snprintf (t, sizeof(t), "%d", r->status);
table_set (new->subprocess_env, "REDIRECT_STATUS", pstrdup (r->pool, t));