hholzgra Mon Oct 21 12:41:07 2002 EDT
Modified files:
/php4/main SAPI.c main.c php_content_types.c php_globals.h
/php4/ext/standard php_fopen_wrapper.c
Log:
some changes to how request input data (Content-Lenght >0) is handled
- webdav-specific stuff removed (should be handled using httpd.conf
LIMIT or equivalents)
- always_populate_raw_post_data now working on any method, not just
POST (and webdav methods with allow_webdav_methods), when
Content-Length is greater zero
- raw input data is also available using php://input stream,
this way one doesn't have to care about memory_limit
- input data is now always consumed (although maybe ignored,
this fixes we had withproblems with keep-alive connections
@ raw POST data is now available as php://input stream (hartmut)
Index: php4/main/SAPI.c
diff -u php4/main/SAPI.c:1.150 php4/main/SAPI.c:1.151
--- php4/main/SAPI.c:1.150 Sat Sep 7 21:06:29 2002
+++ php4/main/SAPI.c Mon Oct 21 12:41:06 2002
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: SAPI.c,v 1.150 2002/09/08 01:06:29 yohgaki Exp $ */
+/* $Id: SAPI.c,v 1.151 2002/10/21 16:41:06 hholzgra Exp $ */
#include <ctype.h>
#include <sys/stat.h>
@@ -128,7 +128,7 @@
char *content_type = estrndup(SG(request_info).content_type,
content_type_length);
char *p;
char oldchar=0;
- void (*post_reader_func)(TSRMLS_D);
+ void (*post_reader_func)(TSRMLS_D) = NULL;
/* dedicated implementation for increased performance:
@@ -159,7 +159,6 @@
return;
}
SG(request_info).post_entry = NULL;
- post_reader_func = sapi_module.default_post_reader;
}
if (oldchar) {
*(p-1) = oldchar;
@@ -169,10 +168,10 @@
if(post_reader_func) {
post_reader_func(TSRMLS_C);
+ }
- if(PG(always_populate_raw_post_data) &&
sapi_module.default_post_reader) {
- sapi_module.default_post_reader(TSRMLS_C);
- }
+ if(PG(always_populate_raw_post_data) && sapi_module.default_post_reader) {
+ sapi_module.default_post_reader(TSRMLS_C);
}
}
@@ -282,6 +281,7 @@
SAPI_API void sapi_activate(TSRMLS_D)
{
void (*post_reader_func)(TSRMLS_D);
+
zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct), (void
(*)(void *)) sapi_free_header, 0);
SG(sapi_headers).send_default_content_type = 1;
@@ -306,39 +306,34 @@
}
SG(rfc1867_uploaded_files) = NULL;
+ /* handle request mehtod */
if (SG(server_context)) {
- if ( SG(request_info).request_method
- && (!strcmp(SG(request_info).request_method, "POST")
- || (PG(allow_webdav_methods)
- && (!strcmp(SG(request_info).request_method,
"PROPFIND")
- || !strcmp(SG(request_info).request_method,
"PROPPATCH")
- || !strcmp(SG(request_info).request_method,
"MKCOL")
- || !strcmp(SG(request_info).request_method,
"PUT")
- || !strcmp(SG(request_info).request_method,
"MOVE")
- || !strcmp(SG(request_info).request_method,
"COPY")
- || !strcmp(SG(request_info).request_method,
"LOCK"))))) {
- if (!SG(request_info).content_type) {
+ if ( SG(request_info).request_method) {
+ if(!strcmp(SG(request_info).request_method, "POST")
+ && (SG(request_info).content_type)) {
+ /* HTTP POST -> may contain form data to be read into
+variables
+ depending on content type given
+ */
+ sapi_read_post_data(TSRMLS_C);
+ } else {
+ /* any other method with content payload will fill
+ $HTTP_RAW_POST_DATA if enabled by
+always_populate_raw_post_data
+ it is up to the webserver to decide whether to
+allow a method or not
+ */
SG(request_info).content_type_dup = NULL;
if(PG(always_populate_raw_post_data)) {
- SG(request_info).post_entry = NULL;
- post_reader_func =
sapi_module.default_post_reader;
-
- if(post_reader_func) {
- post_reader_func(TSRMLS_C);
-
- if(PG(always_populate_raw_post_data)
&& sapi_module.default_post_reader) {
-
sapi_module.default_post_reader(TSRMLS_C);
- }
+ if(sapi_module.default_post_reader) {
+
+sapi_module.default_post_reader(TSRMLS_C);
}
} else {
- sapi_module.sapi_error(E_WARNING, "No
content-type in POST request");
+ sapi_module.sapi_error(E_WARNING, "No
+content-type in %s request", SG(request_info).request_method);
}
- } else {
- sapi_read_post_data(TSRMLS_C);
}
} else {
SG(request_info).content_type_dup = NULL;
}
+
+ /* Cookies */
SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C);
if (sapi_module.activate) {
sapi_module.activate(TSRMLS_C);
@@ -360,6 +355,14 @@
zend_llist_destroy(&SG(sapi_headers).headers);
if (SG(request_info).post_data) {
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
+ 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).auth_user) {
efree(SG(request_info).auth_user);
Index: php4/main/main.c
diff -u php4/main/main.c:1.500 php4/main/main.c:1.501
--- php4/main/main.c:1.500 Mon Oct 21 09:09:28 2002
+++ php4/main/main.c Mon Oct 21 12:41:06 2002
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: main.c,v 1.500 2002/10/21 13:09:28 iliaa Exp $ */
+/* $Id: main.c,v 1.501 2002/10/21 16:41:06 hholzgra Exp $ */
/* {{{ includes
*/
@@ -320,7 +320,6 @@
STD_PHP_INI_BOOLEAN("allow_url_fopen", "1", PHP_INI_ALL,
OnUpdateBool, allow_url_fopen,
php_core_globals, core_globals)
STD_PHP_INI_BOOLEAN("always_populate_raw_post_data", "0",
PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool,
always_populate_raw_post_data, php_core_globals, core_globals)
- STD_PHP_INI_BOOLEAN("allow_webdav_methods", "0",
PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool,
allow_webdav_methods, php_core_globals, core_globals)
PHP_INI_END()
/* }}} */
Index: php4/main/php_content_types.c
diff -u php4/main/php_content_types.c:1.21 php4/main/php_content_types.c:1.22
--- php4/main/php_content_types.c:1.21 Fri Aug 2 02:53:48 2002
+++ php4/main/php_content_types.c Mon Oct 21 12:41:06 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_content_types.c,v 1.21 2002/08/02 06:53:48 hirokawa Exp $ */
+/* $Id: php_content_types.c,v 1.22 2002/10/21 16:41:06 hholzgra Exp $ */
#include "php.h"
#include "SAPI.h"
@@ -39,9 +39,11 @@
{
char *data;
- if(!SG(request_info).post_data) sapi_read_standard_form_data(TSRMLS_C);
- data = estrndup(SG(request_info).post_data, SG(request_info).post_data_length);
- SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data, SG(request_info).post_data_length);
+ if(PG(always_populate_raw_post_data)) {
+ if(!SG(request_info).post_data) sapi_read_standard_form_data(TSRMLS_C);
+ data = estrndup(SG(request_info).post_data,
+SG(request_info).post_data_length);
+ SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data,
+SG(request_info).post_data_length);
+ }
}
/* }}} */
Index: php4/main/php_globals.h
diff -u php4/main/php_globals.h:1.83 php4/main/php_globals.h:1.84
--- php4/main/php_globals.h:1.83 Mon Oct 21 09:09:29 2002
+++ php4/main/php_globals.h Mon Oct 21 12:41:06 2002
@@ -140,7 +140,6 @@
zend_bool always_populate_raw_post_data;
- zend_bool allow_webdav_methods;
};
Index: php4/ext/standard/php_fopen_wrapper.c
diff -u php4/ext/standard/php_fopen_wrapper.c:1.26
php4/ext/standard/php_fopen_wrapper.c:1.27
--- php4/ext/standard/php_fopen_wrapper.c:1.26 Sat Oct 5 06:35:12 2002
+++ php4/ext/standard/php_fopen_wrapper.c Mon Oct 21 12:41:06 2002
@@ -17,7 +17,7 @@
| Hartmut Holzgraefe <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_fopen_wrapper.c,v 1.26 2002/10/05 10:35:12 wez Exp $ */
+/* $Id: php_fopen_wrapper.c,v 1.27 2002/10/21 16:41:06 hholzgra Exp $ */
#include <stdio.h>
#include <stdlib.h>
@@ -66,6 +66,59 @@
NULL /* set_option */
};
+static size_t php_stream_input_write(php_stream *stream, const char *buf, size_t
+count TSRMLS_DC)
+{
+ return -1;
+}
+
+static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count
+TSRMLS_DC)
+{
+ int read_bytes;
+ 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(read_bytes <= count) {
+ stream->eof = 1;
+ } else {
+ read_bytes = count;
+ }
+ if(read_bytes) {
+ memcpy(buf, SG(request_info).post_data +
+stream->position, read_bytes);
+ }
+ return read_bytes;
+ } else {
+ read_bytes = sapi_module.read_post(buf, count TSRMLS_CC);
+ if(read_bytes <= 0){
+ stream->eof = 1;
+ read_bytes = 0;
+ }
+ return read_bytes;
+ }
+ }
+}
+
+static int php_stream_input_close(php_stream *stream, int close_handle TSRMLS_DC)
+{
+ return 0;
+}
+
+static int php_stream_input_flush(php_stream *stream TSRMLS_DC)
+{
+ return -1;
+}
+
+php_stream_ops php_stream_input_ops = {
+ php_stream_input_write,
+ php_stream_input_read,
+ php_stream_input_close,
+ php_stream_input_flush,
+ "Input",
+ NULL, /* seek */
+ NULL, /* cast */
+ NULL, /* stat */
+ NULL /* set_option */
+};
+
php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, char
*mode, int options, char **opened_path, php_stream_context *context STREAMS_DC
TSRMLS_DC)
{
FILE * fp = NULL;
@@ -76,6 +129,10 @@
if (!strcasecmp(path, "output")) {
return php_stream_alloc(&php_stream_output_ops, NULL, 0, "wb");
+ }
+
+ if (!strcasecmp(path, "input")) {
+ return php_stream_alloc(&php_stream_input_ops, NULL, 0, "rb");
}
if (!strcasecmp(path, "stdin")) {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php