annotate src/http/ngx_http_request_body.c @ 8889:61d0fa67b55e quic

Merged with the default branch.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 03 Nov 2021 11:22:07 +0300
parents fac88e160653 97cf8284fd19
children 9aff230f10d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4072
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
6
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
8 #include <ngx_config.h>
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
9 #include <ngx_core.h>
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
10 #include <ngx_http.h>
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
13 static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
14 static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r);
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
15 static ngx_int_t ngx_http_copy_pipelined_header(ngx_http_request_t *r,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
16 ngx_buf_t *buf);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
17 static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r);
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1369
diff changeset
18 static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
19 static ngx_int_t ngx_http_discard_request_body_filter(ngx_http_request_t *r,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
20 ngx_buf_t *b);
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
21 static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
22
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
23 static ngx_int_t ngx_http_request_body_filter(ngx_http_request_t *r,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
24 ngx_chain_t *in);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
25 static ngx_int_t ngx_http_request_body_length_filter(ngx_http_request_t *r,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
26 ngx_chain_t *in);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
27 static ngx_int_t ngx_http_request_body_chunked_filter(ngx_http_request_t *r,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
28 ngx_chain_t *in);
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
29
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
30
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
31 ngx_int_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
32 ngx_http_read_client_request_body(ngx_http_request_t *r,
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
33 ngx_http_client_body_handler_pt post_handler)
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
34 {
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
35 size_t preread;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
36 ssize_t size;
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
37 ngx_int_t rc;
5025
43cb2c9799c1 Request body: fixed client_body_in_file_only.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4937
diff changeset
38 ngx_buf_t *b;
6420
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
39 ngx_chain_t out;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
40 ngx_http_request_body_t *rb;
303
00c5660d2707 nginx-0.0.3-2004-04-01-20:20:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 299
diff changeset
41 ngx_http_core_loc_conf_t *clcf;
297
ee394e997c77 nginx-0.0.3-2004-03-29-21:43:58 import
Igor Sysoev <igor@sysoev.ru>
parents: 296
diff changeset
42
3049
67254117b774 request reference counter
Igor Sysoev <igor@sysoev.ru>
parents: 2436
diff changeset
43 r->main->count++;
67254117b774 request reference counter
Igor Sysoev <igor@sysoev.ru>
parents: 2436
diff changeset
44
6496
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
45 if (r != r->main || r->request_body || r->discard_body) {
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
46 r->request_body_no_buffering = 0;
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
47 post_handler(r);
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
48 return NGX_OK;
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
49 }
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
50
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
51 if (ngx_http_test_expect(r) != NGX_OK) {
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
52 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
53 goto done;
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
54 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
55
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
56 rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
57 if (rb == NULL) {
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
58 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
59 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
60 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
61
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
62 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
63 * set by ngx_pcalloc():
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
64 *
7911
d869e43643ac Request body: missing comments about initialization.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7740
diff changeset
65 * rb->temp_file = NULL;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
66 * rb->bufs = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
67 * rb->buf = NULL;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
68 * rb->free = NULL;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
69 * rb->busy = NULL;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
70 * rb->chunked = NULL;
7911
d869e43643ac Request body: missing comments about initialization.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7740
diff changeset
71 * rb->received = 0;
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
72 * rb->filter_need_buffering = 0;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
73 * rb->last_sent = 0;
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
74 * rb->last_saved = 0;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
75 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
76
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
77 rb->rest = -1;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
78 rb->post_handler = post_handler;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
79
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
80 r->request_body = rb;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
81
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
82 if (r->headers_in.content_length_n < 0 && !r->headers_in.chunked) {
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
83 r->request_body_no_buffering = 0;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
84 post_handler(r);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
85 return NGX_OK;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
86 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
87
6989
2c4dbcd6f2e4 HTTP/2: reduced difference to HTTP/1.x in reading request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6904
diff changeset
88 #if (NGX_HTTP_V2)
2c4dbcd6f2e4 HTTP/2: reduced difference to HTTP/1.x in reading request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6904
diff changeset
89 if (r->stream) {
2c4dbcd6f2e4 HTTP/2: reduced difference to HTTP/1.x in reading request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6904
diff changeset
90 rc = ngx_http_v2_read_request_body(r);
2c4dbcd6f2e4 HTTP/2: reduced difference to HTTP/1.x in reading request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6904
diff changeset
91 goto done;
2c4dbcd6f2e4 HTTP/2: reduced difference to HTTP/1.x in reading request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6904
diff changeset
92 }
2c4dbcd6f2e4 HTTP/2: reduced difference to HTTP/1.x in reading request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6904
diff changeset
93 #endif
2c4dbcd6f2e4 HTTP/2: reduced difference to HTTP/1.x in reading request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6904
diff changeset
94
8689
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
95 #if (NGX_HTTP_V3)
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
96 if (r->http_version == NGX_HTTP_VERSION_30) {
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
97 rc = ngx_http_v3_read_request_body(r);
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
98 goto done;
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
99 }
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
100 #endif
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
101
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
102 preread = r->header_in->last - r->header_in->pos;
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
103
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
104 if (preread) {
296
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
105
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
106 /* there is the pre-read part of the request body */
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
107
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
108 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
109 "http client request body preread %uz", preread);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
110
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
111 out.buf = r->header_in;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
112 out.next = NULL;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
114 rc = ngx_http_request_body_filter(r, &out);
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
116 if (rc != NGX_OK) {
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
117 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
118 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
119
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
120 r->request_length += preread - (r->header_in->last - r->header_in->pos);
299
46b7eeb8a116 nginx-0.0.3-2004-03-30-19:59:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
121
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
122 if (!r->headers_in.chunked
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
123 && rb->rest > 0
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
124 && rb->rest <= (off_t) (r->header_in->end - r->header_in->last))
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
125 {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
126 /* the whole request body may be placed in r->header_in */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
127
5111
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
128 b = ngx_calloc_buf(r->pool);
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
129 if (b == NULL) {
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
130 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
131 goto done;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
132 }
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
133
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
134 b->temporary = 1;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
135 b->start = r->header_in->pos;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
136 b->pos = r->header_in->pos;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
137 b->last = r->header_in->last;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
138 b->end = r->header_in->end;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
139
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
140 rb->buf = b;
57c3f84d72ce Request body: avoid linking rb->buf to r->header_in.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5110
diff changeset
141
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
142 r->read_event_handler = ngx_http_read_client_request_body_handler;
4937
3b6594a2b79f Request body: block write events while reading body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4936
diff changeset
143 r->write_event_handler = ngx_http_request_empty_handler;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
144
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
145 rc = ngx_http_do_read_client_request_body(r);
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
146 goto done;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
147 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
148
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
149 } else {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
150 /* set rb->rest */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
151
7740
967cfa6e2ff8 Request body: removed error assumption (ticket #2058).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7739
diff changeset
152 rc = ngx_http_request_body_filter(r, NULL);
967cfa6e2ff8 Request body: removed error assumption (ticket #2058).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7739
diff changeset
153
967cfa6e2ff8 Request body: removed error assumption (ticket #2058).
Maxim Dounin <mdounin@mdounin.ru>
parents: 7739
diff changeset
154 if (rc != NGX_OK) {
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
155 goto done;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
156 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
157 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
158
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
159 if (rb->rest == 0 && rb->last_saved) {
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
160 /* the whole request body was pre-read */
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
161 r->request_body_no_buffering = 0;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
162 post_handler(r);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
163 return NGX_OK;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
4936
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
166 if (rb->rest < 0) {
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
167 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
168 "negative request body rest");
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
169 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
170 goto done;
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
171 }
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
172
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
173 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
174
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
175 size = clcf->client_body_buffer_size;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
176 size += size >> 2;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
177
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
178 /* TODO: honor r->request_body_in_single_buf */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
179
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
180 if (!r->headers_in.chunked && rb->rest < size) {
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
181 size = (ssize_t) rb->rest;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
182
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
183 if (r->request_body_in_single_buf) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
184 size += preread;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
185 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
186
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
187 if (size == 0) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
188 size++;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
189 }
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
190
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
191 } else {
303
00c5660d2707 nginx-0.0.3-2004-04-01-20:20:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 299
diff changeset
192 size = clcf->client_body_buffer_size;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
193 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
194
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
195 rb->buf = ngx_create_temp_buf(r->pool, size);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
196 if (rb->buf == NULL) {
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
197 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
198 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
199 }
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
200
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
201 r->read_event_handler = ngx_http_read_client_request_body_handler;
4937
3b6594a2b79f Request body: block write events while reading body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4936
diff changeset
202 r->write_event_handler = ngx_http_request_empty_handler;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
204 rc = ngx_http_do_read_client_request_body(r);
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
205
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
206 done:
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
207
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
208 if (r->request_body_no_buffering
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
209 && (rc == NGX_OK || rc == NGX_AGAIN))
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
210 {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
211 if (rc == NGX_OK) {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
212 r->request_body_no_buffering = 0;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
213
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
214 } else {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
215 /* rc == NGX_AGAIN */
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
216 r->reading_body = 1;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
217 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
218
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
219 r->read_event_handler = ngx_http_block_reading;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
220 post_handler(r);
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
221 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
222
4923
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
223 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
224 r->main->count--;
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
225 }
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
226
57174af2e695 Request body: fixed socket leak on errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4922
diff changeset
227 return rc;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
231 ngx_int_t
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
232 ngx_http_read_unbuffered_request_body(ngx_http_request_t *r)
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
233 {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
234 ngx_int_t rc;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
235
6497
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
236 #if (NGX_HTTP_V2)
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
237 if (r->stream) {
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
238 rc = ngx_http_v2_read_unbuffered_request_body(r);
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
239
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
240 if (rc == NGX_OK) {
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
241 r->reading_body = 0;
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
242 }
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
243
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
244 return rc;
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
245 }
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
246 #endif
9d66d7ed2abb HTTP/2: support for unbuffered upload of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6496
diff changeset
247
8689
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
248 #if (NGX_HTTP_V3)
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
249 if (r->http_version == NGX_HTTP_VERSION_30) {
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
250 rc = ngx_http_v3_read_unbuffered_request_body(r);
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
251
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
252 if (rc == NGX_OK) {
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
253 r->reading_body = 0;
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
254 }
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
255
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
256 return rc;
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
257 }
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
258 #endif
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
259
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
260 if (r->connection->read->timedout) {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
261 r->connection->timedout = 1;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
262 return NGX_HTTP_REQUEST_TIME_OUT;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
263 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
264
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
265 rc = ngx_http_do_read_client_request_body(r);
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
266
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
267 if (rc == NGX_OK) {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
268 r->reading_body = 0;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
269 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
270
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
271 return rc;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
272 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
273
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
274
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
275 static void
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
276 ngx_http_read_client_request_body_handler(ngx_http_request_t *r)
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
277 {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
278 ngx_int_t rc;
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
279
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
280 if (r->connection->read->timedout) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
281 r->connection->timedout = 1;
1075
4d203f76b757 undo "client_body_in_file_only any"
Igor Sysoev <igor@sysoev.ru>
parents: 1072
diff changeset
282 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);
299
46b7eeb8a116 nginx-0.0.3-2004-03-30-19:59:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
283 return;
46b7eeb8a116 nginx-0.0.3-2004-03-30-19:59:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
284 }
46b7eeb8a116 nginx-0.0.3-2004-03-30-19:59:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
285
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
286 rc = ngx_http_do_read_client_request_body(r);
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
287
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
288 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
1075
4d203f76b757 undo "client_body_in_file_only any"
Igor Sysoev <igor@sysoev.ru>
parents: 1072
diff changeset
289 ngx_http_finalize_request(r, rc);
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
290 }
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
291 }
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
292
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
293
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
294 static ngx_int_t
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
295 ngx_http_do_read_client_request_body(ngx_http_request_t *r)
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
296 {
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
297 off_t rest;
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
298 size_t size;
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
299 ssize_t n;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
300 ngx_int_t rc;
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
301 ngx_uint_t flush;
6420
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
302 ngx_chain_t out;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
303 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
304 ngx_http_request_body_t *rb;
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
305 ngx_http_core_loc_conf_t *clcf;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
307 c = r->connection;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
308 rb = r->request_body;
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
309 flush = 1;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
311 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
312 "http read client request body");
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
313
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
314 for ( ;; ) {
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
315 for ( ;; ) {
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
316 if (rb->rest == 0) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
317 break;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
318 }
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
319
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
320 if (rb->buf->last == rb->buf->end) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
321
7691
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
322 /* update chains */
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
323
7691
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
324 rc = ngx_http_request_body_filter(r, NULL);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
325
7691
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
326 if (rc != NGX_OK) {
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
327 return rc;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
328 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
329
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
330 if (rb->busy != NULL) {
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
331 if (r->request_body_no_buffering) {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
332 if (c->read->timer_set) {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
333 ngx_del_timer(c->read);
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
334 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
335
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
336 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
337 return NGX_HTTP_INTERNAL_SERVER_ERROR;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
338 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
339
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
340 return NGX_AGAIN;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
341 }
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
342
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
343 if (rb->filter_need_buffering) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
344 clcf = ngx_http_get_module_loc_conf(r,
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
345 ngx_http_core_module);
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
346 ngx_add_timer(c->read, clcf->client_body_timeout);
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
347
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
348 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
349 return NGX_HTTP_INTERNAL_SERVER_ERROR;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
350 }
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
351
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
352 return NGX_AGAIN;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
353 }
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
354
7739
4d5b04daeaff Request body: improved logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7738
diff changeset
355 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
4d5b04daeaff Request body: improved logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7738
diff changeset
356 "busy buffers after request body flush");
4d5b04daeaff Request body: improved logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7738
diff changeset
357
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
358 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
359 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
360
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
361 flush = 0;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
362 rb->buf->pos = rb->buf->start;
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
363 rb->buf->last = rb->buf->start;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
364 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
365
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
366 size = rb->buf->end - rb->buf->last;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
367 rest = rb->rest - (rb->buf->last - rb->buf->pos);
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
368
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
369 if ((off_t) size > rest) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
370 size = (size_t) rest;
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
371 }
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
372
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
373 if (size == 0) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
374 break;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
375 }
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
376
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
377 n = c->recv(c, rb->buf->last, size);
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
378
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
379 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
380 "http client request body recv %z", n);
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
382 if (n == NGX_AGAIN) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
383 break;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
384 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
385
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
386 if (n == 0) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
387 ngx_log_error(NGX_LOG_INFO, c->log, 0,
4593
834049edae24 Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
388 "client prematurely closed connection");
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
389 }
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
390
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
391 if (n == 0 || n == NGX_ERROR) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
392 c->error = 1;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
393 return NGX_HTTP_BAD_REQUEST;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
394 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
395
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
396 rb->buf->last += n;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
397 r->request_length += n;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
398
7691
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
399 /* pass buffer to request body filter chain */
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
400
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
401 flush = 0;
7691
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
402 out.buf = rb->buf;
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
403 out.next = NULL;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
404
7691
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
405 rc = ngx_http_request_body_filter(r, &out);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
406
7691
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
407 if (rc != NGX_OK) {
08ff2e10ae92 Request body: all read data are now sent to filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6989
diff changeset
408 return rc;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
409 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
410
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
411 if (rb->rest == 0) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
412 break;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
413 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
414
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
415 if (rb->buf->last < rb->buf->end) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
416 break;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
417 }
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
418 }
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
419
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
420 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
1112
3dcc3041b5bc fix format
Igor Sysoev <igor@sysoev.ru>
parents: 1075
diff changeset
421 "http client request body rest %O", rb->rest);
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
422
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
423 if (flush) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
424 rc = ngx_http_request_body_filter(r, NULL);
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
425
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
426 if (rc != NGX_OK) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
427 return rc;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
428 }
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
429 }
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
430
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
431 if (rb->rest == 0 && rb->last_saved) {
294
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 293
diff changeset
432 break;
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 293
diff changeset
433 }
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 293
diff changeset
434
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
435 if (!c->read->ready || rb->rest == 0) {
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
436
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
437 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
438 ngx_add_timer(c->read, clcf->client_body_timeout);
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
439
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
440 if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
441 return NGX_HTTP_INTERNAL_SERVER_ERROR;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
442 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
443
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
444 return NGX_AGAIN;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
445 }
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
448 if (ngx_http_copy_pipelined_header(r, rb->buf) != NGX_OK) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
449 return NGX_HTTP_INTERNAL_SERVER_ERROR;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
450 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
451
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
452 if (c->read->timer_set) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
453 ngx_del_timer(c->read);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
454 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
455
6050
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
456 if (!r->request_body_no_buffering) {
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
457 r->read_event_handler = ngx_http_block_reading;
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
458 rb->post_handler(r);
a08fad30aeac Request body: unbuffered reading.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6049
diff changeset
459 }
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
460
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
461 return NGX_OK;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
463
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
464
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
465 static ngx_int_t
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
466 ngx_http_copy_pipelined_header(ngx_http_request_t *r, ngx_buf_t *buf)
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
467 {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
468 size_t n;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
469 ngx_buf_t *b;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
470 ngx_chain_t *cl;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
471 ngx_http_connection_t *hc;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
472 ngx_http_core_srv_conf_t *cscf;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
473
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
474 b = r->header_in;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
475 n = buf->last - buf->pos;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
476
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
477 if (buf == b || n == 0) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
478 return NGX_OK;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
479 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
480
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
481 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
482 "http body pipelined header: %uz", n);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
483
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
484 /*
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
485 * if there is a pipelined request in the client body buffer,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
486 * copy it to the r->header_in buffer if there is enough room,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
487 * or allocate a large client header buffer
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
488 */
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
489
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
490 if (n > (size_t) (b->end - b->last)) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
491
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
492 hc = r->http_connection;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
493
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
494 if (hc->free) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
495 cl = hc->free;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
496 hc->free = cl->next;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
497
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
498 b = cl->buf;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
499
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
500 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
501 "http large header free: %p %uz",
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
502 b->pos, b->end - b->last);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
503
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
504 } else {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
505 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
506
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
507 b = ngx_create_temp_buf(r->connection->pool,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
508 cscf->large_client_header_buffers.size);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
509 if (b == NULL) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
510 return NGX_ERROR;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
511 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
512
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
513 cl = ngx_alloc_chain_link(r->connection->pool);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
514 if (cl == NULL) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
515 return NGX_ERROR;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
516 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
517
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
518 cl->buf = b;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
519
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
520 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
521 "http large header alloc: %p %uz",
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
522 b->pos, b->end - b->last);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
523 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
524
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
525 cl->next = hc->busy;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
526 hc->busy = cl;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
527 hc->nbusy++;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
528
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
529 r->header_in = b;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
530
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
531 if (n > (size_t) (b->end - b->last)) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
532 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
533 "too large pipelined header after reading body");
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
534 return NGX_ERROR;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
535 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
536 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
537
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
538 ngx_memcpy(b->last, buf->pos, n);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
539
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
540 b->last += n;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
541 r->request_length -= n;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
542
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
543 return NGX_OK;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
544 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
545
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
546
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
547 static ngx_int_t
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
548 ngx_http_write_request_body(ngx_http_request_t *r)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
549 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
550 ssize_t n;
6047
e2e609f59094 Request body: free chain links in ngx_http_write_request_body().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6044
diff changeset
551 ngx_chain_t *cl, *ln;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
552 ngx_temp_file_t *tf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
553 ngx_http_request_body_t *rb;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
554 ngx_http_core_loc_conf_t *clcf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
555
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
556 rb = r->request_body;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
557
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
558 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
559 "http write client request body, bufs %p", rb->bufs);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
560
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
561 if (rb->temp_file == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
562 tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
563 if (tf == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
564 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
565 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
566
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
567 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
568
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
569 tf->file.fd = NGX_INVALID_FILE;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
570 tf->file.log = r->connection->log;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
571 tf->path = clcf->client_body_temp_path;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
572 tf->pool = r->pool;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
573 tf->warn = "a client request body is buffered to a temporary file";
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
574 tf->log_level = r->request_body_file_log_level;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
575 tf->persistent = r->request_body_in_persistent_file;
1075
4d203f76b757 undo "client_body_in_file_only any"
Igor Sysoev <igor@sysoev.ru>
parents: 1072
diff changeset
576 tf->clean = r->request_body_in_clean_file;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
577
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
578 if (r->request_body_file_group_access) {
1046
bb139aba3199 rename mode to access
Igor Sysoev <igor@sysoev.ru>
parents: 841
diff changeset
579 tf->access = 0660;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
580 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
581
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
582 rb->temp_file = tf;
4922
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
583
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
584 if (rb->bufs == NULL) {
4922
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
585 /* empty body with r->request_body_in_file_only */
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
586
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
587 if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
588 tf->persistent, tf->clean, tf->access)
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
589 != NGX_OK)
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
590 {
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
591 return NGX_ERROR;
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
592 }
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
593
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
594 return NGX_OK;
dfa586842962 Request body: code duplication reduced, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
595 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
596 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
597
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
598 if (rb->bufs == NULL) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
599 return NGX_OK;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
600 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
601
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
602 n = ngx_write_chain_to_temp_file(rb->temp_file, rb->bufs);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
603
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
604 /* TODO: n == 0 or not complete and level event */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
605
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
606 if (n == NGX_ERROR) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
607 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
608 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
609
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
610 rb->temp_file->offset += n;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
611
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
612 /* mark all buffers as written */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
613
6047
e2e609f59094 Request body: free chain links in ngx_http_write_request_body().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6044
diff changeset
614 for (cl = rb->bufs; cl; /* void */) {
e2e609f59094 Request body: free chain links in ngx_http_write_request_body().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6044
diff changeset
615
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
616 cl->buf->pos = cl->buf->last;
6047
e2e609f59094 Request body: free chain links in ngx_http_write_request_body().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6044
diff changeset
617
e2e609f59094 Request body: free chain links in ngx_http_write_request_body().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6044
diff changeset
618 ln = cl;
e2e609f59094 Request body: free chain links in ngx_http_write_request_body().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6044
diff changeset
619 cl = cl->next;
e2e609f59094 Request body: free chain links in ngx_http_write_request_body().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6044
diff changeset
620 ngx_free_chain(r->pool, ln);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
621 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
622
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
623 rb->bufs = NULL;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
624
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
625 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
626 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
627
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
628
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
629 ngx_int_t
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1369
diff changeset
630 ngx_http_discard_request_body(ngx_http_request_t *r)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
631 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
632 ssize_t size;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
633 ngx_int_t rc;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
634 ngx_event_t *rev;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
635
6496
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
636 if (r != r->main || r->discard_body || r->request_body) {
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
637 return NGX_OK;
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
638 }
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
639
6246
257b51c37c5a The HTTP/2 implementation (RFC 7240, 7241).
Valentin Bartenev <vbart@nginx.com>
parents: 6067
diff changeset
640 #if (NGX_HTTP_V2)
6496
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
641 if (r->stream) {
887cca40ba6a HTTP/2: rewritten handling of request body.
Valentin Bartenev <vbart@nginx.com>
parents: 6420
diff changeset
642 r->stream->skip_data = 1;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 5111
diff changeset
643 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 5111
diff changeset
644 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 5111
diff changeset
645 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents: 5111
diff changeset
646
8689
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
647 #if (NGX_HTTP_V3)
6bd8ed493b85 HTTP/3: refactored request body parser.
Roman Arutyunyan <arut@nginx.com>
parents: 8647
diff changeset
648 if (r->http_version == NGX_HTTP_VERSION_30) {
8529
eaea7dac3292 HTTP/3: drop the unwanted remainder of the request.
Roman Arutyunyan <arut@nginx.com>
parents: 8520
diff changeset
649 return NGX_OK;
eaea7dac3292 HTTP/3: drop the unwanted remainder of the request.
Roman Arutyunyan <arut@nginx.com>
parents: 8520
diff changeset
650 }
eaea7dac3292 HTTP/3: drop the unwanted remainder of the request.
Roman Arutyunyan <arut@nginx.com>
parents: 8520
diff changeset
651 #endif
eaea7dac3292 HTTP/3: drop the unwanted remainder of the request.
Roman Arutyunyan <arut@nginx.com>
parents: 8520
diff changeset
652
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
653 if (ngx_http_test_expect(r) != NGX_OK) {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
654 return NGX_HTTP_INTERNAL_SERVER_ERROR;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
655 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
656
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
657 rev = r->connection->read;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
658
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
659 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body");
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
660
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
661 if (rev->timer_set) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
662 ngx_del_timer(rev);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
663 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
664
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
665 if (r->headers_in.content_length_n <= 0 && !r->headers_in.chunked) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
666 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
667 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
668
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
669 size = r->header_in->last - r->header_in->pos;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
670
4934
b61edaa04342 Request body: fixed discard of chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4931
diff changeset
671 if (size || r->headers_in.chunked) {
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
672 rc = ngx_http_discard_request_body_filter(r, r->header_in);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
673
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
674 if (rc != NGX_OK) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
675 return rc;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
676 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
677
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
678 if (r->headers_in.content_length_n == 0) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
679 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
680 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
681 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
682
4935
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
683 rc = ngx_http_read_discarded_request_body(r);
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
684
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
685 if (rc == NGX_OK) {
4924
caca5603bded Request body: properly handle events while discarding body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4923
diff changeset
686 r->lingering_close = 0;
caca5603bded Request body: properly handle events while discarding body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4923
diff changeset
687 return NGX_OK;
caca5603bded Request body: properly handle events while discarding body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4923
diff changeset
688 }
caca5603bded Request body: properly handle events while discarding body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4923
diff changeset
689
4935
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
690 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
691 return rc;
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
692 }
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
693
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
694 /* rc == NGX_AGAIN */
4924
caca5603bded Request body: properly handle events while discarding body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4923
diff changeset
695
3214
798a7f1d3b2f restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents: 3213
diff changeset
696 r->read_event_handler = ngx_http_discarded_request_body_handler;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
697
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
698 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
699 return NGX_HTTP_INTERNAL_SERVER_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
700 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
701
4924
caca5603bded Request body: properly handle events while discarding body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4923
diff changeset
702 r->count++;
caca5603bded Request body: properly handle events while discarding body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4923
diff changeset
703 r->discard_body = 1;
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
704
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
705 return NGX_OK;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
706 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
707
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
708
3214
798a7f1d3b2f restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents: 3213
diff changeset
709 void
798a7f1d3b2f restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents: 3213
diff changeset
710 ngx_http_discarded_request_body_handler(ngx_http_request_t *r)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
711 {
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
712 ngx_int_t rc;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
713 ngx_msec_t timer;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
714 ngx_event_t *rev;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
715 ngx_connection_t *c;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
716 ngx_http_core_loc_conf_t *clcf;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
717
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
718 c = r->connection;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
719 rev = c->read;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
720
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
721 if (rev->timedout) {
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
722 c->timedout = 1;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
723 c->error = 1;
3213
7fc06314c684 fix ngx_http_finalize_request() code after a body has been discarded
Igor Sysoev <igor@sysoev.ru>
parents: 3212
diff changeset
724 ngx_http_finalize_request(r, NGX_ERROR);
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
725 return;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
726 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
727
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
728 if (r->lingering_time) {
5210
ea2ba6dbe361 Fixed lingering_time check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5199
diff changeset
729 timer = (ngx_msec_t) r->lingering_time - (ngx_msec_t) ngx_time();
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
730
5210
ea2ba6dbe361 Fixed lingering_time check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5199
diff changeset
731 if ((ngx_msec_int_t) timer <= 0) {
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
732 r->discard_body = 0;
3181
36f6407817dc clear r->lingering_close to disable preventively calling
Igor Sysoev <igor@sysoev.ru>
parents: 3179
diff changeset
733 r->lingering_close = 0;
3213
7fc06314c684 fix ngx_http_finalize_request() code after a body has been discarded
Igor Sysoev <igor@sysoev.ru>
parents: 3212
diff changeset
734 ngx_http_finalize_request(r, NGX_ERROR);
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
735 return;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
736 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
737
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
738 } else {
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
739 timer = 0;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
740 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
741
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1369
diff changeset
742 rc = ngx_http_read_discarded_request_body(r);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
743
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
744 if (rc == NGX_OK) {
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
745 r->discard_body = 0;
3181
36f6407817dc clear r->lingering_close to disable preventively calling
Igor Sysoev <igor@sysoev.ru>
parents: 3179
diff changeset
746 r->lingering_close = 0;
7738
554c6ae25ffc SSL: fixed non-working SSL shutdown on lingering close.
Ruslan Ermilov <ru@nginx.com>
parents: 7693
diff changeset
747 r->lingering_time = 0;
3213
7fc06314c684 fix ngx_http_finalize_request() code after a body has been discarded
Igor Sysoev <igor@sysoev.ru>
parents: 3212
diff changeset
748 ngx_http_finalize_request(r, NGX_DONE);
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
749 return;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
750 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
751
4935
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
752 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
753 c->error = 1;
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
754 ngx_http_finalize_request(r, NGX_ERROR);
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
755 return;
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
756 }
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
757
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
758 /* rc == NGX_AGAIN */
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
759
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
760 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
1456
698ea64f71e1 fix unlikely socket leak
Igor Sysoev <igor@sysoev.ru>
parents: 1455
diff changeset
761 c->error = 1;
3213
7fc06314c684 fix ngx_http_finalize_request() code after a body has been discarded
Igor Sysoev <igor@sysoev.ru>
parents: 3212
diff changeset
762 ngx_http_finalize_request(r, NGX_ERROR);
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
763 return;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
764 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
765
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
766 if (timer) {
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
767
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
768 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
769
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
770 timer *= 1000;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
771
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
772 if (timer > clcf->lingering_timeout) {
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
773 timer = clcf->lingering_timeout;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
774 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
775
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
776 ngx_add_timer(rev, timer);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
777 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
778 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
779
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
780
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
781 static ngx_int_t
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1369
diff changeset
782 ngx_http_read_discarded_request_body(ngx_http_request_t *r)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
783 {
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
784 size_t size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
785 ssize_t n;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
786 ngx_int_t rc;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
787 ngx_buf_t b;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
788 u_char buffer[NGX_HTTP_DISCARD_BUFFER_SIZE];
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
789
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
790 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
791 "http read discarded body");
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
792
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
793 ngx_memzero(&b, sizeof(ngx_buf_t));
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
794
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
795 b.temporary = 1;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
796
3162
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
797 for ( ;; ) {
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
798 if (r->headers_in.content_length_n == 0) {
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
799 break;
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
800 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
801
3162
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
802 if (!r->connection->read->ready) {
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
803 return NGX_AGAIN;
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
804 }
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
805
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
806 size = (size_t) ngx_min(r->headers_in.content_length_n,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
807 NGX_HTTP_DISCARD_BUFFER_SIZE);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
808
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
809 n = r->connection->recv(r->connection, buffer, size);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
810
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
811 if (n == NGX_ERROR) {
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
812 r->connection->error = 1;
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
813 return NGX_OK;
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
814 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
815
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
816 if (n == NGX_AGAIN) {
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
817 return NGX_AGAIN;
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
818 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
819
1422
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
820 if (n == 0) {
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
821 return NGX_OK;
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
822 }
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
823
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
824 b.pos = buffer;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
825 b.last = buffer + n;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
826
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
827 rc = ngx_http_discard_request_body_filter(r, &b);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
828
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
829 if (rc != NGX_OK) {
4935
7bd1c839af3b Request body: improved handling of incorrect chunked request body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4934
diff changeset
830 return rc;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
831 }
3162
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
832 }
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
833
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
834 if (ngx_http_copy_pipelined_header(r, &b) != NGX_OK) {
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
835 return NGX_HTTP_INTERNAL_SERVER_ERROR;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
836 }
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
837
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
838 r->read_event_handler = ngx_http_block_reading;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
839
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
840 return NGX_OK;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
841 }
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
842
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
843
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
844 static ngx_int_t
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
845 ngx_http_discard_request_body_filter(ngx_http_request_t *r, ngx_buf_t *b)
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
846 {
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
847 size_t size;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
848 ngx_int_t rc;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
849 ngx_http_request_body_t *rb;
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
850 ngx_http_core_srv_conf_t *cscf;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
851
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
852 if (r->headers_in.chunked) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
853
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
854 rb = r->request_body;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
855
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
856 if (rb == NULL) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
857
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
858 rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
859 if (rb == NULL) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
860 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
861 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
862
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
863 rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));
4936
240e3fb392c9 Request body: error checking fixes, negative rb->rest handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4935
diff changeset
864 if (rb->chunked == NULL) {
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
865 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
866 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
867
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
868 r->request_body = rb;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
869 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
870
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
871 for ( ;; ) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
872
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
873 rc = ngx_http_parse_chunked(r, b, rb->chunked);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
874
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
875 if (rc == NGX_OK) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
876
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
877 /* a chunk has been parsed successfully */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
878
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
879 size = b->last - b->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
880
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
881 if ((off_t) size > rb->chunked->size) {
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5210
diff changeset
882 b->pos += (size_t) rb->chunked->size;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
883 rb->chunked->size = 0;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
884
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
885 } else {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
886 rb->chunked->size -= size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
887 b->pos = b->last;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
888 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
889
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
890 continue;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
891 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
892
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
893 if (rc == NGX_DONE) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
894
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
895 /* a whole response has been parsed successfully */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
896
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
897 r->headers_in.content_length_n = 0;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
898 break;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
899 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
900
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
901 if (rc == NGX_AGAIN) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
902
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
903 /* set amount of data we want to see next time */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
904
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
905 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
906
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
907 r->headers_in.content_length_n = ngx_max(rb->chunked->length,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
908 (off_t) cscf->large_client_header_buffers.size);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
909 break;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
910 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
911
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
912 /* invalid */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
913
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
914 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
915 "client sent invalid chunked body");
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
916
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
917 return NGX_HTTP_BAD_REQUEST;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
918 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
919
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
920 } else {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
921 size = b->last - b->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
922
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
923 if ((off_t) size > r->headers_in.content_length_n) {
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5210
diff changeset
924 b->pos += (size_t) r->headers_in.content_length_n;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
925 r->headers_in.content_length_n = 0;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
926
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
927 } else {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
928 b->pos = b->last;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
929 r->headers_in.content_length_n -= size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
930 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
931 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
932
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
933 return NGX_OK;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
934 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
935
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
936
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
937 static ngx_int_t
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
938 ngx_http_test_expect(ngx_http_request_t *r)
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
939 {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
940 ngx_int_t n;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
941 ngx_str_t *expect;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
942
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
943 if (r->expect_tested
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
944 || r->headers_in.expect == NULL
8295
5649079a41f4 Parsing HTTP/3 request body.
Roman Arutyunyan <arut@nginx.com>
parents: 6989
diff changeset
945 || r->http_version != NGX_HTTP_VERSION_11)
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
946 {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
947 return NGX_OK;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
948 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
949
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
950 r->expect_tested = 1;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
951
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
952 expect = &r->headers_in.expect->value;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
953
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
954 if (expect->len != sizeof("100-continue") - 1
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
955 || ngx_strncasecmp(expect->data, (u_char *) "100-continue",
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
956 sizeof("100-continue") - 1)
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
957 != 0)
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
958 {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
959 return NGX_OK;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
960 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
961
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
962 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
963 "send 100 Continue");
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
964
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
965 n = r->connection->send(r->connection,
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
966 (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF,
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
967 sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1);
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
968
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
969 if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
970 return NGX_OK;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
971 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
972
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
973 /* we assume that such small packet should be send successfully */
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
974
6903
92e771de7d89 Request body: c->error on "100 Continue" errors (ticket #1194).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6497
diff changeset
975 r->connection->error = 1;
92e771de7d89 Request body: c->error on "100 Continue" errors (ticket #1194).
Maxim Dounin <mdounin@mdounin.ru>
parents: 6497
diff changeset
976
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
977 return NGX_ERROR;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
978 }
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
979
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
980
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
981 static ngx_int_t
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
982 ngx_http_request_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
983 {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
984 if (r->headers_in.chunked) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
985 return ngx_http_request_body_chunked_filter(r, in);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
986
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
987 } else {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
988 return ngx_http_request_body_length_filter(r, in);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
989 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
990 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
991
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
992
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
993 static ngx_int_t
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
994 ngx_http_request_body_length_filter(ngx_http_request_t *r, ngx_chain_t *in)
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
995 {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
996 size_t size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
997 ngx_int_t rc;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
998 ngx_buf_t *b;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
999 ngx_chain_t *cl, *tl, *out, **ll;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1000 ngx_http_request_body_t *rb;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1001
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1002 rb = r->request_body;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1003
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1004 out = NULL;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1005 ll = &out;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1006
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1007 if (rb->rest == -1) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1008 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1009 "http request body content length filter");
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1010
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1011 rb->rest = r->headers_in.content_length_n;
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1012
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1013 if (rb->rest == 0) {
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1014
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1015 tl = ngx_chain_get_free_buf(r->pool, &rb->free);
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1016 if (tl == NULL) {
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1017 return NGX_HTTP_INTERNAL_SERVER_ERROR;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1018 }
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1019
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1020 b = tl->buf;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1021
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1022 ngx_memzero(b, sizeof(ngx_buf_t));
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1023
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1024 b->last_buf = 1;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1025
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1026 *ll = tl;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1027 ll = &tl->next;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1028 }
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1029 }
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1030
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1031 for (cl = in; cl; cl = cl->next) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1032
5502
4aa64f695031 Fixed "zero size buf in output" alerts.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5440
diff changeset
1033 if (rb->rest == 0) {
4aa64f695031 Fixed "zero size buf in output" alerts.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5440
diff changeset
1034 break;
4aa64f695031 Fixed "zero size buf in output" alerts.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5440
diff changeset
1035 }
4aa64f695031 Fixed "zero size buf in output" alerts.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5440
diff changeset
1036
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1037 tl = ngx_chain_get_free_buf(r->pool, &rb->free);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1038 if (tl == NULL) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1039 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1040 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1041
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1042 b = tl->buf;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1043
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1044 ngx_memzero(b, sizeof(ngx_buf_t));
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1045
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1046 b->temporary = 1;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1047 b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;
5110
0bbdd966a383 Request body: next upstream fix.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5025
diff changeset
1048 b->start = cl->buf->pos;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1049 b->pos = cl->buf->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1050 b->last = cl->buf->last;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1051 b->end = cl->buf->end;
6067
231a5bbd9e9c Request body: always flush buffers if request buffering is off.
Valentin Bartenev <vbart@nginx.com>
parents: 6050
diff changeset
1052 b->flush = r->request_body_no_buffering;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1053
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1054 size = cl->buf->last - cl->buf->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1055
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1056 if ((off_t) size < rb->rest) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1057 cl->buf->pos = cl->buf->last;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1058 rb->rest -= size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1059
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1060 } else {
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5210
diff changeset
1061 cl->buf->pos += (size_t) rb->rest;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1062 rb->rest = 0;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1063 b->last = cl->buf->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1064 b->last_buf = 1;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1065 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1066
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1067 *ll = tl;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1068 ll = &tl->next;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1069 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1070
6049
42d9beeb22db Request body: filters support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6048
diff changeset
1071 rc = ngx_http_top_request_body_filter(r, out);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1072
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1073 ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1074 (ngx_buf_tag_t) &ngx_http_read_client_request_body);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1075
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1076 return rc;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1077 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1078
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1079
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1080 static ngx_int_t
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1081 ngx_http_request_body_chunked_filter(ngx_http_request_t *r, ngx_chain_t *in)
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1082 {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1083 size_t size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1084 ngx_int_t rc;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1085 ngx_buf_t *b;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1086 ngx_chain_t *cl, *out, *tl, **ll;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1087 ngx_http_request_body_t *rb;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1088 ngx_http_core_loc_conf_t *clcf;
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1089 ngx_http_core_srv_conf_t *cscf;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1090
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1091 rb = r->request_body;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1092
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1093 out = NULL;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1094 ll = &out;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1095
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1096 if (rb->rest == -1) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1097
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1098 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1099 "http request body chunked filter");
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1100
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1101 rb->chunked = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_t));
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1102 if (rb->chunked == NULL) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1103 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1104 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1105
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1106 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1107
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1108 r->headers_in.content_length_n = 0;
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1109 rb->rest = cscf->large_client_header_buffers.size;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1110 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1111
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1112 for (cl = in; cl; cl = cl->next) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1113
7693
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1114 b = NULL;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1115
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1116 for ( ;; ) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1117
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1118 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1119 "http body chunked buf "
6044
b8926ba4d087 Format specifier fixed for file size of buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5588
diff changeset
1120 "t:%d f:%d %p, pos %p, size: %z file: %O, size: %O",
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1121 cl->buf->temporary, cl->buf->in_file,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1122 cl->buf->start, cl->buf->pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1123 cl->buf->last - cl->buf->pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1124 cl->buf->file_pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1125 cl->buf->file_last - cl->buf->file_pos);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1126
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1127 rc = ngx_http_parse_chunked(r, cl->buf, rb->chunked);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1128
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1129 if (rc == NGX_OK) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1130
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1131 /* a chunk has been parsed successfully */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1132
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1133 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1134
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1135 if (clcf->client_max_body_size
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1136 && clcf->client_max_body_size
5588
6fc3921025f0 Request body: avoid potential overflow.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5502
diff changeset
1137 - r->headers_in.content_length_n < rb->chunked->size)
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1138 {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1139 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1140 "client intended to send too large chunked "
5588
6fc3921025f0 Request body: avoid potential overflow.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5502
diff changeset
1141 "body: %O+%O bytes",
6fc3921025f0 Request body: avoid potential overflow.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5502
diff changeset
1142 r->headers_in.content_length_n,
6fc3921025f0 Request body: avoid potential overflow.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5502
diff changeset
1143 rb->chunked->size);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1144
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1145 r->lingering_close = 1;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1146
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1147 return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1148 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1149
7693
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1150 if (b
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1151 && rb->chunked->size <= 128
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1152 && cl->buf->last - cl->buf->pos >= rb->chunked->size)
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1153 {
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1154 r->headers_in.content_length_n += rb->chunked->size;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1155
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1156 if (rb->chunked->size < 8) {
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1157
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1158 while (rb->chunked->size) {
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1159 *b->last++ = *cl->buf->pos++;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1160 rb->chunked->size--;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1161 }
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1162
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1163 } else {
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1164 ngx_memmove(b->last, cl->buf->pos, rb->chunked->size);
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1165 b->last += rb->chunked->size;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1166 cl->buf->pos += rb->chunked->size;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1167 rb->chunked->size = 0;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1168 }
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1169
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1170 continue;
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1171 }
f5a2af0e7079 Request body: optimized handling of small chunks.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7692
diff changeset
1172
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1173 tl = ngx_chain_get_free_buf(r->pool, &rb->free);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1174 if (tl == NULL) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1175 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1176 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1177
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1178 b = tl->buf;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1179
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1180 ngx_memzero(b, sizeof(ngx_buf_t));
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1181
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1182 b->temporary = 1;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1183 b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body;
5110
0bbdd966a383 Request body: next upstream fix.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5025
diff changeset
1184 b->start = cl->buf->pos;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1185 b->pos = cl->buf->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1186 b->last = cl->buf->last;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1187 b->end = cl->buf->end;
6067
231a5bbd9e9c Request body: always flush buffers if request buffering is off.
Valentin Bartenev <vbart@nginx.com>
parents: 6050
diff changeset
1188 b->flush = r->request_body_no_buffering;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1189
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1190 *ll = tl;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1191 ll = &tl->next;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1192
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1193 size = cl->buf->last - cl->buf->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1194
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1195 if ((off_t) size > rb->chunked->size) {
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5210
diff changeset
1196 cl->buf->pos += (size_t) rb->chunked->size;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1197 r->headers_in.content_length_n += rb->chunked->size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1198 rb->chunked->size = 0;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1199
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1200 } else {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1201 rb->chunked->size -= size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1202 r->headers_in.content_length_n += size;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1203 cl->buf->pos = cl->buf->last;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1204 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1205
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1206 b->last = cl->buf->pos;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1207
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1208 continue;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1209 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1210
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1211 if (rc == NGX_DONE) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1212
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1213 /* a whole response has been parsed successfully */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1214
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1215 rb->rest = 0;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1216
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1217 tl = ngx_chain_get_free_buf(r->pool, &rb->free);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1218 if (tl == NULL) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1219 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1220 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1221
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1222 b = tl->buf;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1223
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1224 ngx_memzero(b, sizeof(ngx_buf_t));
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1225
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1226 b->last_buf = 1;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1227
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1228 *ll = tl;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1229 ll = &tl->next;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1230
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1231 break;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1232 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1233
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1234 if (rc == NGX_AGAIN) {
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1235
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1236 /* set rb->rest, amount of data we want to see next time */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1237
7692
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1238 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1239
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1240 rb->rest = ngx_max(rb->chunked->length,
0f7f1a509113 Request body: allowed large reads on chunk boundaries.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7691
diff changeset
1241 (off_t) cscf->large_client_header_buffers.size);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1242
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1243 break;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1244 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1245
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1246 /* invalid */
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1247
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1248 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1249 "client sent invalid chunked body");
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1250
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1251 return NGX_HTTP_BAD_REQUEST;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1252 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1253 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1254
6049
42d9beeb22db Request body: filters support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6048
diff changeset
1255 rc = ngx_http_top_request_body_filter(r, out);
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1256
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1257 ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1258 (ngx_buf_tag_t) &ngx_http_read_client_request_body);
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1259
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1260 return rc;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1261 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1262
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1263
6049
42d9beeb22db Request body: filters support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6048
diff changeset
1264 ngx_int_t
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1265 ngx_http_request_body_save_filter(ngx_http_request_t *r, ngx_chain_t *in)
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1266 {
6420
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1267 ngx_buf_t *b;
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1268 ngx_chain_t *cl, *tl, **ll;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1269 ngx_http_request_body_t *rb;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1270
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1271 rb = r->request_body;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1272
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1273 ll = &rb->bufs;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1274
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1275 for (cl = rb->bufs; cl; cl = cl->next) {
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1276
6904
5e2423bce883 Request body: commented out debug printing of old buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6903
diff changeset
1277 #if 0
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1278 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1279 "http body old buf t:%d f:%d %p, pos %p, size: %z "
6044
b8926ba4d087 Format specifier fixed for file size of buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5588
diff changeset
1280 "file: %O, size: %O",
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1281 cl->buf->temporary, cl->buf->in_file,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1282 cl->buf->start, cl->buf->pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1283 cl->buf->last - cl->buf->pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1284 cl->buf->file_pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1285 cl->buf->file_last - cl->buf->file_pos);
6904
5e2423bce883 Request body: commented out debug printing of old buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6903
diff changeset
1286 #endif
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1287
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1288 ll = &cl->next;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1289 }
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1290
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1291 for (cl = in; cl; cl = cl->next) {
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1292
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1293 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1294 "http body new buf t:%d f:%d %p, pos %p, size: %z "
6044
b8926ba4d087 Format specifier fixed for file size of buffers.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5588
diff changeset
1295 "file: %O, size: %O",
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1296 cl->buf->temporary, cl->buf->in_file,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1297 cl->buf->start, cl->buf->pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1298 cl->buf->last - cl->buf->pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1299 cl->buf->file_pos,
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1300 cl->buf->file_last - cl->buf->file_pos);
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1301
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1302 if (cl->buf->last_buf) {
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1303
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1304 if (rb->last_saved) {
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1305 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1306 "duplicate last buf in save filter");
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1307 *ll = NULL;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1308 return NGX_HTTP_INTERNAL_SERVER_ERROR;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1309 }
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1310
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1311 rb->last_saved = 1;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1312 }
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1313
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1314 tl = ngx_alloc_chain_link(r->pool);
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1315 if (tl == NULL) {
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1316 *ll = NULL;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1317 return NGX_HTTP_INTERNAL_SERVER_ERROR;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1318 }
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1319
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1320 tl->buf = cl->buf;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1321 *ll = tl;
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1322 ll = &tl->next;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1323 }
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1324
7913
185c86b830ef Request body: introduced rb->last_saved flag.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7912
diff changeset
1325 *ll = NULL;
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1326
6420
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1327 if (r->request_body_no_buffering) {
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1328 return NGX_OK;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1329 }
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1330
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1331 if (rb->rest > 0) {
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1332
7928
97cf8284fd19 Request body: do not create temp file if there's nothing to write.
Roman Arutyunyan <arut@nginx.com>
parents: 7914
diff changeset
1333 if (rb->bufs && rb->buf && rb->buf->last == rb->buf->end
6420
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1334 && ngx_http_write_request_body(r) != NGX_OK)
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1335 {
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1336 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1337 }
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1338
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1339 return NGX_OK;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1340 }
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1341
7914
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
1342 if (!rb->last_saved) {
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
1343 return NGX_OK;
9cf043a5d9ca Request body: reading body buffering in filters.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7913
diff changeset
1344 }
6420
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1345
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1346 if (rb->temp_file || r->request_body_in_file_only) {
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1347
7912
96e09beaa2cf Request body: added alert to catch duplicate body saving.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7911
diff changeset
1348 if (rb->bufs && rb->bufs->buf->in_file) {
96e09beaa2cf Request body: added alert to catch duplicate body saving.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7911
diff changeset
1349 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
96e09beaa2cf Request body: added alert to catch duplicate body saving.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7911
diff changeset
1350 "body already in file");
96e09beaa2cf Request body: added alert to catch duplicate body saving.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7911
diff changeset
1351 return NGX_HTTP_INTERNAL_SERVER_ERROR;
96e09beaa2cf Request body: added alert to catch duplicate body saving.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7911
diff changeset
1352 }
96e09beaa2cf Request body: added alert to catch duplicate body saving.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7911
diff changeset
1353
6048
9e231d4cecca Request body: moved request body writing to save filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6047
diff changeset
1354 if (ngx_http_write_request_body(r) != NGX_OK) {
9e231d4cecca Request body: moved request body writing to save filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6047
diff changeset
1355 return NGX_HTTP_INTERNAL_SERVER_ERROR;
9e231d4cecca Request body: moved request body writing to save filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6047
diff changeset
1356 }
6420
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1357
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1358 if (rb->temp_file->file.offset != 0) {
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1359
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1360 cl = ngx_chain_get_free_buf(r->pool, &rb->free);
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1361 if (cl == NULL) {
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1362 return NGX_HTTP_INTERNAL_SERVER_ERROR;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1363 }
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1364
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1365 b = cl->buf;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1366
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1367 ngx_memzero(b, sizeof(ngx_buf_t));
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1368
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1369 b->in_file = 1;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1370 b->file_last = rb->temp_file->file.offset;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1371 b->file = &rb->temp_file->file;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1372
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1373 rb->bufs = cl;
3b9fe734a76c Request body: moved handling of the last part in the save filter.
Valentin Bartenev <vbart@nginx.com>
parents: 6336
diff changeset
1374 }
6048
9e231d4cecca Request body: moved request body writing to save filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6047
diff changeset
1375 }
9e231d4cecca Request body: moved request body writing to save filter.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6047
diff changeset
1376
4930
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1377 return NGX_OK;
6f085bfcdb4d Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4924
diff changeset
1378 }