[nginx] svn commit: r4930 - trunk/src/http/modules
mdounin at mdounin.ru
mdounin at mdounin.ru
Wed Nov 21 01:06:54 UTC 2012
Author: mdounin
Date: 2012-11-21 01:06:53 +0000 (Wed, 21 Nov 2012)
New Revision: 4930
URL: http://trac.nginx.org/nginx/changeset/4930/nginx
Log:
Request body: recalculate size of a request body in scgi module.
This allows to handle requests with chunked body by scgi module, and
also simplifies handling of various request body modifications.
Modified:
trunk/src/http/modules/ngx_http_scgi_module.c
Modified: trunk/src/http/modules/ngx_http_scgi_module.c
===================================================================
--- trunk/src/http/modules/ngx_http_scgi_module.c 2012-11-21 01:05:08 UTC (rev 4929)
+++ trunk/src/http/modules/ngx_http_scgi_module.c 2012-11-21 01:06:53 UTC (rev 4930)
@@ -533,10 +533,11 @@
static ngx_int_t
ngx_http_scgi_create_request(ngx_http_request_t *r)
{
+ off_t content_length_n;
u_char ch, *key, *val, *lowcase_key;
size_t len, key_len, val_len, allocated;
ngx_buf_t *b;
- ngx_str_t *content_length;
+ ngx_str_t content_length;
ngx_uint_t i, n, hash, skip_empty, header_params;
ngx_chain_t *cl, *body;
ngx_list_part_t *part;
@@ -545,13 +546,21 @@
ngx_http_script_engine_t e, le;
ngx_http_scgi_loc_conf_t *scf;
ngx_http_script_len_code_pt lcode;
- static ngx_str_t zero = ngx_string("0");
+ u_char buffer[NGX_OFF_T_LEN];
- content_length = r->headers_in.content_length ?
- &r->headers_in.content_length->value : &zero;
+ content_length_n = 0;
+ body = r->upstream->request_bufs;
- len = sizeof("CONTENT_LENGTH") + content_length->len + 1;
+ while (body) {
+ content_length_n += ngx_buf_size(body->buf);
+ body = body->next;
+ }
+ content_length.data = buffer;
+ content_length.len = ngx_sprintf(buffer, "%O", content_length_n) - buffer;
+
+ len = sizeof("CONTENT_LENGTH") + content_length.len + 1;
+
header_params = 0;
ignored = NULL;
@@ -672,11 +681,8 @@
cl->buf = b;
- b->last = ngx_snprintf(b->last,
- NGX_SIZE_T_LEN + 1 + sizeof("CONTENT_LENGTH")
- + NGX_OFF_T_LEN + 1,
- "%ui:CONTENT_LENGTH%Z%V%Z",
- len, content_length);
+ b->last = ngx_sprintf(b->last, "%ui:CONTENT_LENGTH%Z%V%Z",
+ len, &content_length);
if (scf->params_len) {
ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
More information about the nginx-devel
mailing list