annotate src/http/ngx_http_request_body.c @ 4957:7556a7acb14f stable-1.2

Merge of r4921, r4922, r4923, r4924, r4925: request body fixes. *) Request body: fixed "501 Not Implemented" error handling. It is not about "Method" but a generic message, and is expected to be used e.g. if specified Transfer-Encoding is not supported. Fixed message to match RFC 2616. Additionally, disable keepalive on such errors as we won't be able to read request body correctly if we don't understand Transfer-Encoding used. *) Request body: $request_body variable generalization. The $request_body variable was assuming there can't be more than two buffers. While this is currently true due to request body reading implementation details, this is not a good thing to depend on and may change in the future. *) Request body: code duplication reduced, no functional changes. The r->request_body_in_file_only with empty body case is now handled in ngx_http_write_request_body(). *) Request body: fixed socket leak on errors. The r->main->count reference counter was always incremented in ngx_http_read_client_request_body(), while it is only needs to be incremented on positive returns. *) Request body: properly handle events while discarding body. An attempt to call ngx_handle_read_event() before actually reading data from a socket might result in read event being disabled, which is wrong. Catched by body.t test on Solaris.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 11 Dec 2012 13:18:50 +0000
parents 834049edae24
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4072
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 396
diff changeset
6
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
8 #include <ngx_config.h>
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
9 #include <ngx_core.h>
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
10 #include <ngx_http.h>
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
13 static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
14 static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
15 static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
16 ngx_chain_t *body);
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1369
diff changeset
17 static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r);
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
18 static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
19
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
20
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
21 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
22 * on completion ngx_http_read_client_request_body() adds to
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
23 * r->request_body->bufs one or two bufs:
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
24 * *) one memory buf that was preread in r->header_in;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
25 * *) one memory or file buf that contains the rest of the body
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
26 */
83
a7e45c45a95c nginx-0.0.1-2003-04-28-19:06:39 import
Igor Sysoev <igor@sysoev.ru>
parents: 82
diff changeset
27
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
28 ngx_int_t
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
29 ngx_http_read_client_request_body(ngx_http_request_t *r,
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
30 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
31 {
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
32 size_t preread;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
33 ssize_t size;
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
34 ngx_int_t rc;
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 303
diff changeset
35 ngx_buf_t *b;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
36 ngx_chain_t *cl, **next;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
37 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
38 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
39
3049
67254117b774 request reference counter
Igor Sysoev <igor@sysoev.ru>
parents: 2436
diff changeset
40 r->main->count++;
67254117b774 request reference counter
Igor Sysoev <igor@sysoev.ru>
parents: 2436
diff changeset
41
537
c9ad0d9c7d59 nginx-0.1.43-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 527
diff changeset
42 if (r->request_body || r->discard_body) {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
43 post_handler(r);
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
44 return NGX_OK;
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
45 }
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
46
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
47 if (ngx_http_test_expect(r) != NGX_OK) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
48 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
49 goto done;
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
50 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
51
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
52 rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
53 if (rb == NULL) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
54 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
55 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
56 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
57
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
58 r->request_body = rb;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
59
725
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
60 if (r->headers_in.content_length_n < 0) {
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
61 post_handler(r);
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
62 return NGX_OK;
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
63 }
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
64
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
65 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
66
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
67 if (r->headers_in.content_length_n == 0) {
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
68
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
69 if (r->request_body_in_file_only) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
70 if (ngx_http_write_request_body(r, NULL) != NGX_OK) {
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
71 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
72 goto done;
725
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
73 }
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
74 }
86862ad988da fix segfault when zero length file is PUT
Igor Sysoev <igor@sysoev.ru>
parents: 681
diff changeset
75
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
76 post_handler(r);
1290
4e6903652363 style fix
Igor Sysoev <igor@sysoev.ru>
parents: 1112
diff changeset
77
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
78 return NGX_OK;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
79 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
80
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
81 rb->post_handler = post_handler;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
82
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
83 /*
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
84 * set by ngx_pcalloc():
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
85 *
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
86 * rb->bufs = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
87 * rb->buf = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
88 * rb->rest = 0;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
89 */
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
90
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
91 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
92
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
93 if (preread) {
296
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
94
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
95 /* 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
96
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
97 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
98 "http client request body preread %uz", preread);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
99
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
100 b = ngx_calloc_buf(r->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
101 if (b == NULL) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
102 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
103 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
104 }
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 303
diff changeset
106 b->temporary = 1;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
107 b->start = r->header_in->pos;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
108 b->pos = r->header_in->pos;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
109 b->last = r->header_in->last;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
110 b->end = r->header_in->end;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
112 rb->bufs = ngx_alloc_chain_link(r->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
113 if (rb->bufs == NULL) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
114 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
115 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
116 }
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
117
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
118 rb->bufs->buf = b;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
119 rb->bufs->next = NULL;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
120
667
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
121 rb->buf = b;
63a820b0bc6c nginx-0.3.55-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 665
diff changeset
122
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
123 if ((off_t) preread >= r->headers_in.content_length_n) {
296
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
124
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
125 /* the whole request body was pre-read */
bfe099e3f5b4 nginx-0.0.3-2004-03-26-19:13:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 294
diff changeset
126
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
127 r->header_in->pos += (size_t) r->headers_in.content_length_n;
475
c3c2848fc081 nginx-0.1.12-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 461
diff changeset
128 r->request_length += r->headers_in.content_length_n;
4005
e56c1e9873cb Correctly set body if it's preread and there are extra data.
Maxim Dounin <mdounin@mdounin.ru>
parents: 3214
diff changeset
129 b->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
130
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
131 if (r->request_body_in_file_only) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
132 if (ngx_http_write_request_body(r, rb->bufs) != NGX_OK) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
133 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
134 goto done;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
135 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
136 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
137
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
138 post_handler(r);
299
46b7eeb8a116 nginx-0.0.3-2004-03-30-19:59:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
139
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
140 return NGX_OK;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 }
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
142
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
143 /*
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
144 * to not consider the body as pipelined request in
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
145 * ngx_http_set_keepalive()
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
146 */
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
147 r->header_in->pos = r->header_in->last;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
148
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
149 r->request_length += preread;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
150
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
151 rb->rest = r->headers_in.content_length_n - preread;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
152
665
5fd7a5e99047 nginx-0.3.54-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 663
diff changeset
153 if (rb->rest <= (off_t) (b->end - b->last)) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
154
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
155 /* the whole request body may be placed in r->header_in */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
156
1065
9039e845e532 fix segfault when a request body fits in r->header_in and
Igor Sysoev <igor@sysoev.ru>
parents: 1046
diff changeset
157 rb->to_write = rb->bufs;
9039e845e532 fix segfault when a request body fits in r->header_in and
Igor Sysoev <igor@sysoev.ru>
parents: 1046
diff changeset
158
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
159 r->read_event_handler = ngx_http_read_client_request_body_handler;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
160
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
161 rc = ngx_http_do_read_client_request_body(r);
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
162 goto done;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
163 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
164
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
165 next = &rb->bufs->next;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
166
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
167 } else {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
168 b = NULL;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
169 rb->rest = r->headers_in.content_length_n;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
170 next = &rb->bufs;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
173 size = clcf->client_body_buffer_size;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
174 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
175
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
176 if (rb->rest < size) {
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
177 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
178
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
179 if (r->request_body_in_single_buf) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
180 size += preread;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
181 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
182
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
183 } else {
303
00c5660d2707 nginx-0.0.3-2004-04-01-20:20:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 299
diff changeset
184 size = clcf->client_body_buffer_size;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
185
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
186 /* disable copying buffer for r->request_body_in_single_buf */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
187 b = NULL;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
188 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
189
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
190 rb->buf = ngx_create_temp_buf(r->pool, size);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
191 if (rb->buf == NULL) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
192 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
193 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
194 }
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
195
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
196 cl = ngx_alloc_chain_link(r->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
197 if (cl == NULL) {
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
198 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
199 goto done;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
200 }
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
201
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
202 cl->buf = rb->buf;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
203 cl->next = NULL;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
204
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
205 if (b && r->request_body_in_single_buf) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
206 size = b->last - b->pos;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
207 ngx_memcpy(rb->buf->pos, b->pos, size);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
208 rb->buf->last += size;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
209
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
210 next = &rb->bufs;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
211 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
212
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
213 *next = cl;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
214
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
215 if (r->request_body_in_file_only || r->request_body_in_single_buf) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
216 rb->to_write = rb->bufs;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
217
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
218 } else {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
219 rb->to_write = rb->bufs->next ? rb->bufs->next : rb->bufs;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
220 }
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
221
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
222 r->read_event_handler = ngx_http_read_client_request_body_handler;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
224 rc = ngx_http_do_read_client_request_body(r);
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
225
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
226 done:
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
227
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
228 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
229 r->main->count--;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
230 }
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
231
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
232 return rc;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
236 static void
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
237 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
238 {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
239 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
240
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
241 if (r->connection->read->timedout) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 573
diff changeset
242 r->connection->timedout = 1;
1075
4d203f76b757 undo "client_body_in_file_only any"
Igor Sysoev <igor@sysoev.ru>
parents: 1072
diff changeset
243 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
244 return;
46b7eeb8a116 nginx-0.0.3-2004-03-30-19:59:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
245 }
46b7eeb8a116 nginx-0.0.3-2004-03-30-19:59:50 import
Igor Sysoev <igor@sysoev.ru>
parents: 297
diff changeset
246
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
247 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
248
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
249 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
1075
4d203f76b757 undo "client_body_in_file_only any"
Igor Sysoev <igor@sysoev.ru>
parents: 1072
diff changeset
250 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
251 }
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
252 }
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
253
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
254
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
255 static ngx_int_t
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
256 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
257 {
290
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
258 size_t size;
87e73f067470 nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents: 171
diff changeset
259 ssize_t n;
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 303
diff changeset
260 ngx_buf_t *b;
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
261 ngx_connection_t *c;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
262 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
263 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
264
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
265 c = r->connection;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
266 rb = r->request_body;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
268 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
269 "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
270
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
271 for ( ;; ) {
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
272 for ( ;; ) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
273 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
274
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
275 if (ngx_http_write_request_body(r, rb->to_write) != NGX_OK) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
276 return NGX_HTTP_INTERNAL_SERVER_ERROR;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
277 }
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
278
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
279 rb->to_write = rb->bufs->next ? rb->bufs->next : rb->bufs;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
280 rb->buf->last = rb->buf->start;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
281 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
282
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
283 size = rb->buf->end - rb->buf->last;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
284
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
285 if ((off_t) size > rb->rest) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
286 size = (size_t) rb->rest;
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
287 }
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
288
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
289 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
290
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
291 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
292 "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
293
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
294 if (n == NGX_AGAIN) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
295 break;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
296 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
297
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
298 if (n == 0) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
299 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
300 "client prematurely closed connection");
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
301 }
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
302
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
303 if (n == 0 || n == NGX_ERROR) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
304 c->error = 1;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
305 return NGX_HTTP_BAD_REQUEST;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
306 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
307
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
308 rb->buf->last += n;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
309 rb->rest -= n;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
310 r->request_length += n;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
311
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
312 if (rb->rest == 0) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
313 break;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
314 }
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
315
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
316 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
317 break;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
318 }
292
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
319 }
a472bfb778b3 nginx-0.0.3-2004-03-17-00:26:01 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
320
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
321 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
1112
3dcc3041b5bc fix format
Igor Sysoev <igor@sysoev.ru>
parents: 1075
diff changeset
322 "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
323
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
324 if (rb->rest == 0) {
294
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 293
diff changeset
325 break;
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 293
diff changeset
326 }
5cfd65b8b0a7 nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents: 293
diff changeset
327
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
328 if (!c->read->ready) {
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
329 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
330 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
331
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
332 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
333 return NGX_HTTP_INTERNAL_SERVER_ERROR;
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
334 }
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
335
841
790ed4eb762e fix big client body receiving with deferred accept()
Igor Sysoev <igor@sysoev.ru>
parents: 725
diff changeset
336 return NGX_AGAIN;
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
337 }
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
573
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
340 if (c->read->timer_set) {
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
341 ngx_del_timer(c->read);
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
342 }
58475592100c nginx-0.3.8-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 537
diff changeset
343
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
344 if (rb->temp_file || r->request_body_in_file_only) {
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
346 /* save the last part */
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
347
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
348 if (ngx_http_write_request_body(r, rb->to_write) != NGX_OK) {
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
349 return NGX_HTTP_INTERNAL_SERVER_ERROR;
162
96993d4d5067 nginx-0.0.1-2003-10-28-00:01:00 import
Igor Sysoev <igor@sysoev.ru>
parents: 160
diff changeset
350 }
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
351
501
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
352 b = ngx_calloc_buf(r->pool);
d4ea69372b94 nginx-0.1.25-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 479
diff changeset
353 if (b == NULL) {
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
354 return NGX_HTTP_INTERNAL_SERVER_ERROR;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356
343
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 303
diff changeset
357 b->in_file = 1;
6bdf858bff8c nginx-0.0.3-2004-05-28-19:49:23 import; rename ngx_hunk_t to ngx_buf_t
Igor Sysoev <igor@sysoev.ru>
parents: 303
diff changeset
358 b->file_pos = 0;
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
359 b->file_last = rb->temp_file->file.offset;
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
360 b->file = &rb->temp_file->file;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
361
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
362 if (rb->bufs->next) {
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
363 rb->bufs->next->buf = b;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
364
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
365 } else {
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
366 rb->bufs->buf = b;
160
e7e094d34162 nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents: 83
diff changeset
367 }
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368 }
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369
4006
87f47e05fc82 Fix body with request_body_in_single_buf.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4005
diff changeset
370 if (rb->bufs->next
87f47e05fc82 Fix body with request_body_in_single_buf.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4005
diff changeset
371 && (r->request_body_in_file_only || r->request_body_in_single_buf))
87f47e05fc82 Fix body with request_body_in_single_buf.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4005
diff changeset
372 {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
373 rb->bufs = rb->bufs->next;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
374 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
375
4072
cf334deeea66 Bugfix: read event was not blocked after reading body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4006
diff changeset
376 r->read_event_handler = ngx_http_block_reading;
cf334deeea66 Bugfix: read event was not blocked after reading body.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4006
diff changeset
377
479
c52408583801 nginx-0.1.14-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 475
diff changeset
378 rb->post_handler(r);
293
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
379
ec3c049681fd nginx-0.0.3-2004-03-19-08:25:53 import
Igor Sysoev <igor@sysoev.ru>
parents: 292
diff changeset
380 return NGX_OK;
82
fccdb921e8b8 nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
382
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
383
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
384 static ngx_int_t
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
385 ngx_http_write_request_body(ngx_http_request_t *r, ngx_chain_t *body)
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
386 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
387 ssize_t n;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
388 ngx_temp_file_t *tf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
389 ngx_http_request_body_t *rb;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
390 ngx_http_core_loc_conf_t *clcf;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
391
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
392 rb = r->request_body;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
393
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
394 if (rb->temp_file == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
395 tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
396 if (tf == NULL) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
397 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
398 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
399
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
400 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
401
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
402 tf->file.fd = NGX_INVALID_FILE;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
403 tf->file.log = r->connection->log;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
404 tf->path = clcf->client_body_temp_path;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
405 tf->pool = r->pool;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
406 tf->warn = "a client request body is buffered to a temporary file";
637
e60fe4cf1d4e nginx-0.3.40-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 633
diff changeset
407 tf->log_level = r->request_body_file_log_level;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
408 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
409 tf->clean = r->request_body_in_clean_file;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
410
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
411 if (r->request_body_file_group_access) {
1046
bb139aba3199 rename mode to access
Igor Sysoev <igor@sysoev.ru>
parents: 841
diff changeset
412 tf->access = 0660;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
413 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
414
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
415 rb->temp_file = tf;
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
416
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
417 if (body == NULL) {
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
418 /* empty body with r->request_body_in_file_only */
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
419
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
420 if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
421 tf->persistent, tf->clean, tf->access)
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
422 != NGX_OK)
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
423 {
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
424 return NGX_ERROR;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
425 }
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
426
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
427 return NGX_OK;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
428 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
429 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
430
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
431 n = ngx_write_chain_to_temp_file(rb->temp_file, body);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
432
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
433 /* TODO: n == 0 or not complete and level event */
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
434
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
435 if (n == NGX_ERROR) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
436 return NGX_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
437 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
438
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
439 rb->temp_file->offset += n;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
440
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
441 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
442 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
443
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
444
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
445 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
446 ngx_http_discard_request_body(ngx_http_request_t *r)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
447 {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
448 ssize_t size;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
449 ngx_event_t *rev;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
450
673
b80f94fa2197 nginx-0.3.58-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 667
diff changeset
451 if (r != r->main || r->discard_body) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
452 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
453 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
454
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
455 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
456 return NGX_HTTP_INTERNAL_SERVER_ERROR;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
457 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
458
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
459 rev = r->connection->read;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
460
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
461 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body");
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
462
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
463 if (rev->timer_set) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
464 ngx_del_timer(rev);
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
465 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
466
1582
227152b66458 do not discard body if it has been already read
Igor Sysoev <igor@sysoev.ru>
parents: 1456
diff changeset
467 if (r->headers_in.content_length_n <= 0 || r->request_body) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
468 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
469 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
470
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
471 size = r->header_in->last - r->header_in->pos;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
472
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
473 if (size) {
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
474 if (r->headers_in.content_length_n > size) {
3212
e67d000b5337 prevent handling discarded body as a pipelined request
Igor Sysoev <igor@sysoev.ru>
parents: 3181
diff changeset
475 r->header_in->pos += size;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
476 r->headers_in.content_length_n -= size;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
477
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
478 } else {
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
479 r->header_in->pos += (size_t) r->headers_in.content_length_n;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
480 r->headers_in.content_length_n = 0;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
481 return NGX_OK;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
482 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
483 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
484
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
485 if (ngx_http_read_discarded_request_body(r) == NGX_OK) {
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
486 r->lingering_close = 0;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
487 return NGX_OK;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
488 }
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
489
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
490 /* == NGX_AGAIN */
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
491
3214
798a7f1d3b2f restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents: 3213
diff changeset
492 r->read_event_handler = ngx_http_discarded_request_body_handler;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
493
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
494 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
495 return NGX_HTTP_INTERNAL_SERVER_ERROR;
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
496 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
497
4957
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
498 r->count++;
7556a7acb14f Merge of r4921, r4922, r4923, r4924, r4925: request body fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4593
diff changeset
499 r->discard_body = 1;
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
500
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
501 return NGX_OK;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
502 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
503
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
504
3214
798a7f1d3b2f restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents: 3213
diff changeset
505 void
798a7f1d3b2f restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents: 3213
diff changeset
506 ngx_http_discarded_request_body_handler(ngx_http_request_t *r)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
507 {
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
508 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
509 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
510 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
511 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
512 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
513
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
514 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
515 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
516
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
517 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
518 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
519 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
520 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
521 return;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
522 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
523
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
524 if (r->lingering_time) {
1640
02a22cd5282a 64-bit time_t compatibility
Igor Sysoev <igor@sysoev.ru>
parents: 1582
diff changeset
525 timer = (ngx_msec_t) (r->lingering_time - 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
526
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
527 if (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
528 r->discard_body = 0;
3181
36f6407817dc clear r->lingering_close to disable preventively calling
Igor Sysoev <igor@sysoev.ru>
parents: 3179
diff changeset
529 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
530 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
531 return;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
532 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
533
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
534 } else {
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
535 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
536 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
537
1370
cc114c85be0f rename ngx_http_discard_body() to ngx_http_discard_request_body()
Igor Sysoev <igor@sysoev.ru>
parents: 1369
diff changeset
538 rc = ngx_http_read_discarded_request_body(r);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
539
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
540 if (rc == NGX_OK) {
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
541 r->discard_body = 0;
3181
36f6407817dc clear r->lingering_close to disable preventively calling
Igor Sysoev <igor@sysoev.ru>
parents: 3179
diff changeset
542 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
543 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
544 return;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
545 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
546
1373
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
547 /* 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
548
2388
722b5aff05ae use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents: 2233
diff changeset
549 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
1456
698ea64f71e1 fix unlikely socket leak
Igor Sysoev <igor@sysoev.ru>
parents: 1455
diff changeset
550 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
551 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
552 return;
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
553 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
554
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
555 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
556
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
557 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
558
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
559 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
560
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
561 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
562 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
563 }
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
564
fdea12ffb24a discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents: 1370
diff changeset
565 ngx_add_timer(rev, timer);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
566 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
567 }
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
568
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
569
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
570 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
571 ngx_http_read_discarded_request_body(ngx_http_request_t *r)
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
572 {
663
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
573 size_t size;
6d5c1535bb9d nginx-0.3.53-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 637
diff changeset
574 ssize_t n;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
575 u_char buffer[NGX_HTTP_DISCARD_BUFFER_SIZE];
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
576
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
577 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
578 "http read discarded body");
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
579
3162
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
580 for ( ;; ) {
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
581 if (r->headers_in.content_length_n == 0) {
1369
6254b90eea4b block reading for level events
Igor Sysoev <igor@sysoev.ru>
parents: 1367
diff changeset
582 r->read_event_handler = ngx_http_block_reading;
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
583 return NGX_OK;
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
584 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
585
3162
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
586 if (!r->connection->read->ready) {
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
587 return NGX_AGAIN;
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
588 }
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
589
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
590 size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
591 NGX_HTTP_DISCARD_BUFFER_SIZE:
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
592 (size_t) r->headers_in.content_length_n;
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
593
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
594 n = r->connection->recv(r->connection, buffer, size);
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
595
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
596 if (n == NGX_ERROR) {
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
597 r->connection->error = 1;
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
598 return NGX_OK;
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
599 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
600
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
601 if (n == NGX_AGAIN) {
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
602 return NGX_AGAIN;
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
603 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
604
1422
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
605 if (n == 0) {
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
606 return NGX_OK;
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
607 }
65dd057f71c7 cancel discarding body on EOF
Igor Sysoev <igor@sysoev.ru>
parents: 1373
diff changeset
608
1367
aa700583b57d discard request body in cycle
Igor Sysoev <igor@sysoev.ru>
parents: 1290
diff changeset
609 r->headers_in.content_length_n -= n;
3162
9140fbb2ab83 fix discarding body
Igor Sysoev <igor@sysoev.ru>
parents: 3077
diff changeset
610 }
633
f971949ffb58 nginx-0.3.38-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 583
diff changeset
611 }
2436
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
612
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
613
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
614 static ngx_int_t
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
615 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
616 {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
617 ngx_int_t n;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
618 ngx_str_t *expect;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
619
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
620 if (r->expect_tested
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
621 || r->headers_in.expect == NULL
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
622 || r->http_version < NGX_HTTP_VERSION_11)
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
623 {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
624 return NGX_OK;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
625 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
626
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
627 r->expect_tested = 1;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
628
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
629 expect = &r->headers_in.expect->value;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
630
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
631 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
632 || 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
633 sizeof("100-continue") - 1)
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
634 != 0)
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
635 {
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
636 return NGX_OK;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
637 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
638
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
639 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
640 "send 100 Continue");
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
641
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
642 n = r->connection->send(r->connection,
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
643 (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
644 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
645
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
646 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
647 return NGX_OK;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
648 }
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
649
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
650 /* 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
651
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
652 return NGX_ERROR;
26d9d4a41e91 send "100 Continue" just before reading request body
Igor Sysoev <igor@sysoev.ru>
parents: 2388
diff changeset
653 }