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