fielding 99/07/19 03:16:04
Modified: src CHANGES src/main http_protocol.c Log: Fix handling of case when a client has sent "Expect: 100-continue" and we are going to respond with an error, but get stuck waiting to discard the body in the pointless hope of preserving the connection. This remains less than satisfactory, since what we really should be doing is sending the response immediately and discarding the request body as some form of post-response cleanup. Something to consider. PR: 4499, 3806 Submitted by: Roy Fielding, Joe Orton <[EMAIL PROTECTED]> Revision Changes Path 1.1397 +5 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1396 retrieving revision 1.1397 diff -u -r1.1396 -r1.1397 --- CHANGES 1999/07/10 18:27:26 1.1396 +++ CHANGES 1999/07/19 10:15:53 1.1397 @@ -1,5 +1,10 @@ Changes with Apache 1.3.7 + *) Fix handling of case when a client has sent "Expect: 100-continue" + and we are going to respond with an error, but get stuck waiting to + discard the body in the pointless hope of preserving the connection. + [Roy Fielding, Joe Orton <[EMAIL PROTECTED]>] PR#4499, PR#3806 + *) Fix 'configure' to work correctly with SysV-based versions of 'tr' (consistent with Configure's use as well). [Jim Jagielski] 1.272 +9 -5 apache-1.3/src/main/http_protocol.c Index: http_protocol.c =================================================================== RCS file: /home/cvs/apache-1.3/src/main/http_protocol.c,v retrieving revision 1.271 retrieving revision 1.272 diff -u -r1.271 -r1.272 --- http_protocol.c 1999/07/03 07:59:49 1.271 +++ http_protocol.c 1999/07/19 10:15:58 1.272 @@ -1881,14 +1881,18 @@ if ((rv = ap_setup_client_block(r, REQUEST_CHUNKED_PASS))) return rv; - /* If we are discarding the request body, then we must already know - * the final status code, therefore disable the sending of 100 continue. + /* In order to avoid sending 100 Continue when we already know the + * final response status, and yet not kill the connection if there is + * no request body to be read, we need to duplicate the test from + * ap_should_client_block() here negated rather than call it directly. */ - r->expecting_100 = 0; - - if (ap_should_client_block(r)) { + if ((r->read_length == 0) && (r->read_chunked || (r->remaining > 0))) { char dumpbuf[HUGE_STRING_LEN]; + if (r->expecting_100) { + r->connection->keepalive = -1; + return OK; + } ap_hard_timeout("reading request body", r); while ((rv = ap_get_client_block(r, dumpbuf, HUGE_STRING_LEN)) > 0) continue;