brian 96/10/08 14:47:05
Modified: src http_config.h http_protocol.c http_protocol.h mod_cgi.c Log: Reviewed by: Brian Behlendorf Submitted by: Alexei Kosut Patch to properly support "100 Continue" for HTTP/1.1, and bring mod_cgi.c in line. Revision Changes Path 1.13 +2 -2 apache/src/http_config.h Index: http_config.h =================================================================== RCS file: /export/home/cvs/apache/src/http_config.h,v retrieving revision 1.12 retrieving revision 1.13 diff -C3 -r1.12 -r1.13 *** http_config.h 1996/10/06 02:25:02 1.12 --- http_config.h 1996/10/08 21:46:57 1.13 *************** *** 50,56 **** * */ ! /* $Id: http_config.h,v 1.12 1996/10/06 02:25:02 fielding Exp $ */ /* * The central data structures around here... --- 50,56 ---- * */ ! /* $Id: http_config.h,v 1.13 1996/10/08 21:46:57 brian Exp $ */ /* * The central data structures around here... *************** *** 215,221 **** * handle it back-compatibly, or at least signal an error). */ ! #define MODULE_MAGIC_NUMBER 19960806 #define STANDARD_MODULE_STUFF MODULE_MAGIC_NUMBER, 0, __FILE__, NULL /* Generic accessors for other modules to get at their own module-specific --- 215,221 ---- * handle it back-compatibly, or at least signal an error). */ ! #define MODULE_MAGIC_NUMBER 19961007 #define STANDARD_MODULE_STUFF MODULE_MAGIC_NUMBER, 0, __FILE__, NULL /* Generic accessors for other modules to get at their own module-specific 1.53 +41 -3 apache/src/http_protocol.c Index: http_protocol.c =================================================================== RCS file: /export/home/cvs/apache/src/http_protocol.c,v retrieving revision 1.52 retrieving revision 1.53 diff -C3 -r1.52 -r1.53 *** http_protocol.c 1996/10/08 20:43:33 1.52 --- http_protocol.c 1996/10/08 21:46:59 1.53 *************** *** 50,56 **** * */ ! /* $Id: http_protocol.c,v 1.52 1996/10/08 20:43:33 brian Exp $ */ /* * http_protocol.c --- routines which directly communicate with the --- 50,56 ---- * */ ! /* $Id: http_protocol.c,v 1.53 1996/10/08 21:46:59 brian Exp $ */ /* * http_protocol.c --- routines which directly communicate with the *************** *** 1051,1056 **** --- 1051,1085 ---- } + /* Here we deal with getting input from the client. This can be in the + * form of POST or PUT (other methods can be added later), and may be + * transmitted in either a fixed content-length or via chunked + * transfer-coding. + * + * Note that this is more complicated than it was in Apache 1.1 and prior + * versions, because chunked support means that the module does less. + * + * The proper procedure is this: + * 1. Call setup_client_block() near the beginning of the request + * handler. This will set up all the neccessary properties, and + * will return either OK, or an error code. If the latter, + * the module should return that error code. + * + * 2. When you are ready to possibly accept input, call should_client_block(). + * This will tell the module whether or not to read input. If it is 0, + * the module should assume that the input is of a non-entity type + * (e.g. a GET request). This step also sends a 100 Continue response + * to HTTP/1.1 clients, so should not be called until the module + * is *defenitely* ready to read content. (otherwise, the point of the + * 100 response is defeated). Never call this function more than once. + * + * 3. Finally, call get_client_block in a loop. Pass it a buffer and its + * size. It will put data into the buffer (not neccessarily the full + * buffer, in the case of chunked inputs), and return the length of + * the input block. When it is done reading, it will return 0. + * + */ + int setup_client_block (request_rec *r) { char *tenc = table_get (r->headers_in, "Transfer-Encoding"); *************** *** 1078,1084 **** } int should_client_block (request_rec *r) { ! return (r->method_number == M_POST || r->method_number == M_PUT); } static int rd_chunk_size (BUFF *b) { --- 1107,1122 ---- } int should_client_block (request_rec *r) { ! if (r->method_number != M_POST && r->method_number != M_PUT) ! return 0; ! ! if (r->proto_num >= 1001) { ! bvputs(r->connection->client, ! SERVER_PROTOCOL, " 100 Continue\015\012\015\012", NULL); ! bflush(r->connection->client); ! } ! ! return 1; } static int rd_chunk_size (BUFF *b) { *************** *** 1103,1109 **** return (c == EOF) ? -1 : chunksize; } ! long read_client_block (request_rec *r, char *buffer, int bufsiz) { long c, len_read, len_to_read = r->remaining; --- 1141,1147 ---- return (c == EOF) ? -1 : chunksize; } ! long get_client_block (request_rec *r, char *buffer, int bufsiz) { long c, len_read, len_to_read = r->remaining; 1.9 +2 -2 apache/src/http_protocol.h Index: http_protocol.h =================================================================== RCS file: /export/home/cvs/apache/src/http_protocol.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C3 -r1.8 -r1.9 *** http_protocol.h 1996/08/20 11:50:50 1.8 --- http_protocol.h 1996/10/08 21:46:59 1.9 *************** *** 50,56 **** * */ ! /* $Id: http_protocol.h,v 1.8 1996/08/20 11:50:50 paul Exp $ */ /* * Prototypes for routines which either talk directly back to the user, --- 50,56 ---- * */ ! /* $Id: http_protocol.h,v 1.9 1996/10/08 21:46:59 brian Exp $ */ /* * Prototypes for routines which either talk directly back to the user, *************** *** 133,139 **** int setup_client_block (request_rec *r); int should_client_block (request_rec *r); ! long read_client_block (request_rec *r, char *buffer, int bufsiz); /* Sending a byterange */ --- 133,139 ---- int setup_client_block (request_rec *r); int should_client_block (request_rec *r); ! long get_client_block (request_rec *r, char *buffer, int bufsiz); /* Sending a byterange */ 1.19 +2 -2 apache/src/mod_cgi.c Index: mod_cgi.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_cgi.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C3 -r1.18 -r1.19 *** mod_cgi.c 1996/08/23 18:19:13 1.18 --- mod_cgi.c 1996/10/08 21:47:00 1.19 *************** *** 50,56 **** * */ ! /* $Id: mod_cgi.c,v 1.18 1996/08/23 18:19:13 jim Exp $ */ /* * http_script: keeps all script-related ramblings together. --- 50,56 ---- * */ ! /* $Id: mod_cgi.c,v 1.19 1996/10/08 21:47:00 brian Exp $ */ /* * http_script: keeps all script-related ramblings together. *************** *** 424,430 **** hard_timeout ("copy script args", r); handler = signal (SIGPIPE, SIG_IGN); ! while ((len_read = read_client_block (r, argsbuffer, HUGE_STRING_LEN))) { if (fwrite (argsbuffer, 1, len_read, script_out) == 0) break; --- 424,430 ---- hard_timeout ("copy script args", r); handler = signal (SIGPIPE, SIG_IGN); ! while ((len_read = get_client_block (r, argsbuffer, HUGE_STRING_LEN))) { if (fwrite (argsbuffer, 1, len_read, script_out) == 0) break;