Moving body data before headers for PHP POST.
PHP SAPI tries to read body for POST request before registering header-specific variables. For other methods, read_post_body() called by SAPI after variables registration. This closes #10 issue on GitHub.
This commit is contained in:
@@ -333,6 +333,8 @@ nxt_php_read_request(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
|
|||||||
RC(nxt_app_msg_read_size(task, rmsg, &s));
|
RC(nxt_app_msg_read_size(task, rmsg, &s));
|
||||||
h->parsed_content_length = s;
|
h->parsed_content_length = s;
|
||||||
|
|
||||||
|
RC(nxt_app_msg_read_size(task, ctx->rmsg, &ctx->body_preread_size));
|
||||||
|
|
||||||
#undef NXT_READ
|
#undef NXT_READ
|
||||||
#undef RC
|
#undef RC
|
||||||
|
|
||||||
@@ -741,8 +743,6 @@ nxt_php_register_variables(zval *track_vars_array TSRMLS_DC)
|
|||||||
NXT_PHP_SET(n.start, v);
|
NXT_PHP_SET(n.start, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
nxt_app_msg_read_size(task, ctx->rmsg, &ctx->body_preread_size);
|
|
||||||
|
|
||||||
#undef NXT_PHP_SET
|
#undef NXT_PHP_SET
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2862,6 +2862,7 @@ nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
|
|||||||
{
|
{
|
||||||
nxt_int_t rc;
|
nxt_int_t rc;
|
||||||
nxt_buf_t *b;
|
nxt_buf_t *b;
|
||||||
|
nxt_bool_t method_is_post;
|
||||||
nxt_http_field_t *field;
|
nxt_http_field_t *field;
|
||||||
nxt_app_request_header_t *h;
|
nxt_app_request_header_t *h;
|
||||||
|
|
||||||
@@ -2916,6 +2917,20 @@ nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
|
|||||||
NXT_WRITE(&h->content_length);
|
NXT_WRITE(&h->content_length);
|
||||||
|
|
||||||
RC(nxt_app_msg_write_size(task, wmsg, h->parsed_content_length));
|
RC(nxt_app_msg_write_size(task, wmsg, h->parsed_content_length));
|
||||||
|
RC(nxt_app_msg_write_size(task, wmsg, r->body.preread_size));
|
||||||
|
|
||||||
|
method_is_post = h->method.length == 4 &&
|
||||||
|
h->method.start[0] == 'P' &&
|
||||||
|
h->method.start[1] == 'O' &&
|
||||||
|
h->method.start[2] == 'S' &&
|
||||||
|
h->method.start[3] == 'T';
|
||||||
|
|
||||||
|
if (method_is_post) {
|
||||||
|
for(b = r->body.buf; b != NULL; b = b->next) {
|
||||||
|
RC(nxt_app_msg_write_raw(task, wmsg, b->mem.pos,
|
||||||
|
nxt_buf_mem_used_size(&b->mem)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nxt_list_each(field, h->fields) {
|
nxt_list_each(field, h->fields) {
|
||||||
RC(nxt_app_msg_write_prefixed_upcase(task, wmsg,
|
RC(nxt_app_msg_write_prefixed_upcase(task, wmsg,
|
||||||
@@ -2927,12 +2942,12 @@ nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
|
|||||||
/* end-of-headers mark */
|
/* end-of-headers mark */
|
||||||
NXT_WRITE(&eof);
|
NXT_WRITE(&eof);
|
||||||
|
|
||||||
RC(nxt_app_msg_write_size(task, wmsg, r->body.preread_size));
|
if (!method_is_post) {
|
||||||
|
|
||||||
for(b = r->body.buf; b != NULL; b = b->next) {
|
for(b = r->body.buf; b != NULL; b = b->next) {
|
||||||
RC(nxt_app_msg_write_raw(task, wmsg, b->mem.pos,
|
RC(nxt_app_msg_write_raw(task, wmsg, b->mem.pos,
|
||||||
nxt_buf_mem_used_size(&b->mem)));
|
nxt_buf_mem_used_size(&b->mem)));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#undef NXT_WRITE
|
#undef NXT_WRITE
|
||||||
#undef RC
|
#undef RC
|
||||||
|
|||||||
Reference in New Issue
Block a user