diff options
author | Michael Wallner <mike@php.net> | 2013-09-17 13:52:25 +0200 |
---|---|---|
committer | Michael Wallner <mike@php.net> | 2013-09-17 13:52:25 +0200 |
commit | 423c70fb4d79b7831b1db41ea217c8e1afd5cf8e (patch) | |
tree | 7c78b090a462749e567e29a668cf8c750aa60b20 /ext/standard/php_fopen_wrapper.c | |
parent | 0f78d8612a7b16f1bbe3fb80a99896d7163c0aa7 (diff) | |
parent | 71bee63fad5418642c87c588cc9e22ca44186ce6 (diff) | |
download | php-git-423c70fb4d79b7831b1db41ea217c8e1afd5cf8e.tar.gz |
Merge branch 'slim-postdata-merge'
* slim-postdata-merge:
remove unused code
tests
make reading php://input JIT if enable_post_data_reading=0
revert stream cast
fix ZTS build
slim post data
Conflicts:
ext/soap/soap.c
ext/standard/php_fopen_wrapper.c
main/SAPI.c
Diffstat (limited to 'ext/standard/php_fopen_wrapper.c')
-rw-r--r-- | ext/standard/php_fopen_wrapper.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index f624cf4958..064eee21eb 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -63,6 +63,12 @@ php_stream_ops php_stream_output_ops = { NULL /* set_option */ }; +typedef struct php_stream_input { /* {{{ */ + php_stream **body_ptr; + off_t position; +} php_stream_input_t; +/* }}} */ + static size_t php_stream_input_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC) /* {{{ */ { return -1; @@ -71,15 +77,29 @@ static size_t php_stream_input_write(php_stream *stream, const char *buf, size_t static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) /* {{{ */ { - php_stream *inner = stream->abstract; + php_stream_input_t *input = stream->abstract; + size_t read; - if (inner) { - size_t read = php_stream_read(inner, buf, count); - stream->eof = inner->eof; - return read; + if (!SG(post_read) && SG(read_post_bytes) < input->position + count) { + /* read requested data from SAPI */ + int read_bytes = sapi_read_post_block(buf, count TSRMLS_CC); + + if (read_bytes > 0) { + php_stream_seek(*input->body_ptr, 0, SEEK_END); + php_stream_write(*input->body_ptr, buf, read_bytes); + } } - return -1; + php_stream_seek(*input->body_ptr, input->position, SEEK_SET); + read = (*input->body_ptr)->ops->read(*input->body_ptr, buf, count TSRMLS_CC); + + if (!read || read == (size_t) -1) { + stream->eof = 1; + } else { + input->position += read; + } + + return read; } /* }}} */ @@ -195,18 +215,23 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa } if (!strcasecmp(path, "input")) { + php_stream_input_t *input; + if ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include) ) { if (options & REPORT_ERRORS) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "URL file-access is disabled in the server configuration"); } return NULL; } - if (SG(request_info).request_body) { - php_stream_rewind(SG(request_info).request_body); + + input = ecalloc(1, sizeof(*input)); + if (*(input->body_ptr = &SG(request_info).request_body)) { + php_stream_rewind(*input->body_ptr); } else { - sapi_read_standard_form_data(TSRMLS_C); + *input->body_ptr = php_stream_temp_create(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE); } - return php_stream_alloc(&php_stream_input_ops, SG(request_info).request_body, 0, "rb"); + + return php_stream_alloc(&php_stream_input_ops, input, 0, "rb"); } if (!strcasecmp(path, "stdin")) { |