static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count) /* {{{ */ { php_stream_input_t *input = stream->abstract; size_t read; if (!SG(post_read) && SG(read_post_bytes) < (int64_t)(input->position + count)) { /* read requested data from SAPI */ int read_bytes = sapi_read_post_block(buf, count); if (read_bytes > 0) { php_stream_seek(input->body, 0, SEEK_END); php_stream_write(input->body, buf, read_bytes); } } php_stream_seek(input->body, input->position, SEEK_SET); read = php_stream_read(input->body, buf, count); if (!read || read == (size_t) -1) { stream->eof = 1; } else { input->position += read; } return read; }
static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count) /* {{{ */ { php_stream_input_t *input = stream->abstract; size_t read; if (!SG(post_read) && SG(read_post_bytes) < (int64_t)(input->position + count)) { /* read requested data from SAPI */ size_t read_bytes = sapi_read_post_block(buf, count); if (read_bytes > 0) { php_stream_seek(input->body, 0, SEEK_END); php_stream_write(input->body, buf, read_bytes); } } if (!input->body->readfilters.head) { /* If the input stream contains filters, it's not really seekable. The input->position is likely to be wrong for unfiltered data. */ php_stream_seek(input->body, input->position, SEEK_SET); } read = php_stream_read(input->body, buf, count); if (!read || read == (size_t) -1) { stream->eof = 1; } else { input->position += read; } return read; }
SAPI_API void sapi_deactivate(void) { zend_llist_destroy(&SG(sapi_headers).headers); if (SG(request_info).request_body) { SG(request_info).request_body = NULL; } else if (SG(server_context)) { if (!SG(post_read)) { /* make sure we've consumed all request input data */ char dummy[SAPI_POST_BLOCK_SIZE]; size_t read_bytes; do { read_bytes = sapi_read_post_block(dummy, SAPI_POST_BLOCK_SIZE); } while (SAPI_POST_BLOCK_SIZE == read_bytes); } } if (SG(request_info).auth_user) { efree(SG(request_info).auth_user); } if (SG(request_info).auth_password) { efree(SG(request_info).auth_password); } if (SG(request_info).auth_digest) { efree(SG(request_info).auth_digest); } if (SG(request_info).content_type_dup) { efree(SG(request_info).content_type_dup); } if (SG(request_info).current_user) { efree(SG(request_info).current_user); } if (sapi_module.deactivate) { sapi_module.deactivate(); } if (SG(rfc1867_uploaded_files)) { destroy_uploaded_files_hash(); } if (SG(sapi_headers).mimetype) { efree(SG(sapi_headers).mimetype); SG(sapi_headers).mimetype = NULL; } sapi_send_headers_free(); SG(sapi_started) = 0; SG(headers_sent) = 0; SG(request_info).headers_read = 0; SG(global_request_time) = 0; }
SAPI_API SAPI_POST_READER_FUNC(sapi_read_standard_form_data) { if ((SG(post_max_size) > 0) && (SG(request_info).content_length > SG(post_max_size))) { php_error_docref(NULL, E_WARNING, "POST Content-Length of " ZEND_LONG_FMT " bytes exceeds the limit of " ZEND_LONG_FMT " bytes", SG(request_info).content_length, SG(post_max_size)); return; } SG(request_info).request_body = php_stream_temp_create_ex(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE, PG(upload_tmp_dir)); if (sapi_module.read_post) { size_t read_bytes; for (;;) { char buffer[SAPI_POST_BLOCK_SIZE]; read_bytes = sapi_read_post_block(buffer, SAPI_POST_BLOCK_SIZE); if (read_bytes > 0) { if (php_stream_write(SG(request_info).request_body, buffer, read_bytes) != read_bytes) { /* if parts of the stream can't be written, purge it completely */ php_stream_truncate_set_size(SG(request_info).request_body, 0); php_error_docref(NULL, E_WARNING, "POST data can't be buffered; all data discarded"); break; } } if ((SG(post_max_size) > 0) && (SG(read_post_bytes) > SG(post_max_size))) { php_error_docref(NULL, E_WARNING, "Actual POST length does not match Content-Length, and exceeds " ZEND_LONG_FMT " bytes", SG(post_max_size)); break; } if (read_bytes < SAPI_POST_BLOCK_SIZE) { /* done */ break; } } php_stream_rewind(SG(request_info).request_body); } }