summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorMax Romanov <max.romanov@nginx.com>2017-09-07 16:39:31 -0700
committerMax Romanov <max.romanov@nginx.com>2017-09-07 16:39:31 -0700
commitd87a4fb642ed4588483e65cd74a83b0cec7e8d29 (patch)
tree0758fc192846bdbe7edc12ddfcdc1d665ff70415 /src
parent789a101e99433ea371f7560758a5130a97d129a1 (diff)
downloadunit-d87a4fb642ed4588483e65cd74a83b0cec7e8d29.tar.gz
unit-d87a4fb642ed4588483e65cd74a83b0cec7e8d29.tar.bz2
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.
Diffstat (limited to 'src')
-rw-r--r--src/nxt_php_sapi.c4
-rw-r--r--src/nxt_router.c25
2 files changed, 22 insertions, 7 deletions
diff --git a/src/nxt_php_sapi.c b/src/nxt_php_sapi.c
index ba7a5aad..c60a8dab 100644
--- a/src/nxt_php_sapi.c
+++ b/src/nxt_php_sapi.c
@@ -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));
h->parsed_content_length = s;
+ RC(nxt_app_msg_read_size(task, ctx->rmsg, &ctx->body_preread_size));
+
#undef NXT_READ
#undef RC
@@ -741,8 +743,6 @@ nxt_php_register_variables(zval *track_vars_array TSRMLS_DC)
NXT_PHP_SET(n.start, v);
}
- nxt_app_msg_read_size(task, ctx->rmsg, &ctx->body_preread_size);
-
#undef NXT_PHP_SET
}
diff --git a/src/nxt_router.c b/src/nxt_router.c
index fbc8d9c4..d62c536f 100644
--- a/src/nxt_router.c
+++ b/src/nxt_router.c
@@ -2862,6 +2862,7 @@ nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
{
nxt_int_t rc;
nxt_buf_t *b;
+ nxt_bool_t method_is_post;
nxt_http_field_t *field;
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);
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) {
RC(nxt_app_msg_write_prefixed_upcase(task, wmsg,
@@ -2927,11 +2942,11 @@ nxt_php_prepare_msg(nxt_task_t *task, nxt_app_request_t *r,
/* end-of-headers mark */
NXT_WRITE(&eof);
- RC(nxt_app_msg_write_size(task, wmsg, r->body.preread_size));
-
- 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)));
+ 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)));
+ }
}
#undef NXT_WRITE