summaryrefslogtreecommitdiff
path: root/ext/standard/php_fopen_wrapper.c
diff options
context:
space:
mode:
authorMichael Wallner <mike@php.net>2013-09-17 13:52:25 +0200
committerMichael Wallner <mike@php.net>2013-09-17 13:52:25 +0200
commit423c70fb4d79b7831b1db41ea217c8e1afd5cf8e (patch)
tree7c78b090a462749e567e29a668cf8c750aa60b20 /ext/standard/php_fopen_wrapper.c
parent0f78d8612a7b16f1bbe3fb80a99896d7163c0aa7 (diff)
parent71bee63fad5418642c87c588cc9e22ca44186ce6 (diff)
downloadphp-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.c45
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")) {