hholzgra Tue Nov 12 13:29:11 2002 EDT Modified files: /php4/ext/standard php_fopen_wrapper.c /php4/main SAPI.c SAPI.h php_content_types.c Log: HTTP_RAW_POST_DATA BC fixes # hopefully all done, commiting anyway to continue work on my home box php://input stream fixes (POST data handerl mangles data, CLI crashbug) Index: php4/ext/standard/php_fopen_wrapper.c diff -u php4/ext/standard/php_fopen_wrapper.c:1.28 php4/ext/standard/php_fopen_wrapper.c:1.29 --- php4/ext/standard/php_fopen_wrapper.c:1.28 Mon Oct 21 15:08:18 2002 +++ php4/ext/standard/php_fopen_wrapper.c Tue Nov 12 13:29:11 2002 @@ -17,7 +17,7 @@ | Hartmut Holzgraefe <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_fopen_wrapper.c,v 1.28 2002/10/21 19:08:18 hholzgra Exp $ */ +/* $Id: php_fopen_wrapper.c,v 1.29 2002/11/12 18:29:11 hholzgra Exp $ */ #include <stdio.h> #include <stdlib.h> @@ -75,22 +75,24 @@ { size_t read_bytes = 0; if(!stream->eof) { - if(SG(request_info).post_data) { /* data has already been read by a post handler */ - read_bytes = SG(request_info).post_data_length - stream->position; + if(SG(request_info).raw_post_data) { /* data has already been read by +a post handler */ + read_bytes = SG(request_info).raw_post_data_length - +stream->position; if(read_bytes <= count) { stream->eof = 1; } else { read_bytes = count; } if(read_bytes) { - memcpy(buf, SG(request_info).post_data + stream->position, read_bytes); + memcpy(buf, SG(request_info).raw_post_data + +stream->position, read_bytes); } - } else { + } else if(sapi_module.read_post) { read_bytes = sapi_module.read_post(buf, count TSRMLS_CC); if(read_bytes <= 0){ stream->eof = 1; read_bytes = 0; } + } else { + stream->eof = 1; } } @@ -133,7 +135,7 @@ if (!strcasecmp(path, "input")) { return php_stream_alloc(&php_stream_input_ops, NULL, 0, "rb"); - } + } if (!strcasecmp(path, "stdin")) { fp = fdopen(dup(STDIN_FILENO), mode); Index: php4/main/SAPI.c diff -u php4/main/SAPI.c:1.154 php4/main/SAPI.c:1.155 --- php4/main/SAPI.c:1.154 Fri Nov 8 03:41:52 2002 +++ php4/main/SAPI.c Tue Nov 12 13:29:11 2002 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: SAPI.c,v 1.154 2002/11/08 08:41:52 hholzgra Exp $ */ +/* $Id: SAPI.c,v 1.155 2002/11/12 18:29:11 hholzgra Exp $ */ #include <ctype.h> #include <sys/stat.h> @@ -174,7 +174,7 @@ post_reader_func(TSRMLS_C); } - if(PG(always_populate_raw_post_data) && sapi_module.default_post_reader) { + if(sapi_module.default_post_reader) { sapi_module.default_post_reader(TSRMLS_C); } } @@ -294,6 +294,7 @@ SG(headers_sent) = 0; SG(read_post_bytes) = 0; SG(request_info).post_data = NULL; + SG(request_info).raw_post_data = NULL; SG(request_info).current_user = NULL; SG(request_info).current_user_length = 0; SG(request_info).no_headers = 0; @@ -355,13 +356,16 @@ efree(SG(request_info).post_data); } else if (SG(server_context)) { if(sapi_module.read_post) { - // make sure we've consumed all request input data + /* make sure we've consumed all request input data */ char dummy[SAPI_POST_BLOCK_SIZE]; while(sapi_module.read_post(dummy, sizeof(dummy)-1 TSRMLS_CC) > 0) { /* empty loop body */ } } } + if (SG(request_info).raw_post_data) { + efree(SG(request_info).raw_post_data); + } if (SG(request_info).auth_user) { efree(SG(request_info).auth_user); } Index: php4/main/SAPI.h diff -u php4/main/SAPI.h:1.85 php4/main/SAPI.h:1.86 --- php4/main/SAPI.h:1.85 Fri Aug 2 02:53:48 2002 +++ php4/main/SAPI.h Tue Nov 12 13:29:11 2002 @@ -71,10 +71,10 @@ typedef struct { const char *request_method; char *query_string; - char *post_data; + char *post_data, *raw_post_data; char *cookie_data; long content_length; - uint post_data_length; + uint post_data_length, raw_post_data_length; char *path_translated; char *request_uri; Index: php4/main/php_content_types.c diff -u php4/main/php_content_types.c:1.23 php4/main/php_content_types.c:1.24 --- php4/main/php_content_types.c:1.23 Fri Nov 8 03:41:52 2002 +++ php4/main/php_content_types.c Tue Nov 12 13:29:11 2002 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_content_types.c,v 1.23 2002/11/08 08:41:52 hholzgra Exp $ */ +/* $Id: php_content_types.c,v 1.24 2002/11/12 18:29:11 hholzgra Exp $ */ #include "php.h" #include "SAPI.h" @@ -38,25 +38,35 @@ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader) { char *data = NULL; + int length = 0; - if(PG(always_populate_raw_post_data)) { - if(NULL == SG(request_info).post_data) { /* no data yet */ - if(NULL == SG(request_info).post_entry) { - /* no post handler registered, so we just swallow the data */ - sapi_read_standard_form_data(TSRMLS_C); - data = SG(request_info).post_data; - SG(request_info).post_data = NULL; - SG(request_info).post_data_length = 0; - } - } else { - /* copy existing post data */ - data = estrndup(SG(request_info).post_data, SG(request_info).post_data_length); + // $HTTP_RAW_POST_DATA registration + if(!strcmp(SG(request_info).request_method, "POST")) { + if(NULL == SG(request_info).post_entry) { + /* no post handler registered, so we just swallow the data */ + sapi_read_standard_form_data(TSRMLS_C); + length = SG(request_info).post_data_length; + data = estrndup(SG(request_info).post_data, length); + } else if(PG(always_populate_raw_post_data) && +SG(request_info).post_data) { + length = SG(request_info).post_data_length; + data = estrndup(SG(request_info).post_data, length); } - if(data) { - SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data, SG(request_info).post_data_length); + SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data, length); } } + + /* for php://input stream: + some post handlers modify the content of request_info.post_data + so for now we need a copy for the php://input stream + in the long run post handlers should be changed to not touch + request_info.post_data for memory preservation reasons + */ + if(SG(request_info).post_data) { + SG(request_info).raw_post_data = estrndup(SG(request_info).post_data, +SG(request_info).post_data_length); + SG(request_info).raw_post_data_length = +SG(request_info).post_data_length; + } + } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php