Mercurial > hg > nginx
annotate src/http/ngx_http_request.c @ 5089:903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Previously, only the first request in a connection was assigned the
configuration selected by SNI. All subsequent requests initially
used the default server's configuration, ignoring SNI, which was
wrong.
Now all subsequent requests in a connection will initially use the
configuration selected by SNI. This is done by storing a pointer
to configuration in http connection object. It points to default
server's configuration initially, but changed upon receipt of SNI.
(The request's configuration can be further refined when parsing
the request line and Host: header.)
This change was not made specific to SNI as it also allows slightly
faster access to configuration without the request object.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Wed, 27 Feb 2013 17:12:48 +0000 |
parents | ac31fcecb464 |
children | 9db95b275755 |
rev | line source |
---|---|
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
1 |
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:
439
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:
439
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:
439
diff
changeset
|
6 |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
439
diff
changeset
|
7 |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
8 #include <ngx_config.h> |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
9 #include <ngx_core.h> |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 #include <ngx_http.h> |
8
708f8bb772ec
nginx-0.0.1-2002-09-02-18:48:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
7
diff
changeset
|
11 |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
12 |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
13 static void ngx_http_init_request(ngx_event_t *ev); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
14 static void ngx_http_process_request_line(ngx_event_t *rev); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
15 static void ngx_http_process_request_headers(ngx_event_t *rev); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
16 static ssize_t ngx_http_read_request_header(ngx_http_request_t *r); |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
17 static ngx_int_t ngx_http_alloc_large_header_buffer(ngx_http_request_t *r, |
501 | 18 ngx_uint_t request_line); |
509 | 19 |
20 static ngx_int_t ngx_http_process_header_line(ngx_http_request_t *r, | |
21 ngx_table_elt_t *h, ngx_uint_t offset); | |
523 | 22 static ngx_int_t ngx_http_process_unique_header_line(ngx_http_request_t *r, |
23 ngx_table_elt_t *h, ngx_uint_t offset); | |
5084
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
24 static ngx_int_t ngx_http_process_multi_header_lines(ngx_http_request_t *r, |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
25 ngx_table_elt_t *h, ngx_uint_t offset); |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
26 static ngx_int_t ngx_http_process_host(ngx_http_request_t *r, |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
27 ngx_table_elt_t *h, ngx_uint_t offset); |
1467
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
28 static ngx_int_t ngx_http_process_connection(ngx_http_request_t *r, |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
29 ngx_table_elt_t *h, ngx_uint_t offset); |
2004
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
30 static ngx_int_t ngx_http_process_user_agent(ngx_http_request_t *r, |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
31 ngx_table_elt_t *h, ngx_uint_t offset); |
509 | 32 |
356
2e3cbc1bbe3c
nginx-0.0.7-2004-06-16-19:32:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
346
diff
changeset
|
33 static ngx_int_t ngx_http_process_request_header(ngx_http_request_t *r); |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
34 static void ngx_http_process_request(ngx_http_request_t *r); |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
35 static ngx_int_t ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool, |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
36 ngx_uint_t alloc); |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
37 static ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
38 ngx_str_t *host); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
39 static ngx_int_t ngx_http_find_virtual_server(ngx_connection_t *c, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
40 ngx_http_virtual_names_t *virtual_names, ngx_str_t *host, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
41 ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp); |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
42 |
509 | 43 static void ngx_http_request_handler(ngx_event_t *ev); |
3049 | 44 static void ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc); |
45 static void ngx_http_terminate_handler(ngx_http_request_t *r); | |
46 static void ngx_http_finalize_connection(ngx_http_request_t *r); | |
525 | 47 static ngx_int_t ngx_http_set_write_handler(ngx_http_request_t *r); |
509 | 48 static void ngx_http_writer(ngx_http_request_t *r); |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
49 static void ngx_http_request_finalizer(ngx_http_request_t *r); |
509 | 50 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
51 static void ngx_http_set_keepalive(ngx_http_request_t *r); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
52 static void ngx_http_keepalive_handler(ngx_event_t *ev); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
53 static void ngx_http_set_lingering_close(ngx_http_request_t *r); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
54 static void ngx_http_lingering_close_handler(ngx_event_t *ev); |
613 | 55 static ngx_int_t ngx_http_post_action(ngx_http_request_t *r); |
531 | 56 static void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error); |
3049 | 57 static void ngx_http_free_request(ngx_http_request_t *r, ngx_int_t error); |
2261 | 58 static void ngx_http_log_request(ngx_http_request_t *r); |
531 | 59 static void ngx_http_close_connection(ngx_connection_t *c); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
60 |
483 | 61 static u_char *ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len); |
665 | 62 static u_char *ngx_http_log_error_handler(ngx_http_request_t *r, |
63 ngx_http_request_t *sr, u_char *buf, size_t len); | |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
64 |
539 | 65 #if (NGX_HTTP_SSL) |
66 static void ngx_http_ssl_handshake(ngx_event_t *rev); | |
547 | 67 static void ngx_http_ssl_handshake_handler(ngx_connection_t *c); |
539 | 68 #endif |
69 | |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
70 |
505 | 71 static char *ngx_http_client_errors[] = { |
72 | |
73 /* NGX_HTTP_PARSE_INVALID_METHOD */ | |
74 "client sent invalid method", | |
75 | |
76 /* NGX_HTTP_PARSE_INVALID_REQUEST */ | |
77 "client sent invalid request", | |
78 | |
79 /* NGX_HTTP_PARSE_INVALID_09_METHOD */ | |
80 "client sent invalid method in HTTP/0.9 request" | |
7
b5481d6fbbd4
nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
6
diff
changeset
|
81 }; |
b5481d6fbbd4
nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
6
diff
changeset
|
82 |
b5481d6fbbd4
nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
6
diff
changeset
|
83 |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
84 ngx_http_header_t ngx_http_headers_in[] = { |
2193
1d37b13ef004
fix $r->header_in() for "User-Agent", "Connection", and "Host"
Igor Sysoev <igor@sysoev.ru>
parents:
2137
diff
changeset
|
85 { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host), |
1d37b13ef004
fix $r->header_in() for "User-Agent", "Connection", and "Host"
Igor Sysoev <igor@sysoev.ru>
parents:
2137
diff
changeset
|
86 ngx_http_process_host }, |
1d37b13ef004
fix $r->header_in() for "User-Agent", "Connection", and "Host"
Igor Sysoev <igor@sysoev.ru>
parents:
2137
diff
changeset
|
87 |
1d37b13ef004
fix $r->header_in() for "User-Agent", "Connection", and "Host"
Igor Sysoev <igor@sysoev.ru>
parents:
2137
diff
changeset
|
88 { ngx_string("Connection"), offsetof(ngx_http_headers_in_t, connection), |
1d37b13ef004
fix $r->header_in() for "User-Agent", "Connection", and "Host"
Igor Sysoev <igor@sysoev.ru>
parents:
2137
diff
changeset
|
89 ngx_http_process_connection }, |
509 | 90 |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
91 { ngx_string("If-Modified-Since"), |
509 | 92 offsetof(ngx_http_headers_in_t, if_modified_since), |
1434
0f0ce9a8eee9
If-Modified-Since should be unique header line
Igor Sysoev <igor@sysoev.ru>
parents:
1427
diff
changeset
|
93 ngx_http_process_unique_header_line }, |
509 | 94 |
3814
e6e453203bae
"If-Unmodified-Since" support
Igor Sysoev <igor@sysoev.ru>
parents:
3674
diff
changeset
|
95 { ngx_string("If-Unmodified-Since"), |
e6e453203bae
"If-Unmodified-Since" support
Igor Sysoev <igor@sysoev.ru>
parents:
3674
diff
changeset
|
96 offsetof(ngx_http_headers_in_t, if_unmodified_since), |
e6e453203bae
"If-Unmodified-Since" support
Igor Sysoev <igor@sysoev.ru>
parents:
3674
diff
changeset
|
97 ngx_http_process_unique_header_line }, |
e6e453203bae
"If-Unmodified-Since" support
Igor Sysoev <igor@sysoev.ru>
parents:
3674
diff
changeset
|
98 |
4744
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
99 { ngx_string("If-Match"), |
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
100 offsetof(ngx_http_headers_in_t, if_match), |
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
101 ngx_http_process_unique_header_line }, |
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
102 |
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
103 { ngx_string("If-None-Match"), |
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
104 offsetof(ngx_http_headers_in_t, if_none_match), |
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
105 ngx_http_process_unique_header_line }, |
5b93a9ac60ed
Entity tags: basic support in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4739
diff
changeset
|
106 |
2193
1d37b13ef004
fix $r->header_in() for "User-Agent", "Connection", and "Host"
Igor Sysoev <igor@sysoev.ru>
parents:
2137
diff
changeset
|
107 { ngx_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent), |
1d37b13ef004
fix $r->header_in() for "User-Agent", "Connection", and "Host"
Igor Sysoev <igor@sysoev.ru>
parents:
2137
diff
changeset
|
108 ngx_http_process_user_agent }, |
509 | 109 |
110 { ngx_string("Referer"), offsetof(ngx_http_headers_in_t, referer), | |
111 ngx_http_process_header_line }, | |
112 | |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
113 { ngx_string("Content-Length"), |
509 | 114 offsetof(ngx_http_headers_in_t, content_length), |
523 | 115 ngx_http_process_unique_header_line }, |
509 | 116 |
479 | 117 { ngx_string("Content-Type"), |
509 | 118 offsetof(ngx_http_headers_in_t, content_type), |
119 ngx_http_process_header_line }, | |
120 | |
121 { ngx_string("Range"), offsetof(ngx_http_headers_in_t, range), | |
122 ngx_http_process_header_line }, | |
123 | |
1630 | 124 { ngx_string("If-Range"), |
125 offsetof(ngx_http_headers_in_t, if_range), | |
126 ngx_http_process_unique_header_line }, | |
127 | |
581 | 128 { ngx_string("Transfer-Encoding"), |
129 offsetof(ngx_http_headers_in_t, transfer_encoding), | |
130 ngx_http_process_header_line }, | |
131 | |
2067 | 132 { ngx_string("Expect"), |
133 offsetof(ngx_http_headers_in_t, expect), | |
134 ngx_http_process_unique_header_line }, | |
135 | |
5072
7fa7e60a7f66
Proxy: support for connection upgrade (101 Switching Protocols).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4930
diff
changeset
|
136 { ngx_string("Upgrade"), |
7fa7e60a7f66
Proxy: support for connection upgrade (101 Switching Protocols).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4930
diff
changeset
|
137 offsetof(ngx_http_headers_in_t, upgrade), |
7fa7e60a7f66
Proxy: support for connection upgrade (101 Switching Protocols).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4930
diff
changeset
|
138 ngx_http_process_header_line }, |
7fa7e60a7f66
Proxy: support for connection upgrade (101 Switching Protocols).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4930
diff
changeset
|
139 |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
140 #if (NGX_HTTP_GZIP) |
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
141 { ngx_string("Accept-Encoding"), |
509 | 142 offsetof(ngx_http_headers_in_t, accept_encoding), |
143 ngx_http_process_header_line }, | |
144 | |
145 { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via), | |
146 ngx_http_process_header_line }, | |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
147 #endif |
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
148 |
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
149 { ngx_string("Authorization"), |
509 | 150 offsetof(ngx_http_headers_in_t, authorization), |
523 | 151 ngx_http_process_unique_header_line }, |
509 | 152 |
153 { ngx_string("Keep-Alive"), offsetof(ngx_http_headers_in_t, keep_alive), | |
154 ngx_http_process_header_line }, | |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
155 |
4697
09187f9b0950
Fixed compile-time conditionals used to detect if X-Forwarded-For support
Ruslan Ermilov <ru@nginx.com>
parents:
4675
diff
changeset
|
156 #if (NGX_HTTP_X_FORWARDED_FOR) |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
157 { ngx_string("X-Forwarded-For"), |
509 | 158 offsetof(ngx_http_headers_in_t, x_forwarded_for), |
5084
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
159 ngx_http_process_multi_header_lines }, |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
160 #endif |
479 | 161 |
573 | 162 #if (NGX_HTTP_REALIP) |
163 { ngx_string("X-Real-IP"), | |
164 offsetof(ngx_http_headers_in_t, x_real_ip), | |
165 ngx_http_process_header_line }, | |
166 #endif | |
167 | |
489 | 168 #if (NGX_HTTP_HEADERS) |
509 | 169 { ngx_string("Accept"), offsetof(ngx_http_headers_in_t, accept), |
170 ngx_http_process_header_line }, | |
171 | |
489 | 172 { ngx_string("Accept-Language"), |
509 | 173 offsetof(ngx_http_headers_in_t, accept_language), |
174 ngx_http_process_header_line }, | |
489 | 175 #endif |
176 | |
637 | 177 #if (NGX_HTTP_DAV) |
178 { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth), | |
179 ngx_http_process_header_line }, | |
180 | |
181 { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination), | |
182 ngx_http_process_header_line }, | |
681 | 183 |
1059 | 184 { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite), |
185 ngx_http_process_header_line }, | |
186 | |
681 | 187 { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date), |
188 ngx_http_process_header_line }, | |
637 | 189 #endif |
190 | |
5084
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
191 { ngx_string("Cookie"), offsetof(ngx_http_headers_in_t, cookies), |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
192 ngx_http_process_multi_header_lines }, |
509 | 193 |
194 { ngx_null_string, 0, NULL } | |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
195 }; |
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
196 |
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
197 |
501 | 198 void |
199 ngx_http_init_connection(ngx_connection_t *c) | |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
200 { |
5085
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
201 ngx_uint_t i; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
202 ngx_event_t *rev; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
203 struct sockaddr_in *sin; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
204 ngx_http_port_t *port; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
205 ngx_http_in_addr_t *addr; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
206 ngx_http_log_ctx_t *ctx; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
207 ngx_http_connection_t *hc; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
208 #if (NGX_HAVE_INET6) |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
209 struct sockaddr_in6 *sin6; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
210 ngx_http_in6_addr_t *addr6; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
211 #endif |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
212 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
213 hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t)); |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
214 if (hc == NULL) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
215 ngx_http_close_connection(c); |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
216 return; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
217 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
218 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
219 c->data = hc; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
220 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
221 /* find the server configuration for the address:port */ |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
222 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
223 port = c->listening->servers; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
224 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
225 if (port->naddrs > 1) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
226 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
227 /* |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
228 * there are several addresses on this port and one of them |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
229 * is an "*:port" wildcard so getsockname() in ngx_http_server_addr() |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
230 * is required to determine a server address |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
231 */ |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
232 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
233 if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
234 ngx_http_close_connection(c); |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
235 return; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
236 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
237 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
238 switch (c->local_sockaddr->sa_family) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
239 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
240 #if (NGX_HAVE_INET6) |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
241 case AF_INET6: |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
242 sin6 = (struct sockaddr_in6 *) c->local_sockaddr; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
243 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
244 addr6 = port->addrs; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
245 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
246 /* the last address is "*" */ |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
247 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
248 for (i = 0; i < port->naddrs - 1; i++) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
249 if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
250 break; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
251 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
252 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
253 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
254 hc->addr_conf = &addr6[i].conf; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
255 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
256 break; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
257 #endif |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
258 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
259 default: /* AF_INET */ |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
260 sin = (struct sockaddr_in *) c->local_sockaddr; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
261 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
262 addr = port->addrs; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
263 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
264 /* the last address is "*" */ |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
265 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
266 for (i = 0; i < port->naddrs - 1; i++) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
267 if (addr[i].addr == sin->sin_addr.s_addr) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
268 break; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
269 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
270 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
271 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
272 hc->addr_conf = &addr[i].conf; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
273 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
274 break; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
275 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
276 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
277 } else { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
278 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
279 switch (c->local_sockaddr->sa_family) { |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
280 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
281 #if (NGX_HAVE_INET6) |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
282 case AF_INET6: |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
283 addr6 = port->addrs; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
284 hc->addr_conf = &addr6[0].conf; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
285 break; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
286 #endif |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
287 |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
288 default: /* AF_INET */ |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
289 addr = port->addrs; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
290 hc->addr_conf = &addr[0].conf; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
291 break; |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
292 } |
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
293 } |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
294 |
5089
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
295 /* the default server configuration for the address:port */ |
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
296 hc->conf_ctx = hc->addr_conf->default_server->ctx; |
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
297 |
501 | 298 ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t)); |
299 if (ctx == NULL) { | |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
300 ngx_http_close_connection(c); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
301 return; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
302 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
303 |
1810 | 304 ctx->connection = c; |
461 | 305 ctx->request = NULL; |
665 | 306 ctx->current_request = NULL; |
483 | 307 |
308 c->log->connection = c->number; | |
309 c->log->handler = ngx_http_log_error; | |
191
71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
Igor Sysoev <igor@sysoev.ru>
parents:
189
diff
changeset
|
310 c->log->data = ctx; |
483 | 311 c->log->action = "reading client request line"; |
312 | |
256
8e39cab6abd5
nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents:
253
diff
changeset
|
313 c->log_error = NGX_ERROR_INFO; |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
314 |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
315 rev = c->read; |
509 | 316 rev->handler = ngx_http_init_request; |
569 | 317 c->write->handler = ngx_http_empty_handler; |
253
b6793bc5034b
nginx-0.0.2-2004-02-09-10:46:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
247
diff
changeset
|
318 |
567 | 319 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
320 (void) ngx_atomic_fetch_add(ngx_stat_reading, 1); |
567 | 321 #endif |
322 | |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
323 if (rev->ready) { |
346
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
324 /* the deferred accept(), rtsig, aio, iocp */ |
301
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
299
diff
changeset
|
325 |
611 | 326 if (ngx_use_accept_mutex) { |
563 | 327 ngx_post_event(rev, &ngx_posted_events); |
301
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
299
diff
changeset
|
328 return; |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
299
diff
changeset
|
329 } |
744965ec6275
nginx-0.0.3-2004-03-31-19:26:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
299
diff
changeset
|
330 |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
331 ngx_http_init_request(rev); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
332 return; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
55
diff
changeset
|
333 } |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
334 |
103
6dfda4cf5200
nginx-0.0.1-2003-06-11-19:28:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
101
diff
changeset
|
335 ngx_add_timer(rev, c->listening->post_accept_timeout); |
53
d1e42f1b8fd4
nginx-0.0.1-2003-01-27-00:08:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
52
diff
changeset
|
336 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
337 if (ngx_handle_read_event(rev, 0) != NGX_OK) { |
567 | 338 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
339 (void) ngx_atomic_fetch_add(ngx_stat_reading, -1); |
567 | 340 #endif |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
341 ngx_http_close_connection(c); |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
342 return; |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
343 } |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
344 } |
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
345 |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
346 |
641 | 347 static void |
348 ngx_http_init_request(ngx_event_t *rev) | |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
349 { |
1179
6e2216ad2c87
$request_time has millisecond precision
Igor Sysoev <igor@sysoev.ru>
parents:
1151
diff
changeset
|
350 ngx_time_t *tp; |
573 | 351 ngx_connection_t *c; |
352 ngx_http_request_t *r; | |
353 ngx_http_log_ctx_t *ctx; | |
354 ngx_http_connection_t *hc; | |
355 ngx_http_core_srv_conf_t *cscf; | |
356 ngx_http_core_loc_conf_t *clcf; | |
357 ngx_http_core_main_conf_t *cmcf; | |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
358 |
567 | 359 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
360 (void) ngx_atomic_fetch_add(ngx_stat_reading, -1); |
567 | 361 #endif |
362 | |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
363 c = rev->data; |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
364 |
160
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
365 if (rev->timedout) { |
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
366 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
427
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
367 |
160
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
368 ngx_http_close_connection(c); |
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
369 return; |
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
370 } |
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
371 |
2888 | 372 c->requests++; |
373 | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
374 hc = c->data; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
375 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
376 r = hc->request; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
377 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
378 if (r) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
379 ngx_memzero(r, sizeof(ngx_http_request_t)); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
380 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
381 r->pipeline = hc->pipeline; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
382 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
383 if (hc->nbusy) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
384 r->header_in = hc->busy[0]; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
385 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
386 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
387 } else { |
501 | 388 r = ngx_pcalloc(c->pool, sizeof(ngx_http_request_t)); |
389 if (r == NULL) { | |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
390 ngx_http_close_connection(c); |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
391 return; |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
392 } |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
367
diff
changeset
|
393 |
432
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
394 hc->request = r; |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
395 } |
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
396 |
432
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
397 c->data = r; |
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
398 r->http_connection = hc; |
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
399 |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
367
diff
changeset
|
400 c->sent = 0; |
367
ceec87d1c2b3
nginx-0.0.7-2004-06-24-11:53:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
362
diff
changeset
|
401 r->signature = NGX_HTTP_MODULE; |
216
f1d0e5f09c1e
nginx-0.0.1-2003-12-25-23:26:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
215
diff
changeset
|
402 |
1805 | 403 r->connection = c; |
404 | |
5089
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
405 r->main_conf = hc->conf_ctx->main_conf; |
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
406 r->srv_conf = hc->conf_ctx->srv_conf; |
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
407 r->loc_conf = hc->conf_ctx->loc_conf; |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
408 |
509 | 409 rev->handler = ngx_http_process_request_line; |
3000
66ef86affbb8
fix segfault if 400 or 414 errors are handled intricately
Igor Sysoev <igor@sysoev.ru>
parents:
2994
diff
changeset
|
410 r->read_event_handler = ngx_http_block_reading; |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
411 |
393
5659d773cfa8
nginx-0.0.7-2004-07-15-20:35:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
392
diff
changeset
|
412 #if (NGX_HTTP_SSL) |
5659d773cfa8
nginx-0.0.7-2004-07-15-20:35:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
392
diff
changeset
|
413 |
1704
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
414 { |
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
415 ngx_http_ssl_srv_conf_t *sscf; |
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
416 |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
417 sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module); |
5085
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
418 if (sscf->enable || hc->addr_conf->ssl) { |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
419 |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
420 if (c->ssl == NULL) { |
2224 | 421 |
422 c->log->action = "SSL handshaking"; | |
423 | |
5085
7f1cbcc71327
The default server lookup is now done only once per connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5084
diff
changeset
|
424 if (hc->addr_conf->ssl && sscf->ssl.ctx == NULL) { |
2224 | 425 ngx_log_error(NGX_LOG_ERR, c->log, 0, |
426 "no \"ssl_certificate\" is defined " | |
427 "in server listening on SSL port"); | |
428 ngx_http_close_connection(c); | |
429 return; | |
430 } | |
431 | |
547 | 432 if (ngx_ssl_create_connection(&sscf->ssl, c, NGX_SSL_BUFFER) |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2534
diff
changeset
|
433 != NGX_OK) |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
434 { |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
435 ngx_http_close_connection(c); |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
436 return; |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
437 } |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
438 |
509 | 439 rev->handler = ngx_http_ssl_handshake; |
393
5659d773cfa8
nginx-0.0.7-2004-07-15-20:35:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
392
diff
changeset
|
440 } |
5659d773cfa8
nginx-0.0.7-2004-07-15-20:35:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
392
diff
changeset
|
441 |
513 | 442 r->main_filter_need_in_memory = 1; |
393
5659d773cfa8
nginx-0.0.7-2004-07-15-20:35:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
392
diff
changeset
|
443 } |
1704
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
444 } |
393
5659d773cfa8
nginx-0.0.7-2004-07-15-20:35:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
392
diff
changeset
|
445 |
392
d1222d46b3f9
nginx-0.0.7-2004-07-15-00:07:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
388
diff
changeset
|
446 #endif |
d1222d46b3f9
nginx-0.0.7-2004-07-15-00:07:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
388
diff
changeset
|
447 |
119
cd54bcbaf3b5
nginx-0.0.1-2003-07-21-01:15:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
114
diff
changeset
|
448 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
5086
1b204b8ea9a3
Introduced the ngx_http_set_connection_log() macro.
Valentin Bartenev <vbart@nginx.com>
parents:
5085
diff
changeset
|
449 |
1b204b8ea9a3
Introduced the ngx_http_set_connection_log() macro.
Valentin Bartenev <vbart@nginx.com>
parents:
5085
diff
changeset
|
450 ngx_http_set_connection_log(r->connection, clcf->error_log); |
119
cd54bcbaf3b5
nginx-0.0.1-2003-07-21-01:15:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
114
diff
changeset
|
451 |
5089
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
452 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
453 |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
454 if (c->buffer == NULL) { |
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:
335
diff
changeset
|
455 c->buffer = ngx_create_temp_buf(c->pool, |
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:
335
diff
changeset
|
456 cscf->client_header_buffer_size); |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
457 if (c->buffer == NULL) { |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
458 ngx_http_close_connection(c); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
459 return; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
460 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
461 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
462 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
463 if (r->header_in == NULL) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
464 r->header_in = c->buffer; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
465 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
466 |
501 | 467 r->pool = ngx_create_pool(cscf->request_pool_size, c->log); |
468 if (r->pool == NULL) { | |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
469 ngx_http_close_connection(c); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
470 return; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
471 } |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
472 |
294
5cfd65b8b0a7
nginx-0.0.3-2004-03-23-09:01:52 import
Igor Sysoev <igor@sysoev.ru>
parents:
293
diff
changeset
|
473 |
416
b9bd635011de
nginx-0.0.10-2004-09-06-22:45:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
415
diff
changeset
|
474 if (ngx_list_init(&r->headers_out.headers, r->pool, 20, |
581 | 475 sizeof(ngx_table_elt_t)) |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2534
diff
changeset
|
476 != NGX_OK) |
415
3c56e834be46
nginx-0.0.10-2004-09-05-23:54:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
408
diff
changeset
|
477 { |
2902
a1a1c7e3fb8d
fix "out of memory" case handling
Igor Sysoev <igor@sysoev.ru>
parents:
2888
diff
changeset
|
478 ngx_destroy_pool(r->pool); |
a1a1c7e3fb8d
fix "out of memory" case handling
Igor Sysoev <igor@sysoev.ru>
parents:
2888
diff
changeset
|
479 ngx_http_close_connection(c); |
415
3c56e834be46
nginx-0.0.10-2004-09-05-23:54:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
408
diff
changeset
|
480 return; |
3c56e834be46
nginx-0.0.10-2004-09-05-23:54:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
408
diff
changeset
|
481 } |
3c56e834be46
nginx-0.0.10-2004-09-05-23:54:02 import
Igor Sysoev <igor@sysoev.ru>
parents:
408
diff
changeset
|
482 |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
483 r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
484 if (r->ctx == NULL) { |
2902
a1a1c7e3fb8d
fix "out of memory" case handling
Igor Sysoev <igor@sysoev.ru>
parents:
2888
diff
changeset
|
485 ngx_destroy_pool(r->pool); |
a1a1c7e3fb8d
fix "out of memory" case handling
Igor Sysoev <igor@sysoev.ru>
parents:
2888
diff
changeset
|
486 ngx_http_close_connection(c); |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
487 return; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
488 } |
10
4f3879d9b6f6
nginx-0.0.1-2002-09-11-19:18:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
9
diff
changeset
|
489 |
573 | 490 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); |
491 | |
492 r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts | |
493 * sizeof(ngx_http_variable_value_t)); | |
494 if (r->variables == NULL) { | |
2902
a1a1c7e3fb8d
fix "out of memory" case handling
Igor Sysoev <igor@sysoev.ru>
parents:
2888
diff
changeset
|
495 ngx_destroy_pool(r->pool); |
a1a1c7e3fb8d
fix "out of memory" case handling
Igor Sysoev <igor@sysoev.ru>
parents:
2888
diff
changeset
|
496 ngx_http_close_connection(c); |
573 | 497 return; |
498 } | |
499 | |
380
5ce6561246a5
nginx-0.0.7-2004-07-07-10:15:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
377
diff
changeset
|
500 c->single_connection = 1; |
583 | 501 c->destroyed = 0; |
502 | |
553 | 503 r->main = r; |
3049 | 504 r->count = 1; |
553 | 505 |
1179
6e2216ad2c87
$request_time has millisecond precision
Igor Sysoev <igor@sysoev.ru>
parents:
1151
diff
changeset
|
506 tp = ngx_timeofday(); |
6e2216ad2c87
$request_time has millisecond precision
Igor Sysoev <igor@sysoev.ru>
parents:
1151
diff
changeset
|
507 r->start_sec = tp->sec; |
6e2216ad2c87
$request_time has millisecond precision
Igor Sysoev <igor@sysoev.ru>
parents:
1151
diff
changeset
|
508 r->start_msec = tp->msec; |
497 | 509 |
631 | 510 r->method = NGX_HTTP_UNKNOWN; |
511 | |
82
fccdb921e8b8
nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
77
diff
changeset
|
512 r->headers_in.content_length_n = -1; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
513 r->headers_in.keep_alive_n = -1; |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
514 r->headers_out.content_length_n = -1; |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
515 r->headers_out.last_modified_time = -1; |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
516 |
675 | 517 r->uri_changes = NGX_HTTP_MAX_URI_CHANGES + 1; |
518 r->subrequests = NGX_HTTP_MAX_SUBREQUESTS + 1; | |
519 | |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
367
diff
changeset
|
520 r->http_state = NGX_HTTP_READING_REQUEST_STATE; |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
367
diff
changeset
|
521 |
505 | 522 ctx = c->log->data; |
523 ctx->request = r; | |
665 | 524 ctx->current_request = r; |
509 | 525 r->log_handler = ngx_http_log_error_handler; |
505 | 526 |
426
3f88935a02e8
nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
527 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
528 (void) ngx_atomic_fetch_add(ngx_stat_reading, 1); |
477 | 529 r->stat_reading = 1; |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
530 (void) ngx_atomic_fetch_add(ngx_stat_requests, 1); |
426
3f88935a02e8
nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
531 #endif |
3f88935a02e8
nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
532 |
509 | 533 rev->handler(rev); |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
534 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
535 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
536 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
537 #if (NGX_HTTP_SSL) |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
538 |
501 | 539 static void |
540 ngx_http_ssl_handshake(ngx_event_t *rev) | |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
541 { |
461 | 542 u_char buf[1]; |
543 ssize_t n; | |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
544 ngx_int_t rc; |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
545 ngx_connection_t *c; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
546 ngx_http_request_t *r; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
547 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
548 c = rev->data; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
549 r = c->data; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
550 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
551 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
552 "http check ssl handshake"); |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
553 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
554 if (rev->timedout) { |
505 | 555 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
556 c->timedout = 1; | |
557 ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT); | |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
558 return; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
559 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
560 |
583 | 561 n = recv(c->fd, (char *) buf, 1, MSG_PEEK); |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
562 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
563 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) { |
1855 | 564 |
565 if (!rev->timer_set) { | |
566 ngx_add_timer(rev, c->listening->post_accept_timeout); | |
567 } | |
568 | |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
569 if (ngx_handle_read_event(rev, 0) != NGX_OK) { |
1858 | 570 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
571 } | |
572 | |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
573 return; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
574 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
575 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
576 if (n == 1) { |
3674
37715361263a
fix recognition of SSLv2 Client Hello Packet large than 255 bytes
Igor Sysoev <igor@sysoev.ru>
parents:
3615
diff
changeset
|
577 if (buf[0] & 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) { |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
578 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0, |
461 | 579 "https ssl handshake: 0x%02Xd", buf[0]); |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
580 |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
581 rc = ngx_ssl_handshake(c); |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
582 |
547 | 583 if (rc == NGX_AGAIN) { |
1829
81831a2bc67a
fix socket leak if deferred accept was used
Igor Sysoev <igor@sysoev.ru>
parents:
1812
diff
changeset
|
584 |
81831a2bc67a
fix socket leak if deferred accept was used
Igor Sysoev <igor@sysoev.ru>
parents:
1812
diff
changeset
|
585 if (!rev->timer_set) { |
81831a2bc67a
fix socket leak if deferred accept was used
Igor Sysoev <igor@sysoev.ru>
parents:
1812
diff
changeset
|
586 ngx_add_timer(rev, c->listening->post_accept_timeout); |
81831a2bc67a
fix socket leak if deferred accept was used
Igor Sysoev <igor@sysoev.ru>
parents:
1812
diff
changeset
|
587 } |
81831a2bc67a
fix socket leak if deferred accept was used
Igor Sysoev <igor@sysoev.ru>
parents:
1812
diff
changeset
|
588 |
547 | 589 c->ssl->handler = ngx_http_ssl_handshake_handler; |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
590 return; |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
591 } |
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
592 |
547 | 593 ngx_http_ssl_handshake_handler(c); |
594 | |
595 return; | |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
596 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
597 } else { |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
598 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
599 "plain http"); |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
600 |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
601 r->plain_http = 1; |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
602 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
603 } |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
604 |
2224 | 605 c->log->action = "reading client request line"; |
606 | |
509 | 607 rev->handler = ngx_http_process_request_line; |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
608 ngx_http_process_request_line(rev); |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
609 } |
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
610 |
547 | 611 |
612 static void | |
613 ngx_http_ssl_handshake_handler(ngx_connection_t *c) | |
614 { | |
615 ngx_http_request_t *r; | |
616 | |
617 if (c->ssl->handshaked) { | |
618 | |
619 /* | |
620 * The majority of browsers do not send the "close notify" alert. | |
621 * Among them are MSIE, old Mozilla, Netscape 4, Konqueror, | |
622 * and Links. And what is more, MSIE ignores the server's alert. | |
623 * | |
624 * Opera and recent Mozilla send the alert. | |
625 */ | |
626 | |
627 c->ssl->no_wait_shutdown = 1; | |
628 | |
4594
7d0561b2e0fb
Fixed log->action after ssl handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
629 c->log->action = "reading client request line"; |
7d0561b2e0fb
Fixed log->action after ssl handshake.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
630 |
547 | 631 c->read->handler = ngx_http_process_request_line; |
632 /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler; | |
633 | |
634 ngx_http_process_request_line(c->read); | |
635 | |
636 return; | |
637 } | |
638 | |
639 r = c->data; | |
640 | |
641 ngx_http_close_request(r, NGX_HTTP_BAD_REQUEST); | |
642 | |
643 return; | |
644 } | |
645 | |
1219 | 646 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME |
647 | |
648 int | |
649 ngx_http_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg) | |
650 { | |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
651 ngx_str_t host; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
652 const char *servername; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
653 ngx_connection_t *c; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
654 ngx_http_request_t *r; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
655 ngx_http_connection_t *hc; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
656 ngx_http_ssl_srv_conf_t *sscf; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
657 ngx_http_core_loc_conf_t *clcf; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
658 ngx_http_core_srv_conf_t *cscf; |
1219 | 659 |
660 servername = SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name); | |
661 | |
662 if (servername == NULL) { | |
663 return SSL_TLSEXT_ERR_NOACK; | |
664 } | |
665 | |
666 c = ngx_ssl_get_connection(ssl_conn); | |
667 | |
668 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, | |
669 "SSL server name: \"%s\"", servername); | |
670 | |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
671 host.len = ngx_strlen(servername); |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
672 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
673 if (host.len == 0) { |
2195 | 674 return SSL_TLSEXT_ERR_NOACK; |
675 } | |
676 | |
1219 | 677 r = c->data; |
678 | |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
679 host.data = (u_char *) servername; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
680 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
681 if (ngx_http_validate_host(&host, r->pool, 1) != NGX_OK) { |
3152 | 682 return SSL_TLSEXT_ERR_NOACK; |
683 } | |
684 | |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
685 hc = r->http_connection; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
686 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
687 if (ngx_http_find_virtual_server(c, hc->addr_conf->virtual_names, &host, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
688 NULL, &cscf) |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
689 != NGX_OK) |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
690 { |
1219 | 691 return SSL_TLSEXT_ERR_NOACK; |
692 } | |
693 | |
5089
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
694 hc->conf_ctx = cscf->ctx; |
903f2a5d86a5
SNI: reuse selected configuration for all requests in a connection.
Valentin Bartenev <vbart@nginx.com>
parents:
5088
diff
changeset
|
695 |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
696 r->srv_conf = cscf->ctx->srv_conf; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
697 r->loc_conf = cscf->ctx->loc_conf; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
698 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
699 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
700 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
701 ngx_http_set_connection_log(c, clcf->error_log); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
702 |
1219 | 703 sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module); |
704 | |
4304
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
705 if (sscf->ssl.ctx) { |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
706 SSL_set_SSL_CTX(ssl_conn, sscf->ssl.ctx); |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
707 |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
708 /* |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
709 * SSL_set_SSL_CTX() only changes certs as of 1.0.0d |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
710 * adjust other things we care about |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
711 */ |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
712 |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
713 SSL_set_verify(ssl_conn, SSL_CTX_get_verify_mode(sscf->ssl.ctx), |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
714 SSL_CTX_get_verify_callback(sscf->ssl.ctx)); |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
715 |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
716 SSL_set_verify_depth(ssl_conn, SSL_CTX_get_verify_depth(sscf->ssl.ctx)); |
4033
4e1a489c26cd
Better handling of various per-server ssl options with SNI.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3985
diff
changeset
|
717 |
4e1a489c26cd
Better handling of various per-server ssl options with SNI.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3985
diff
changeset
|
718 #ifdef SSL_CTRL_CLEAR_OPTIONS |
4304
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
719 /* only in 0.9.8m+ */ |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
720 SSL_clear_options(ssl_conn, SSL_get_options(ssl_conn) & |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
721 ~SSL_CTX_get_options(sscf->ssl.ctx)); |
4033
4e1a489c26cd
Better handling of various per-server ssl options with SNI.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3985
diff
changeset
|
722 #endif |
4e1a489c26cd
Better handling of various per-server ssl options with SNI.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3985
diff
changeset
|
723 |
4304
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
724 SSL_set_options(ssl_conn, SSL_CTX_get_options(sscf->ssl.ctx)); |
ed922fb9d6c1
Fixed segfault on ssl servers without cert with SNI (ticket #54).
Maxim Dounin <mdounin@mdounin.ru>
parents:
4195
diff
changeset
|
725 } |
4033
4e1a489c26cd
Better handling of various per-server ssl options with SNI.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3985
diff
changeset
|
726 |
1219 | 727 return SSL_TLSEXT_ERR_OK; |
728 } | |
729 | |
730 #endif | |
547 | 731 |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
732 #endif |
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
733 |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
734 |
501 | 735 static void |
736 ngx_http_process_request_line(ngx_event_t *rev) | |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
737 { |
1585 | 738 ssize_t n; |
739 ngx_int_t rc, rv; | |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
740 ngx_str_t host; |
1585 | 741 ngx_connection_t *c; |
742 ngx_http_request_t *r; | |
743 ngx_http_core_srv_conf_t *cscf; | |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
744 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
745 c = rev->data; |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
746 r = c->data; |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
747 |
209
e1c815be05ae
nginx-0.0.1-2003-12-09-18:08:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
201
diff
changeset
|
748 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, |
e1c815be05ae
nginx-0.0.1-2003-12-09-18:08:11 import
Igor Sysoev <igor@sysoev.ru>
parents:
201
diff
changeset
|
749 "http process request line"); |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
750 |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
751 if (rev->timedout) { |
505 | 752 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
753 c->timedout = 1; | |
754 ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT); | |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
755 return; |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
756 } |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
757 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
758 rc = NGX_AGAIN; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
759 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
760 for ( ;; ) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
761 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
762 if (rc == NGX_AGAIN) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
763 n = ngx_http_read_request_header(r); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
764 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
765 if (n == NGX_AGAIN || n == NGX_ERROR) { |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
766 return; |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
767 } |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
768 } |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
769 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
770 rc = ngx_http_parse_request_line(r, r->header_in); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
771 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
772 if (rc == NGX_OK) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
773 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
774 /* the request line has been parsed successfully */ |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
775 |
461 | 776 r->request_line.len = r->request_end - r->request_start; |
777 r->request_line.data = r->request_start; | |
4739
986cc869b09d
Corrected $request_length calculation for pipelined requests.
Andrey Belov <defan@nginx.com>
parents:
4697
diff
changeset
|
778 r->request_length = r->header_in->pos - r->request_start; |
461 | 779 |
192
31824be1fc66
nginx-0.0.1-2003-11-20-10:05:50 import; auto/configure
Igor Sysoev <igor@sysoev.ru>
parents:
191
diff
changeset
|
780 |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
781 if (r->args_start) { |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
782 r->uri.len = r->args_start - 1 - r->uri_start; |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
783 } else { |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
784 r->uri.len = r->uri_end - r->uri_start; |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
785 } |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
786 |
469 | 787 |
452 | 788 if (r->complex_uri || r->quoted_uri) { |
461 | 789 |
2049 | 790 r->uri.data = ngx_pnalloc(r->pool, r->uri.len + 1); |
501 | 791 if (r->uri.data == NULL) { |
461 | 792 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
793 return; | |
794 } | |
795 | |
1585 | 796 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
797 | |
798 rc = ngx_http_parse_complex_uri(r, cscf->merge_slashes); | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
799 |
505 | 800 if (rc == NGX_HTTP_PARSE_INVALID_REQUEST) { |
801 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
802 "client sent invalid request"); | |
803 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
804 return; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
805 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
806 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
807 } else { |
461 | 808 r->uri.data = r->uri_start; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
809 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
810 |
469 | 811 |
461 | 812 r->unparsed_uri.len = r->uri_end - r->uri_start; |
813 r->unparsed_uri.data = r->uri_start; | |
814 | |
3615 | 815 r->valid_unparsed_uri = r->space_in_uri ? 0 : 1; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
816 |
509 | 817 r->method_name.len = r->method_end - r->request_start + 1; |
818 r->method_name.data = r->request_line.data; | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
819 |
461 | 820 |
479 | 821 if (r->http_protocol.data) { |
822 r->http_protocol.len = r->request_end - r->http_protocol.data; | |
823 } | |
824 | |
825 | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
826 if (r->uri_ext) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
827 if (r->args_start) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
828 r->exten.len = r->args_start - 1 - r->uri_ext; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
829 } else { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
830 r->exten.len = r->uri_end - r->uri_ext; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
831 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
832 |
461 | 833 r->exten.data = r->uri_ext; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
834 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
835 |
461 | 836 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
837 if (r->args_start && r->uri_end > r->args_start) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
838 r->args.len = r->uri_end - r->args_start; |
461 | 839 r->args.data = r->args_start; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
840 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
841 |
2980
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
842 #if (NGX_WIN32) |
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
843 { |
4675
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
844 u_char *p, *last; |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
845 |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
846 p = r->uri.data; |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
847 last = r->uri.data + r->uri.len; |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
848 |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
849 while (p < last) { |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
850 |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
851 if (*p++ == ':') { |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
852 |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
853 /* |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
854 * this check covers "::$data", "::$index_allocation" and |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
855 * ":$i30:$index_allocation" |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
856 */ |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
857 |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
858 if (p < last && *p == '$') { |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
859 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
860 "client sent unsafe win32 URI"); |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
861 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
862 return; |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
863 } |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
864 } |
79c147bdeb6a
Win32: uris with ":$" are now rejected.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4640
diff
changeset
|
865 } |
2980
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
866 |
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
867 p = r->uri.data + r->uri.len - 1; |
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
868 |
3570
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
869 while (p > r->uri.data) { |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
870 |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
871 if (*p == ' ') { |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
872 p--; |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
873 continue; |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
874 } |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
875 |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
876 if (*p == '.') { |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
877 p--; |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
878 continue; |
3416
ee713c767b25
skip URI trailing spaces under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
3415
diff
changeset
|
879 } |
2980
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
880 |
3570
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
881 break; |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
882 } |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
883 |
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
884 if (p != r->uri.data + r->uri.len - 1) { |
2980
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
885 r->uri.len = p + 1 - r->uri.data; |
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
886 ngx_http_set_exten(r); |
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
887 } |
3570
e03b8a4fb906
test default NTFS stream "::$DATA"
Igor Sysoev <igor@sysoev.ru>
parents:
3419
diff
changeset
|
888 |
2980
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
889 } |
c96960a4b42c
skip URI trailing dots under Win32
Igor Sysoev <igor@sysoev.ru>
parents:
2971
diff
changeset
|
890 #endif |
461 | 891 |
892 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, | |
893 "http request line: \"%V\"", &r->request_line); | |
894 | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
895 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
461 | 896 "http uri: \"%V\"", &r->uri); |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
897 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
898 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
461 | 899 "http args: \"%V\"", &r->args); |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
900 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
901 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
461 | 902 "http exten: \"%V\"", &r->exten); |
903 | |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
904 if (r->host_start && r->host_end) { |
3152 | 905 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
906 host.len = r->host_end - r->host_start; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
907 host.data = r->host_start; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
908 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
909 rc = ngx_http_validate_host(&host, r->pool, 0); |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
910 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
911 if (rc == NGX_DECLINED) { |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
912 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
913 "client sent invalid host in request line"); |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
914 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
915 return; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
916 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
917 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
918 if (rc == NGX_ERROR) { |
3152 | 919 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
920 return; | |
921 } | |
922 | |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
923 r->headers_in.server = host; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
924 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
925 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
926 if (r->http_version < NGX_HTTP_VERSION_10) { |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
927 |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
928 if (ngx_http_set_virtual_server(r, &r->headers_in.server) |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
929 == NGX_ERROR) |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
930 { |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
931 return; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
932 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
933 |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
934 ngx_http_process_request(r); |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
935 return; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
936 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
937 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
938 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
939 if (ngx_list_init(&r->headers_in.headers, r->pool, 20, |
581 | 940 sizeof(ngx_table_elt_t)) |
2536
a6d6d762c554
small optimization: " == NGX_ERROR" > " != NGX_OK"
Igor Sysoev <igor@sysoev.ru>
parents:
2534
diff
changeset
|
941 != NGX_OK) |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
942 { |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
943 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
944 return; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
945 } |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
946 |
483 | 947 c->log->action = "reading client request headers"; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
948 |
509 | 949 rev->handler = ngx_http_process_request_headers; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
950 ngx_http_process_request_headers(rev); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
951 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
952 return; |
505 | 953 } |
954 | |
955 if (rc != NGX_AGAIN) { | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
956 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
957 /* there was error while a request line parsing */ |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
958 |
505 | 959 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
960 ngx_http_client_errors[rc - NGX_HTTP_CLIENT_ERROR]); | |
961 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); | |
408
d6e2b445c1b8
nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
406
diff
changeset
|
962 return; |
d6e2b445c1b8
nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
406
diff
changeset
|
963 } |
d6e2b445c1b8
nginx-0.0.10-2004-08-27-19:40:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
406
diff
changeset
|
964 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
965 /* NGX_AGAIN: a request line parsing is still incomplete */ |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
966 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
967 if (r->header_in->pos == r->header_in->end) { |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
968 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
969 rv = ngx_http_alloc_large_header_buffer(r, 1); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
970 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
971 if (rv == NGX_ERROR) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
972 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
973 return; |
220
4f81b931e9ff
nginx-0.0.1-2004-01-08-11:47:17 import
Igor Sysoev <igor@sysoev.ru>
parents:
218
diff
changeset
|
974 } |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
975 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
976 if (rv == NGX_DECLINED) { |
505 | 977 r->request_line.len = r->header_in->end - r->request_start; |
978 r->request_line.data = r->request_start; | |
979 | |
980 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
981 "client sent too long URI"); | |
982 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE); | |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
983 return; |
66
4876cd4a36bb
nginx-0.0.1-2003-03-05-20:30:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
65
diff
changeset
|
984 } |
4876cd4a36bb
nginx-0.0.1-2003-03-05-20:30:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
65
diff
changeset
|
985 } |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
986 } |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
987 } |
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
988 |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
989 |
501 | 990 static void |
991 ngx_http_process_request_headers(ngx_event_t *rev) | |
0
4eff17414a43
nginx-0.0.1-2002-08-06-20:39:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
992 { |
3076 | 993 u_char *p; |
994 size_t len; | |
507 | 995 ssize_t n; |
996 ngx_int_t rc, rv; | |
509 | 997 ngx_table_elt_t *h; |
507 | 998 ngx_connection_t *c; |
999 ngx_http_header_t *hh; | |
1000 ngx_http_request_t *r; | |
511 | 1001 ngx_http_core_srv_conf_t *cscf; |
507 | 1002 ngx_http_core_main_conf_t *cmcf; |
7
b5481d6fbbd4
nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
6
diff
changeset
|
1003 |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
1004 c = rev->data; |
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
1005 r = c->data; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1006 |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
1007 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
1008 "http process request header line"); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1009 |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1010 if (rev->timedout) { |
505 | 1011 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); |
1012 c->timedout = 1; | |
1013 ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT); | |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1014 return; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1015 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1016 |
507 | 1017 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); |
511 | 1018 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
507 | 1019 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1020 rc = NGX_AGAIN; |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1021 |
7
b5481d6fbbd4
nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
6
diff
changeset
|
1022 for ( ;; ) { |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1023 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1024 if (rc == NGX_AGAIN) { |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1025 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1026 if (r->header_in->pos == r->header_in->end) { |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1027 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1028 rv = ngx_http_alloc_large_header_buffer(r, 0); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1029 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1030 if (rv == NGX_ERROR) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1031 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1032 return; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1033 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1034 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1035 if (rv == NGX_DECLINED) { |
3076 | 1036 p = r->header_name_start; |
1037 | |
3848
de59ad6bf557
introduce 494 code "Request Header Too Large"
Igor Sysoev <igor@sysoev.ru>
parents:
3814
diff
changeset
|
1038 r->lingering_close = 1; |
de59ad6bf557
introduce 494 code "Request Header Too Large"
Igor Sysoev <igor@sysoev.ru>
parents:
3814
diff
changeset
|
1039 |
3287
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1040 if (p == NULL) { |
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1041 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1042 "client sent too large request"); |
3848
de59ad6bf557
introduce 494 code "Request Header Too Large"
Igor Sysoev <igor@sysoev.ru>
parents:
3814
diff
changeset
|
1043 ngx_http_finalize_request(r, |
de59ad6bf557
introduce 494 code "Request Header Too Large"
Igor Sysoev <igor@sysoev.ru>
parents:
3814
diff
changeset
|
1044 NGX_HTTP_REQUEST_HEADER_TOO_LARGE); |
3287
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1045 return; |
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1046 } |
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1047 |
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1048 len = r->header_in->end - p; |
e07630a9547d
fix segfault if there is single large_client_header_buffers
Igor Sysoev <igor@sysoev.ru>
parents:
3228
diff
changeset
|
1049 |
3076 | 1050 if (len > NGX_MAX_ERROR_STR - 300) { |
1051 len = NGX_MAX_ERROR_STR - 300; | |
1052 p[len++] = '.'; p[len++] = '.'; p[len++] = '.'; | |
531 | 1053 } |
1054 | |
505 | 1055 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
3076 | 1056 "client sent too long header line: \"%*s\"", |
1057 len, r->header_name_start); | |
3848
de59ad6bf557
introduce 494 code "Request Header Too Large"
Igor Sysoev <igor@sysoev.ru>
parents:
3814
diff
changeset
|
1058 |
de59ad6bf557
introduce 494 code "Request Header Too Large"
Igor Sysoev <igor@sysoev.ru>
parents:
3814
diff
changeset
|
1059 ngx_http_finalize_request(r, |
de59ad6bf557
introduce 494 code "Request Header Too Large"
Igor Sysoev <igor@sysoev.ru>
parents:
3814
diff
changeset
|
1060 NGX_HTTP_REQUEST_HEADER_TOO_LARGE); |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1061 return; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1062 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1063 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1064 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1065 n = ngx_http_read_request_header(r); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1066 |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1067 if (n == NGX_AGAIN || n == NGX_ERROR) { |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1068 return; |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1069 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1070 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1071 |
2256 | 1072 rc = ngx_http_parse_header_line(r, r->header_in, |
1073 cscf->underscores_in_headers); | |
7
b5481d6fbbd4
nginx-0.0.1-2002-08-29-20:59:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
6
diff
changeset
|
1074 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1075 if (rc == NGX_OK) { |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1076 |
4739
986cc869b09d
Corrected $request_length calculation for pipelined requests.
Andrey Belov <defan@nginx.com>
parents:
4697
diff
changeset
|
1077 r->request_length += r->header_in->pos - r->header_name_start; |
986cc869b09d
Corrected $request_length calculation for pipelined requests.
Andrey Belov <defan@nginx.com>
parents:
4697
diff
changeset
|
1078 |
511 | 1079 if (r->invalid_header && cscf->ignore_invalid_headers) { |
503 | 1080 |
1081 /* there was error while a header line parsing */ | |
1082 | |
505 | 1083 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
3076 | 1084 "client sent invalid header line: \"%*s\"", |
1085 r->header_end - r->header_name_start, | |
1086 r->header_name_start); | |
503 | 1087 continue; |
1088 } | |
1089 | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1090 /* a header line has been parsed successfully */ |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1091 |
501 | 1092 h = ngx_list_push(&r->headers_in.headers); |
1093 if (h == NULL) { | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1094 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1095 return; |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1096 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1097 |
507 | 1098 h->hash = r->header_hash; |
1099 | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1100 h->key.len = r->header_name_end - r->header_name_start; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1101 h->key.data = r->header_name_start; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1102 h->key.data[h->key.len] = '\0'; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1103 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1104 h->value.len = r->header_end - r->header_start; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1105 h->value.data = r->header_start; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1106 h->value.data[h->value.len] = '\0'; |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
1107 |
2049 | 1108 h->lowcase_key = ngx_pnalloc(r->pool, h->key.len); |
649 | 1109 if (h->lowcase_key == NULL) { |
1110 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | |
1111 return; | |
1112 } | |
1113 | |
1114 if (h->key.len == r->lowcase_index) { | |
1115 ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); | |
1116 | |
1117 } else { | |
2135 | 1118 ngx_strlow(h->lowcase_key, h->key.data, h->key.len); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1119 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1120 |
649 | 1121 hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash, |
1122 h->lowcase_key, h->key.len); | |
1123 | |
1124 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { | |
1125 return; | |
1126 } | |
1127 | |
210
00cafae0bdf1
nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
209
diff
changeset
|
1128 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
461 | 1129 "http header: \"%V: %V\"", |
1130 &h->key, &h->value); | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1131 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
1132 continue; |
505 | 1133 } |
1134 | |
1135 if (rc == NGX_HTTP_PARSE_HEADER_DONE) { | |
8
708f8bb772ec
nginx-0.0.1-2002-09-02-18:48:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
7
diff
changeset
|
1136 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1137 /* a whole header has been parsed successfully */ |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
1138 |
210
00cafae0bdf1
nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
209
diff
changeset
|
1139 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
00cafae0bdf1
nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
209
diff
changeset
|
1140 "http header done"); |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
1141 |
4739
986cc869b09d
Corrected $request_length calculation for pipelined requests.
Andrey Belov <defan@nginx.com>
parents:
4697
diff
changeset
|
1142 r->request_length += r->header_in->pos - r->header_name_start; |
475 | 1143 |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
367
diff
changeset
|
1144 r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE; |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
367
diff
changeset
|
1145 |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1146 rc = ngx_http_process_request_header(r); |
119
cd54bcbaf3b5
nginx-0.0.1-2003-07-21-01:15:59 import
Igor Sysoev <igor@sysoev.ru>
parents:
114
diff
changeset
|
1147 |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1148 if (rc != NGX_OK) { |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1149 return; |
82
fccdb921e8b8
nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
77
diff
changeset
|
1150 } |
fccdb921e8b8
nginx-0.0.1-2003-04-25-18:43:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
77
diff
changeset
|
1151 |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1152 ngx_http_process_request(r); |
537 | 1153 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1154 return; |
505 | 1155 } |
1156 | |
1157 if (rc == NGX_AGAIN) { | |
1158 | |
1159 /* a header line parsing is still not complete */ | |
1160 | |
1161 continue; | |
66
4876cd4a36bb
nginx-0.0.1-2003-03-05-20:30:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
65
diff
changeset
|
1162 } |
4876cd4a36bb
nginx-0.0.1-2003-03-05-20:30:51 import
Igor Sysoev <igor@sysoev.ru>
parents:
65
diff
changeset
|
1163 |
505 | 1164 /* rc == NGX_HTTP_PARSE_INVALID_HEADER: "\r" is not followed by "\n" */ |
1165 | |
1166 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
3076 | 1167 "client sent invalid header line: \"%*s\\r...\"", |
1168 r->header_end - r->header_name_start, | |
1169 r->header_name_start); | |
1427 | 1170 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
505 | 1171 return; |
19
d7908993fdeb
nginx-0.0.1-2002-12-02-19:09:40 import; resume after 2 months stall
Igor Sysoev <igor@sysoev.ru>
parents:
18
diff
changeset
|
1172 } |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
1173 } |
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
1174 |
24
77c7629a2627
nginx-0.0.1-2002-12-10-21:05:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
23
diff
changeset
|
1175 |
501 | 1176 static ssize_t |
1177 ngx_http_read_request_header(ngx_http_request_t *r) | |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1178 { |
95
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
1179 ssize_t n; |
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
1180 ngx_event_t *rev; |
681 | 1181 ngx_connection_t *c; |
95
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
1182 ngx_http_core_srv_conf_t *cscf; |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1183 |
681 | 1184 c = r->connection; |
1185 rev = c->read; | |
103
6dfda4cf5200
nginx-0.0.1-2003-06-11-19:28:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
101
diff
changeset
|
1186 |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1187 n = r->header_in->last - r->header_in->pos; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1188 |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1189 if (n > 0) { |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1190 return n; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1191 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1192 |
523 | 1193 if (rev->ready) { |
681 | 1194 n = c->recv(c, r->header_in->last, |
1195 r->header_in->end - r->header_in->last); | |
523 | 1196 } else { |
1197 n = NGX_AGAIN; | |
189
c966c09be66b
nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
176
diff
changeset
|
1198 } |
c966c09be66b
nginx-0.0.1-2003-11-18-19:49:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
176
diff
changeset
|
1199 |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1200 if (n == NGX_AGAIN) { |
1856
11d12ef106a9
axe old flag remained after ancient "post_accept_timeout" directive
Igor Sysoev <igor@sysoev.ru>
parents:
1855
diff
changeset
|
1201 if (!rev->timer_set) { |
395
f8f0f1834266
nginx-0.0.7-2004-07-16-21:11:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
394
diff
changeset
|
1202 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
95
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
1203 ngx_add_timer(rev, cscf->client_header_timeout); |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1204 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1205 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
1206 if (ngx_handle_read_event(rev, 0) != NGX_OK) { |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
1207 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
1208 return NGX_ERROR; |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
1209 } |
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
1210 |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1211 return NGX_AGAIN; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1212 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1213 |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1214 if (n == 0) { |
681 | 1215 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4552
diff
changeset
|
1216 "client prematurely closed connection"); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
1217 } |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1218 |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1219 if (n == 0 || n == NGX_ERROR) { |
991 | 1220 c->error = 1; |
992 | 1221 c->log->action = "reading client request headers"; |
681 | 1222 |
991 | 1223 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1224 return NGX_ERROR; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1225 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1226 |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1227 r->header_in->last += n; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1228 |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1229 return n; |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1230 } |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1231 |
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
1232 |
501 | 1233 static ngx_int_t |
1234 ngx_http_alloc_large_header_buffer(ngx_http_request_t *r, | |
1235 ngx_uint_t request_line) | |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1236 { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1237 u_char *old, *new; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1238 ngx_buf_t *b; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1239 ngx_http_connection_t *hc; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1240 ngx_http_core_srv_conf_t *cscf; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1241 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1242 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1243 "http alloc large header buffer"); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1244 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1245 if (request_line && r->state == 0) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1246 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1247 /* the client fills up the buffer with "\r\n" */ |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1248 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1249 r->header_in->pos = r->header_in->start; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1250 r->header_in->last = r->header_in->start; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1251 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1252 return NGX_OK; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1253 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1254 |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1255 old = request_line ? r->request_start : r->header_name_start; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1256 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1257 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1258 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1259 if (r->state != 0 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1260 && (size_t) (r->header_in->pos - old) |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1261 >= cscf->large_client_header_buffers.size) |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1262 { |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1263 return NGX_DECLINED; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1264 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1265 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1266 hc = r->http_connection; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1267 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1268 if (hc->nfree) { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1269 b = hc->free[--hc->nfree]; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1270 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1271 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
461 | 1272 "http large header free: %p %uz", |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1273 b->pos, b->end - b->last); |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1274 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1275 } else if (hc->nbusy < cscf->large_client_header_buffers.num) { |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1276 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1277 if (hc->busy == NULL) { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1278 hc->busy = ngx_palloc(r->connection->pool, |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1279 cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *)); |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1280 if (hc->busy == NULL) { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1281 return NGX_ERROR; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1282 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1283 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1284 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1285 b = ngx_create_temp_buf(r->connection->pool, |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1286 cscf->large_client_header_buffers.size); |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1287 if (b == NULL) { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1288 return NGX_ERROR; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1289 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1290 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1291 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
461 | 1292 "http large header alloc: %p %uz", |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1293 b->pos, b->end - b->last); |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1294 |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1295 } else { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1296 return NGX_DECLINED; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1297 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1298 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1299 hc->busy[hc->nbusy++] = b; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1300 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1301 if (r->state == 0) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1302 /* |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1303 * r->state == 0 means that a header line was parsed successfully |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1304 * and we do not need to copy incomplete header line and |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1305 * to relocate the parser header pointers |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1306 */ |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1307 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1308 r->header_in = b; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1309 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1310 return NGX_OK; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1311 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1312 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1313 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1314 "http large header copy: %d", r->header_in->pos - old); |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1315 |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1316 new = b->start; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1317 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1318 ngx_memcpy(new, old, r->header_in->pos - old); |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1319 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1320 b->pos = new + (r->header_in->pos - old); |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
1321 b->last = new + (r->header_in->pos - old); |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1322 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1323 if (request_line) { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1324 r->request_start = new; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1325 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1326 if (r->request_end) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1327 r->request_end = new + (r->request_end - old); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1328 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1329 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1330 r->method_end = new + (r->method_end - old); |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1331 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1332 r->uri_start = new + (r->uri_start - old); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1333 r->uri_end = new + (r->uri_end - old); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1334 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1335 if (r->schema_start) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1336 r->schema_start = new + (r->schema_start - old); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1337 r->schema_end = new + (r->schema_end - old); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1338 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1339 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1340 if (r->host_start) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1341 r->host_start = new + (r->host_start - old); |
928
a6fe6bedb9e3
fix segfault when $host is used and
Igor Sysoev <igor@sysoev.ru>
parents:
895
diff
changeset
|
1342 if (r->host_end) { |
a6fe6bedb9e3
fix segfault when $host is used and
Igor Sysoev <igor@sysoev.ru>
parents:
895
diff
changeset
|
1343 r->host_end = new + (r->host_end - old); |
a6fe6bedb9e3
fix segfault when $host is used and
Igor Sysoev <igor@sysoev.ru>
parents:
895
diff
changeset
|
1344 } |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1345 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1346 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1347 if (r->port_start) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1348 r->port_start = new + (r->port_start - old); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1349 r->port_end = new + (r->port_end - old); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1350 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
1351 |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1352 if (r->uri_ext) { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1353 r->uri_ext = new + (r->uri_ext - old); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1354 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1355 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1356 if (r->args_start) { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1357 r->args_start = new + (r->args_start - old); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1358 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1359 |
1677
c997912a8f0b
copy protocol value when large request line is copied,
Igor Sysoev <igor@sysoev.ru>
parents:
1676
diff
changeset
|
1360 if (r->http_protocol.data) { |
c997912a8f0b
copy protocol value when large request line is copied,
Igor Sysoev <igor@sysoev.ru>
parents:
1676
diff
changeset
|
1361 r->http_protocol.data = new + (r->http_protocol.data - old); |
c997912a8f0b
copy protocol value when large request line is copied,
Igor Sysoev <igor@sysoev.ru>
parents:
1676
diff
changeset
|
1362 } |
c997912a8f0b
copy protocol value when large request line is copied,
Igor Sysoev <igor@sysoev.ru>
parents:
1676
diff
changeset
|
1363 |
435
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1364 } else { |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1365 r->header_name_start = new; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1366 r->header_name_end = new + (r->header_name_end - old); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1367 r->header_start = new + (r->header_start - old); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1368 r->header_end = new + (r->header_end - old); |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1369 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1370 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1371 r->header_in = b; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1372 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1373 return NGX_OK; |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1374 } |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1375 |
5cdc4838d4e8
nginx-0.0.11-2004-09-22-20:18:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
432
diff
changeset
|
1376 |
501 | 1377 static ngx_int_t |
509 | 1378 ngx_http_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, |
1379 ngx_uint_t offset) | |
1380 { | |
1381 ngx_table_elt_t **ph; | |
1382 | |
1383 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset); | |
1384 | |
1385 if (*ph == NULL) { | |
1386 *ph = h; | |
1387 } | |
1388 | |
1389 return NGX_OK; | |
1390 } | |
1391 | |
1392 | |
1393 static ngx_int_t | |
523 | 1394 ngx_http_process_unique_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, |
1395 ngx_uint_t offset) | |
1396 { | |
1397 ngx_table_elt_t **ph; | |
1398 | |
1399 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset); | |
1400 | |
1401 if (*ph == NULL) { | |
1402 *ph = h; | |
1403 return NGX_OK; | |
1404 } | |
1405 | |
1406 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, | |
681 | 1407 "client sent duplicate header line: \"%V: %V\", " |
1408 "previous value: \"%V: %V\"", | |
1409 &h->key, &h->value, &(*ph)->key, &(*ph)->value); | |
523 | 1410 |
1411 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); | |
1412 | |
1413 return NGX_ERROR; | |
1414 } | |
1415 | |
1416 | |
1417 static ngx_int_t | |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1418 ngx_http_process_host(ngx_http_request_t *r, ngx_table_elt_t *h, |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1419 ngx_uint_t offset) |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1420 { |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1421 ngx_int_t rc; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1422 ngx_str_t host; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1423 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1424 if (r->headers_in.host == NULL) { |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1425 r->headers_in.host = h; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1426 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1427 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1428 host = h->value; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1429 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1430 rc = ngx_http_validate_host(&host, r->pool, 0); |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1431 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1432 if (rc == NGX_DECLINED) { |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1433 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1434 "client sent invalid host header"); |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1435 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1436 return NGX_ERROR; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1437 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1438 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1439 if (rc == NGX_ERROR) { |
3152 | 1440 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
1441 return NGX_ERROR; | |
1442 } | |
1443 | |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1444 if (r->headers_in.server.len) { |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1445 return NGX_OK; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1446 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1447 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1448 r->headers_in.server = host; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1449 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1450 return NGX_OK; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1451 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1452 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1453 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1454 static ngx_int_t |
1467
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1455 ngx_http_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h, |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1456 ngx_uint_t offset) |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1457 { |
1549 | 1458 if (ngx_strcasestrn(h->value.data, "close", 5 - 1)) { |
1467
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1459 r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE; |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1460 |
1549 | 1461 } else if (ngx_strcasestrn(h->value.data, "keep-alive", 10 - 1)) { |
1467
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1462 r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE; |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1463 } |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1464 |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1465 return NGX_OK; |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1466 } |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1467 |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1468 |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1469 static ngx_int_t |
2004
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1470 ngx_http_process_user_agent(ngx_http_request_t *r, ngx_table_elt_t *h, |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1471 ngx_uint_t offset) |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1472 { |
2205 | 1473 u_char *user_agent, *msie; |
2004
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1474 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1475 if (r->headers_in.user_agent) { |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1476 return NGX_OK; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1477 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1478 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1479 r->headers_in.user_agent = h; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1480 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1481 /* check some widespread browsers while the header is in CPU cache */ |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1482 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1483 user_agent = h->value.data; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1484 |
2205 | 1485 msie = ngx_strstrn(user_agent, "MSIE ", 5 - 1); |
1486 | |
1487 if (msie && msie + 7 < user_agent + h->value.len) { | |
2004
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1488 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1489 r->headers_in.msie = 1; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1490 |
2205 | 1491 if (msie[6] == '.') { |
1492 | |
1493 switch (msie[5]) { | |
1494 case '4': | |
1495 case '5': | |
3054
a137de814516
do not disable gzip for MSIE 6.0 SV1 in "gzip_disable msie6"
Igor Sysoev <igor@sysoev.ru>
parents:
3052
diff
changeset
|
1496 r->headers_in.msie6 = 1; |
a137de814516
do not disable gzip for MSIE 6.0 SV1 in "gzip_disable msie6"
Igor Sysoev <igor@sysoev.ru>
parents:
3052
diff
changeset
|
1497 break; |
2205 | 1498 case '6': |
3054
a137de814516
do not disable gzip for MSIE 6.0 SV1 in "gzip_disable msie6"
Igor Sysoev <igor@sysoev.ru>
parents:
3052
diff
changeset
|
1499 if (ngx_strstrn(msie + 8, "SV1", 3 - 1) == NULL) { |
a137de814516
do not disable gzip for MSIE 6.0 SV1 in "gzip_disable msie6"
Igor Sysoev <igor@sysoev.ru>
parents:
3052
diff
changeset
|
1500 r->headers_in.msie6 = 1; |
a137de814516
do not disable gzip for MSIE 6.0 SV1 in "gzip_disable msie6"
Igor Sysoev <igor@sysoev.ru>
parents:
3052
diff
changeset
|
1501 } |
a137de814516
do not disable gzip for MSIE 6.0 SV1 in "gzip_disable msie6"
Igor Sysoev <igor@sysoev.ru>
parents:
3052
diff
changeset
|
1502 break; |
2205 | 1503 } |
2004
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1504 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1505 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1506 #if 0 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1507 /* MSIE ignores the SSL "close notify" alert */ |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1508 if (c->ssl) { |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1509 c->ssl->no_send_shutdown = 1; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1510 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1511 #endif |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1512 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1513 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1514 if (ngx_strstrn(user_agent, "Opera", 5 - 1)) { |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1515 r->headers_in.opera = 1; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1516 r->headers_in.msie = 0; |
2205 | 1517 r->headers_in.msie6 = 0; |
2004
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1518 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1519 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1520 if (!r->headers_in.msie && !r->headers_in.opera) { |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1521 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1522 if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) { |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1523 r->headers_in.gecko = 1; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1524 |
3315 | 1525 } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) { |
1526 r->headers_in.chrome = 1; | |
1527 | |
4552
b00098cbc44d
Restricted keepalive_disable safari to OS X only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4472
diff
changeset
|
1528 } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1) |
b00098cbc44d
Restricted keepalive_disable safari to OS X only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4472
diff
changeset
|
1529 && ngx_strstrn(user_agent, "Mac OS X", 8 - 1)) |
b00098cbc44d
Restricted keepalive_disable safari to OS X only.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4472
diff
changeset
|
1530 { |
3419
fcd72b8d69f3
disable keepalive for Safari:
Igor Sysoev <igor@sysoev.ru>
parents:
3416
diff
changeset
|
1531 r->headers_in.safari = 1; |
fcd72b8d69f3
disable keepalive for Safari:
Igor Sysoev <igor@sysoev.ru>
parents:
3416
diff
changeset
|
1532 |
2004
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1533 } else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) { |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1534 r->headers_in.konqueror = 1; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1535 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1536 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1537 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1538 return NGX_OK; |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1539 } |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1540 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1541 |
38fa1d3a31b7
test user agent in header callback
Igor Sysoev <igor@sysoev.ru>
parents:
1974
diff
changeset
|
1542 static ngx_int_t |
5084
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1543 ngx_http_process_multi_header_lines(ngx_http_request_t *r, ngx_table_elt_t *h, |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1544 ngx_uint_t offset) |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1545 { |
5084
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1546 ngx_array_t *headers; |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1547 ngx_table_elt_t **ph; |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1548 |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1549 headers = (ngx_array_t *) ((char *) &r->headers_in + offset); |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1550 |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1551 if (headers->elts == NULL) { |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1552 if (ngx_array_init(headers, r->pool, 1, sizeof(ngx_table_elt_t *)) |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1553 != NGX_OK) |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1554 { |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1555 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1556 return NGX_ERROR; |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1557 } |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1558 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1559 |
5084
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1560 ph = ngx_array_push(headers); |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1561 if (ph == NULL) { |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1562 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1563 return NGX_ERROR; |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1564 } |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1565 |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1566 *ph = h; |
f7fe817c92a2
Correctly handle multiple X-Forwarded-For headers (ticket #106).
Ruslan Ermilov <ru@nginx.com>
parents:
5082
diff
changeset
|
1567 return NGX_OK; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1568 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1569 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1570 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1571 static ngx_int_t |
501 | 1572 ngx_http_process_request_header(ngx_http_request_t *r) |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1573 { |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1574 if (ngx_http_set_virtual_server(r, &r->headers_in.server) == NGX_ERROR) { |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1575 return NGX_ERROR; |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1576 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1577 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1578 if (r->headers_in.host == NULL && r->http_version > NGX_HTTP_VERSION_10) { |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1579 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1580 "client sent HTTP/1.1 request without \"Host\" header"); |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1581 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1582 return NGX_ERROR; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1583 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1584 |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1585 if (r->headers_in.content_length) { |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1586 r->headers_in.content_length_n = |
663 | 1587 ngx_atoof(r->headers_in.content_length->value.data, |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1588 r->headers_in.content_length->value.len); |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1589 |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1590 if (r->headers_in.content_length_n == NGX_ERROR) { |
505 | 1591 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, |
1592 "client sent invalid \"Content-Length\" header"); | |
4930
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1593 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
505 | 1594 return NGX_ERROR; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1595 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1596 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1597 |
1464 | 1598 if (r->method & NGX_HTTP_TRACE) { |
1151 | 1599 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, |
1600 "client sent TRACE method"); | |
1601 ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED); | |
1602 return NGX_ERROR; | |
1603 } | |
1604 | |
4930
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1605 if (r->headers_in.transfer_encoding) { |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1606 if (r->headers_in.transfer_encoding->value.len == 7 |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1607 && ngx_strncasecmp(r->headers_in.transfer_encoding->value.data, |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1608 (u_char *) "chunked", 7) == 0) |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1609 { |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1610 r->headers_in.content_length = NULL; |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1611 r->headers_in.content_length_n = -1; |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1612 r->headers_in.chunked = 1; |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1613 |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1614 } else if (r->headers_in.transfer_encoding->value.len != 8 |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1615 || ngx_strncasecmp(r->headers_in.transfer_encoding->value.data, |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1616 (u_char *) "identity", 8) != 0) |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1617 { |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1618 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1619 "client sent unknown \"Transfer-Encoding\": \"%V\"", |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1620 &r->headers_in.transfer_encoding->value); |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1621 ngx_http_finalize_request(r, NGX_HTTP_NOT_IMPLEMENTED); |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1622 return NGX_ERROR; |
6f085bfcdb4d
Request body: chunked transfer encoding support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4891
diff
changeset
|
1623 } |
298
4a3f18406832
nginx-0.0.3-2004-03-30-10:27:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
1624 } |
4a3f18406832
nginx-0.0.3-2004-03-30-10:27:36 import
Igor Sysoev <igor@sysoev.ru>
parents:
294
diff
changeset
|
1625 |
1467
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1626 if (r->headers_in.connection_type == NGX_HTTP_CONNECTION_KEEP_ALIVE) { |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1627 if (r->headers_in.keep_alive) { |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1628 r->headers_in.keep_alive_n = |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1629 ngx_atotm(r->headers_in.keep_alive->value.data, |
e5352b711c47
there may be several "Connection" header lines and each may have several tokens
Igor Sysoev <igor@sysoev.ru>
parents:
1464
diff
changeset
|
1630 r->headers_in.keep_alive->value.len); |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1631 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1632 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1633 |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1634 return NGX_OK; |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1635 } |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1636 |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1637 |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1638 static void |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1639 ngx_http_process_request(ngx_http_request_t *r) |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1640 { |
1704
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
1641 ngx_connection_t *c; |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1642 |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1643 c = r->connection; |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1644 |
1676
447765dc6d67
do not allow plain 0.9 request to HTTPS
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
1645 if (r->plain_http) { |
447765dc6d67
do not allow plain 0.9 request to HTTPS
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
1646 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
447765dc6d67
do not allow plain 0.9 request to HTTPS
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
1647 "client sent plain HTTP request to HTTPS port"); |
447765dc6d67
do not allow plain 0.9 request to HTTPS
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
1648 ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS); |
447765dc6d67
do not allow plain 0.9 request to HTTPS
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
1649 return; |
447765dc6d67
do not allow plain 0.9 request to HTTPS
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
1650 } |
447765dc6d67
do not allow plain 0.9 request to HTTPS
Igor Sysoev <igor@sysoev.ru>
parents:
1658
diff
changeset
|
1651 |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1652 #if (NGX_HTTP_SSL) |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1653 |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1654 if (c->ssl) { |
1704
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
1655 long rc; |
1974
f32cc6df6bd6
fix memory leak when ssl_verify_client is on
Igor Sysoev <igor@sysoev.ru>
parents:
1924
diff
changeset
|
1656 X509 *cert; |
1704
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
1657 ngx_http_ssl_srv_conf_t *sscf; |
e584e946e198
move condition declarations inside blocks where they are used
Igor Sysoev <igor@sysoev.ru>
parents:
1677
diff
changeset
|
1658 |
669 | 1659 sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module); |
1660 | |
2994 | 1661 if (sscf->verify) { |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1662 rc = SSL_get_verify_result(c->ssl->connection); |
669 | 1663 |
4884
e406c997470a
SSL: the "ssl_verify_client" directive parameter "optional_no_ca".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4770
diff
changeset
|
1664 if (rc != X509_V_OK |
e406c997470a
SSL: the "ssl_verify_client" directive parameter "optional_no_ca".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4770
diff
changeset
|
1665 && (sscf->verify != 3 || !ngx_ssl_verify_error_optional(rc))) |
e406c997470a
SSL: the "ssl_verify_client" directive parameter "optional_no_ca".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4770
diff
changeset
|
1666 { |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1667 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
671 | 1668 "client SSL certificate verify error: (%l:%s)", |
669 | 1669 rc, X509_verify_cert_error_string(rc)); |
1924
291689a7e5dc
invalidate SSL session if there is no valid client certificate
Igor Sysoev <igor@sysoev.ru>
parents:
1894
diff
changeset
|
1670 |
291689a7e5dc
invalidate SSL session if there is no valid client certificate
Igor Sysoev <igor@sysoev.ru>
parents:
1894
diff
changeset
|
1671 ngx_ssl_remove_cached_session(sscf->ssl.ctx, |
291689a7e5dc
invalidate SSL session if there is no valid client certificate
Igor Sysoev <igor@sysoev.ru>
parents:
1894
diff
changeset
|
1672 (SSL_get0_session(c->ssl->connection))); |
291689a7e5dc
invalidate SSL session if there is no valid client certificate
Igor Sysoev <igor@sysoev.ru>
parents:
1894
diff
changeset
|
1673 |
669 | 1674 ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR); |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1675 return; |
669 | 1676 } |
1677 | |
2994 | 1678 if (sscf->verify == 1) { |
1679 cert = SSL_get_peer_certificate(c->ssl->connection); | |
1680 | |
1681 if (cert == NULL) { | |
1682 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
1683 "client sent no required SSL certificate"); | |
1684 | |
1685 ngx_ssl_remove_cached_session(sscf->ssl.ctx, | |
1924
291689a7e5dc
invalidate SSL session if there is no valid client certificate
Igor Sysoev <igor@sysoev.ru>
parents:
1894
diff
changeset
|
1686 (SSL_get0_session(c->ssl->connection))); |
291689a7e5dc
invalidate SSL session if there is no valid client certificate
Igor Sysoev <igor@sysoev.ru>
parents:
1894
diff
changeset
|
1687 |
2994 | 1688 ngx_http_finalize_request(r, NGX_HTTPS_NO_CERT); |
1689 return; | |
1690 } | |
1691 | |
1692 X509_free(cert); | |
669 | 1693 } |
1694 } | |
1695 } | |
1696 | |
1697 #endif | |
1698 | |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1699 if (c->read->timer_set) { |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1700 ngx_del_timer(c->read); |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1701 } |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1702 |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1703 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
1704 (void) ngx_atomic_fetch_add(ngx_stat_reading, -1); |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1705 r->stat_reading = 0; |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
1706 (void) ngx_atomic_fetch_add(ngx_stat_writing, 1); |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1707 r->stat_writing = 1; |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1708 #endif |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1709 |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1710 c->read->handler = ngx_http_request_handler; |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1711 c->write->handler = ngx_http_request_handler; |
1368
202cae9a0c2b
rename ngx_http_block_read() and ngx_http_test_read() to ..._reading()
Igor Sysoev <igor@sysoev.ru>
parents:
1283
diff
changeset
|
1712 r->read_event_handler = ngx_http_block_reading; |
1233
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1713 |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1714 ngx_http_handler(r); |
754f3648642d
fix ssl_verify_client for HTTP/0.9
Igor Sysoev <igor@sysoev.ru>
parents:
1219
diff
changeset
|
1715 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1716 ngx_http_run_posted_requests(c); |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1717 } |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1718 |
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
1719 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1720 static ngx_int_t |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1721 ngx_http_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc) |
477 | 1722 { |
4313
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1723 u_char *h, ch; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1724 size_t i, dot_pos, host_len; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1725 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1726 enum { |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1727 sw_usual = 0, |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1728 sw_literal, |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1729 sw_rest |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1730 } state; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1731 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1732 dot_pos = host->len; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1733 host_len = host->len; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1734 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1735 h = host->data; |
4313
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1736 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1737 state = sw_usual; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1738 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1739 for (i = 0; i < host->len; i++) { |
3152 | 1740 ch = h[i]; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1741 |
4313
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1742 switch (ch) { |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1743 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1744 case '.': |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1745 if (dot_pos == i - 1) { |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1746 return NGX_DECLINED; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1747 } |
4313
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1748 dot_pos = i; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1749 break; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1750 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1751 case ':': |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1752 if (state == sw_usual) { |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1753 host_len = i; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1754 state = sw_rest; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1755 } |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1756 break; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1757 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1758 case '[': |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1759 if (i == 0) { |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1760 state = sw_literal; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1761 } |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1762 break; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1763 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1764 case ']': |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1765 if (state == sw_literal) { |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1766 host_len = i + 1; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1767 state = sw_rest; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1768 } |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1769 break; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1770 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1771 case '\0': |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1772 return NGX_DECLINED; |
4313
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1773 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1774 default: |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1775 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1776 if (ngx_path_separator(ch)) { |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1777 return NGX_DECLINED; |
4313
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1778 } |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1779 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1780 if (ch >= 'A' && ch <= 'Z') { |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1781 alloc = 1; |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1782 } |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1783 |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1784 break; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1785 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1786 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1787 |
4313
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1788 if (dot_pos == host_len - 1) { |
e7db97bfac25
Added support for IP-literal in the Host header and request line (ticket #1).
Valentin Bartenev <vbart@nginx.com>
parents:
4304
diff
changeset
|
1789 host_len--; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1790 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1791 |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1792 if (host_len == 0) { |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1793 return NGX_DECLINED; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1794 } |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1795 |
3152 | 1796 if (alloc) { |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1797 host->data = ngx_pnalloc(pool, host_len); |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1798 if (host->data == NULL) { |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1799 return NGX_ERROR; |
3152 | 1800 } |
1801 | |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1802 ngx_strlow(host->data, h, host_len); |
3152 | 1803 } |
1804 | |
5087
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1805 host->len = host_len; |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1806 |
66e0f9adbc8c
Changed interface of ngx_http_validate_host().
Valentin Bartenev <vbart@nginx.com>
parents:
5086
diff
changeset
|
1807 return NGX_OK; |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1808 } |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1809 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1810 |
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1811 static ngx_int_t |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1812 ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host) |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1813 { |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1814 ngx_int_t rc; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1815 ngx_http_connection_t *hc; |
593 | 1816 ngx_http_core_loc_conf_t *clcf; |
1817 ngx_http_core_srv_conf_t *cscf; | |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1818 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1819 hc = r->http_connection; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1820 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1821 rc = ngx_http_find_virtual_server(r->connection, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1822 hc->addr_conf->virtual_names, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1823 host, r, &cscf); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1824 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1825 if (rc == NGX_ERROR) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1826 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1827 return NGX_ERROR; |
477 | 1828 } |
1829 | |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1830 if (rc == NGX_DECLINED) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1831 return NGX_OK; |
1387 | 1832 } |
1833 | |
593 | 1834 r->srv_conf = cscf->ctx->srv_conf; |
1835 r->loc_conf = cscf->ctx->loc_conf; | |
509 | 1836 |
1837 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
5086
1b204b8ea9a3
Introduced the ngx_http_set_connection_log() macro.
Valentin Bartenev <vbart@nginx.com>
parents:
5085
diff
changeset
|
1838 |
1b204b8ea9a3
Introduced the ngx_http_set_connection_log() macro.
Valentin Bartenev <vbart@nginx.com>
parents:
5085
diff
changeset
|
1839 ngx_http_set_connection_log(r->connection, clcf->error_log); |
477 | 1840 |
2007
b9de93d804ea
*) host in request line has priority
Igor Sysoev <igor@sysoev.ru>
parents:
2005
diff
changeset
|
1841 return NGX_OK; |
477 | 1842 } |
1843 | |
1844 | |
5088
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1845 static ngx_int_t |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1846 ngx_http_find_virtual_server(ngx_connection_t *c, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1847 ngx_http_virtual_names_t *virtual_names, ngx_str_t *host, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1848 ngx_http_request_t *r, ngx_http_core_srv_conf_t **cscfp) |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1849 { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1850 ngx_http_core_srv_conf_t *cscf; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1851 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1852 if (virtual_names == NULL) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1853 return NGX_DECLINED; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1854 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1855 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1856 cscf = ngx_hash_find_combined(&virtual_names->names, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1857 ngx_hash_key(host->data, host->len), |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1858 host->data, host->len); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1859 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1860 if (cscf) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1861 *cscfp = cscf; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1862 return NGX_OK; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1863 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1864 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1865 #if (NGX_PCRE) |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1866 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1867 if (host->len && virtual_names->nregex) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1868 ngx_int_t n; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1869 ngx_uint_t i; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1870 ngx_http_server_name_t *sn; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1871 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1872 sn = virtual_names->regex; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1873 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1874 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1875 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1876 if (r == NULL) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1877 for (i = 0; i < virtual_names->nregex; i++) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1878 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1879 n = ngx_regex_exec(sn[i].regex->regex, host, NULL, 0); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1880 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1881 if (n == NGX_REGEX_NO_MATCHED) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1882 continue; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1883 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1884 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1885 if (n >= 0) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1886 *cscfp = sn[i].server; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1887 return NGX_OK; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1888 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1889 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1890 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1891 ngx_regex_exec_n " failed: %i " |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1892 "on \"%V\" using \"%V\"", |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1893 n, host, &sn[i].regex->name); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1894 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1895 return NGX_ERROR; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1896 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1897 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1898 return NGX_DECLINED; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1899 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1900 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1901 #endif /* SSL_CTRL_SET_TLSEXT_HOSTNAME */ |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1902 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1903 for (i = 0; i < virtual_names->nregex; i++) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1904 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1905 n = ngx_http_regex_exec(r, sn[i].regex, host); |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1906 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1907 if (n == NGX_DECLINED) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1908 continue; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1909 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1910 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1911 if (n == NGX_OK) { |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1912 *cscfp = sn[i].server; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1913 return NGX_OK; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1914 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1915 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1916 return NGX_ERROR; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1917 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1918 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1919 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1920 #endif /* NGX_PCRE */ |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1921 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1922 return NGX_DECLINED; |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1923 } |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1924 |
ac31fcecb464
SNI: ignore captures in server_name regexes when matching by SNI.
Valentin Bartenev <vbart@nginx.com>
parents:
5087
diff
changeset
|
1925 |
509 | 1926 static void |
1927 ngx_http_request_handler(ngx_event_t *ev) | |
1928 { | |
1929 ngx_connection_t *c; | |
1930 ngx_http_request_t *r; | |
665 | 1931 ngx_http_log_ctx_t *ctx; |
509 | 1932 |
1933 c = ev->data; | |
1934 r = c->data; | |
1935 | |
665 | 1936 ctx = c->log->data; |
1937 ctx->current_request = r; | |
1938 | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1939 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1940 "http run request: \"%V?%V\"", &r->uri, &r->args); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1941 |
509 | 1942 if (ev->write) { |
1943 r->write_event_handler(r); | |
1944 | |
1945 } else { | |
1946 r->read_event_handler(r); | |
1947 } | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1948 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1949 ngx_http_run_posted_requests(c); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1950 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1951 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1952 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1953 void |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1954 ngx_http_run_posted_requests(ngx_connection_t *c) |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1955 { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1956 ngx_http_request_t *r; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1957 ngx_http_log_ctx_t *ctx; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1958 ngx_http_posted_request_t *pr; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1959 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1960 for ( ;; ) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1961 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1962 if (c->destroyed) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1963 return; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1964 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1965 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1966 r = c->data; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1967 pr = r->main->posted_requests; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1968 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1969 if (pr == NULL) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1970 return; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1971 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1972 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1973 r->main->posted_requests = pr->next; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1974 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1975 r = pr->request; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1976 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1977 ctx = c->log->data; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1978 ctx->current_request = r; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1979 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1980 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1981 "http posted request: \"%V?%V\"", &r->uri, &r->args); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1982 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1983 r->write_event_handler(r); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1984 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1985 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1986 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1987 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1988 ngx_int_t |
3064 | 1989 ngx_http_post_request(ngx_http_request_t *r, ngx_http_posted_request_t *pr) |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1990 { |
3064 | 1991 ngx_http_posted_request_t **p; |
1992 | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1993 if (pr == NULL) { |
3064 | 1994 pr = ngx_palloc(r->pool, sizeof(ngx_http_posted_request_t)); |
1995 if (pr == NULL) { | |
1996 return NGX_ERROR; | |
1997 } | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1998 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
1999 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2000 pr->request = r; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2001 pr->next = NULL; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2002 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2003 for (p = &r->main->posted_requests; *p; p = &(*p)->next) { /* void */ } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2004 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2005 *p = pr; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2006 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2007 return NGX_OK; |
509 | 2008 } |
2009 | |
2010 | |
501 | 2011 void |
509 | 2012 ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc) |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2013 { |
1424
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2014 ngx_connection_t *c; |
509 | 2015 ngx_http_request_t *pr; |
210
00cafae0bdf1
nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
209
diff
changeset
|
2016 ngx_http_core_loc_conf_t *clcf; |
00cafae0bdf1
nginx-0.0.1-2003-12-14-23:10:27 import
Igor Sysoev <igor@sysoev.ru>
parents:
209
diff
changeset
|
2017 |
3049 | 2018 c = r->connection; |
2019 | |
2020 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0, | |
2021 "http finalize request: %d, \"%V?%V\" a:%d, c:%d", | |
2022 rc, &r->uri, &r->args, r == c->data, r->main->count); | |
2023 | |
509 | 2024 if (rc == NGX_DONE) { |
3049 | 2025 ngx_http_finalize_connection(r); |
509 | 2026 return; |
2027 } | |
2028 | |
2819
43fe53832da7
handle big responses for "size" and "test" image_filters
Igor Sysoev <igor@sysoev.ru>
parents:
2785
diff
changeset
|
2029 if (rc == NGX_OK && r->filter_finalize) { |
43fe53832da7
handle big responses for "size" and "test" image_filters
Igor Sysoev <igor@sysoev.ru>
parents:
2785
diff
changeset
|
2030 c->error = 1; |
43fe53832da7
handle big responses for "size" and "test" image_filters
Igor Sysoev <igor@sysoev.ru>
parents:
2785
diff
changeset
|
2031 } |
43fe53832da7
handle big responses for "size" and "test" image_filters
Igor Sysoev <igor@sysoev.ru>
parents:
2785
diff
changeset
|
2032 |
681 | 2033 if (rc == NGX_DECLINED) { |
2034 r->content_handler = NULL; | |
2035 r->write_event_handler = ngx_http_core_run_phases; | |
2036 ngx_http_core_run_phases(r); | |
2037 return; | |
2038 } | |
2039 | |
777
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
716
diff
changeset
|
2040 if (r != r->main && r->post_subrequest) { |
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
716
diff
changeset
|
2041 rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc); |
667 | 2042 } |
2043 | |
1783 | 2044 if (rc == NGX_ERROR |
2045 || rc == NGX_HTTP_REQUEST_TIME_OUT | |
2046 || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST | |
2047 || c->error) | |
2048 { | |
613 | 2049 if (ngx_http_post_action(r) == NGX_OK) { |
2050 return; | |
2051 } | |
2052 | |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2053 if (r->main->blocked) { |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2054 r->write_event_handler = ngx_http_request_finalizer; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2055 } |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2056 |
3049 | 2057 ngx_http_terminate_request(r, rc); |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
2058 return; |
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
2059 } |
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
2060 |
637 | 2061 if (rc >= NGX_HTTP_SPECIAL_RESPONSE |
2062 || rc == NGX_HTTP_CREATED | |
2063 || rc == NGX_HTTP_NO_CONTENT) | |
2064 { | |
587 | 2065 if (rc == NGX_HTTP_CLOSE) { |
3049 | 2066 ngx_http_terminate_request(r, rc); |
587 | 2067 return; |
2068 } | |
2069 | |
597 | 2070 if (r == r->main) { |
1424
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2071 if (c->read->timer_set) { |
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2072 ngx_del_timer(c->read); |
569 | 2073 } |
2074 | |
1424
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2075 if (c->write->timer_set) { |
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2076 ngx_del_timer(c->write); |
569 | 2077 } |
2078 } | |
2079 | |
2250
7fc20e1105cd
set request handlers, this fixes complex proxied 400 handler with SSI includes
Igor Sysoev <igor@sysoev.ru>
parents:
2233
diff
changeset
|
2080 c->read->handler = ngx_http_request_handler; |
7fc20e1105cd
set request handlers, this fixes complex proxied 400 handler with SSI includes
Igor Sysoev <igor@sysoev.ru>
parents:
2233
diff
changeset
|
2081 c->write->handler = ngx_http_request_handler; |
7fc20e1105cd
set request handlers, this fixes complex proxied 400 handler with SSI includes
Igor Sysoev <igor@sysoev.ru>
parents:
2233
diff
changeset
|
2082 |
569 | 2083 ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc)); |
2084 return; | |
2085 } | |
2086 | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2087 if (r != r->main) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2088 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2089 if (r->buffered || r->postponed) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2090 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2091 if (ngx_http_set_write_handler(r) != NGX_OK) { |
3049 | 2092 ngx_http_terminate_request(r, 0); |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2093 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2094 |
525 | 2095 return; |
2096 } | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2097 |
509 | 2098 pr = r->parent; |
2099 | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2100 if (r == c->data) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2101 |
3049 | 2102 r->main->count--; |
4471
b19a651471d9
Core: protection from subrequest loops.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
2103 r->main->subrequests++; |
3049 | 2104 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2105 if (!r->logged) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2106 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2107 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2108 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2109 if (clcf->log_subrequest) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2110 ngx_http_log_request(r); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2111 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2112 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2113 r->logged = 1; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2114 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2115 } else { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2116 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2117 "subrequest: \"%V?%V\" logged again", |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2118 &r->uri, &r->args); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2119 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2120 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2121 r->done = 1; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2122 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2123 if (pr->postponed && pr->postponed->request == r) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2124 pr->postponed = pr->postponed->next; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2125 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2126 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2127 c->data = pr; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2128 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2129 } else { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2130 |
4612
c42553296af1
Removed surplus condition.
Valentin Bartenev <vbart@nginx.com>
parents:
4594
diff
changeset
|
2131 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
c42553296af1
Removed surplus condition.
Valentin Bartenev <vbart@nginx.com>
parents:
4594
diff
changeset
|
2132 "http finalize non-active request: \"%V?%V\"", |
c42553296af1
Removed surplus condition.
Valentin Bartenev <vbart@nginx.com>
parents:
4594
diff
changeset
|
2133 &r->uri, &r->args); |
c42553296af1
Removed surplus condition.
Valentin Bartenev <vbart@nginx.com>
parents:
4594
diff
changeset
|
2134 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2135 r->write_event_handler = ngx_http_request_finalizer; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2136 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2137 if (r->waited) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2138 r->done = 1; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2139 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2140 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2141 |
3064 | 2142 if (ngx_http_post_request(pr, NULL) != NGX_OK) { |
3049 | 2143 r->main->count++; |
2144 ngx_http_terminate_request(r, 0); | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2145 return; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2146 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2147 |
1424
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2148 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2149 "http wake parent request: \"%V?%V\"", |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2150 &pr->uri, &pr->args); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2151 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2152 return; |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2153 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2154 |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2155 if (r->buffered || c->buffered || r->postponed || r->blocked) { |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2156 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2157 if (ngx_http_set_write_handler(r) != NGX_OK) { |
3049 | 2158 ngx_http_terminate_request(r, 0); |
2261 | 2159 } |
2160 | |
509 | 2161 return; |
2162 } | |
160
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
2163 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2164 if (r != c->data) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2165 ngx_log_error(NGX_LOG_ALERT, c->log, 0, |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2166 "http finalize non-active request: \"%V?%V\"", |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2167 &r->uri, &r->args); |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
2168 return; |
527 | 2169 } |
2170 | |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2171 r->done = 1; |
3415
1b8c3599e3ce
Fix segfault when while discarding body a write event handler is called,
Igor Sysoev <igor@sysoev.ru>
parents:
3325
diff
changeset
|
2172 r->write_event_handler = ngx_http_request_empty_handler; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2173 |
629 | 2174 if (!r->post_action) { |
2175 r->request_complete = 1; | |
2176 } | |
2177 | |
613 | 2178 if (ngx_http_post_action(r) == NGX_OK) { |
577 | 2179 return; |
2180 } | |
2181 | |
1424
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2182 if (c->read->timer_set) { |
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2183 ngx_del_timer(c->read); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2184 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2185 |
1424
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2186 if (c->write->timer_set) { |
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2187 c->write->delayed = 0; |
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2188 ngx_del_timer(c->write); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2189 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2190 |
1424
937fbbf611cd
optimize r->connection in ngx_http_finalize_request()
Igor Sysoev <igor@sysoev.ru>
parents:
1423
diff
changeset
|
2191 if (c->read->eof) { |
1423
75e908236701
cancel keep-alive and lingering close on EOF
Igor Sysoev <igor@sysoev.ru>
parents:
1387
diff
changeset
|
2192 ngx_http_close_request(r, 0); |
75e908236701
cancel keep-alive and lingering close on EOF
Igor Sysoev <igor@sysoev.ru>
parents:
1387
diff
changeset
|
2193 return; |
75e908236701
cancel keep-alive and lingering close on EOF
Igor Sysoev <igor@sysoev.ru>
parents:
1387
diff
changeset
|
2194 } |
75e908236701
cancel keep-alive and lingering close on EOF
Igor Sysoev <igor@sysoev.ru>
parents:
1387
diff
changeset
|
2195 |
3049 | 2196 ngx_http_finalize_connection(r); |
2197 } | |
2198 | |
2199 | |
2200 static void | |
2201 ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc) | |
2202 { | |
3064 | 2203 ngx_http_cleanup_t *cln; |
2204 ngx_http_request_t *mr; | |
2205 ngx_http_ephemeral_t *e; | |
3049 | 2206 |
2207 mr = r->main; | |
2208 | |
2209 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2210 "http terminate request count:%d", mr->count); |
3049 | 2211 |
3176
60bc5cc68d3b
log 499 instead 0, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3153
diff
changeset
|
2212 if (rc > 0 && (mr->headers_out.status == 0 || mr->connection->sent == 0)) { |
60bc5cc68d3b
log 499 instead 0, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3153
diff
changeset
|
2213 mr->headers_out.status = rc; |
60bc5cc68d3b
log 499 instead 0, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3153
diff
changeset
|
2214 } |
60bc5cc68d3b
log 499 instead 0, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3153
diff
changeset
|
2215 |
3049 | 2216 cln = mr->cleanup; |
2217 mr->cleanup = NULL; | |
2218 | |
2219 while (cln) { | |
2220 if (cln->handler) { | |
2221 cln->handler(cln->data); | |
2222 } | |
2223 | |
2224 cln = cln->next; | |
2225 } | |
2226 | |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2227 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2228 "http terminate cleanup count:%d blk:%d", |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2229 mr->count, mr->blocked); |
3049 | 2230 |
2231 if (mr->write_event_handler) { | |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2232 |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2233 if (mr->blocked) { |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2234 return; |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2235 } |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2236 |
3064 | 2237 e = ngx_http_ephemeral(mr); |
3051 | 2238 mr->posted_requests = NULL; |
2239 mr->write_event_handler = ngx_http_terminate_handler; | |
3064 | 2240 (void) ngx_http_post_request(mr, &e->terminal_posted_request); |
3049 | 2241 return; |
2242 } | |
2243 | |
2244 ngx_http_close_request(mr, rc); | |
2245 } | |
2246 | |
2247 | |
2248 static void | |
2249 ngx_http_terminate_handler(ngx_http_request_t *r) | |
2250 { | |
2251 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
2252 "http terminate handler count:%d", r->count); |
3049 | 2253 |
2254 r->count = 1; | |
2255 | |
2256 ngx_http_close_request(r, 0); | |
2257 } | |
2258 | |
2259 | |
2260 static void | |
2261 ngx_http_finalize_connection(ngx_http_request_t *r) | |
2262 { | |
2263 ngx_http_core_loc_conf_t *clcf; | |
2264 | |
3211
3ea03c1fe050
add lingering timeout if a response is short and a request body is being
Igor Sysoev <igor@sysoev.ru>
parents:
3180
diff
changeset
|
2265 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
3ea03c1fe050
add lingering timeout if a response is short and a request body is being
Igor Sysoev <igor@sysoev.ru>
parents:
3180
diff
changeset
|
2266 |
3049 | 2267 if (r->main->count != 1) { |
3211
3ea03c1fe050
add lingering timeout if a response is short and a request body is being
Igor Sysoev <igor@sysoev.ru>
parents:
3180
diff
changeset
|
2268 |
3214
798a7f1d3b2f
restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents:
3211
diff
changeset
|
2269 if (r->discard_body) { |
798a7f1d3b2f
restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents:
3211
diff
changeset
|
2270 r->read_event_handler = ngx_http_discarded_request_body_handler; |
3985
07d1aa82899b
always set timer in discard body handler, this fixes the cases
Igor Sysoev <igor@sysoev.ru>
parents:
3984
diff
changeset
|
2271 ngx_add_timer(r->connection->read, clcf->lingering_timeout); |
3214
798a7f1d3b2f
restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents:
3211
diff
changeset
|
2272 |
798a7f1d3b2f
restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents:
3211
diff
changeset
|
2273 if (r->lingering_time == 0) { |
798a7f1d3b2f
restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents:
3211
diff
changeset
|
2274 r->lingering_time = ngx_time() |
3211
3ea03c1fe050
add lingering timeout if a response is short and a request body is being
Igor Sysoev <igor@sysoev.ru>
parents:
3180
diff
changeset
|
2275 + (time_t) (clcf->lingering_time / 1000); |
3214
798a7f1d3b2f
restore discard body handler after ngx_http_set_writer() set it to
Igor Sysoev <igor@sysoev.ru>
parents:
3211
diff
changeset
|
2276 } |
3211
3ea03c1fe050
add lingering timeout if a response is short and a request body is being
Igor Sysoev <igor@sysoev.ru>
parents:
3180
diff
changeset
|
2277 } |
3ea03c1fe050
add lingering timeout if a response is short and a request body is being
Igor Sysoev <igor@sysoev.ru>
parents:
3180
diff
changeset
|
2278 |
3049 | 2279 ngx_http_close_request(r, 0); |
2280 return; | |
2281 } | |
2282 | |
230
1119faf4635a
nginx-0.0.1-2004-01-16-09:15:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
220
diff
changeset
|
2283 if (!ngx_terminate |
326
8733703a37f3
nginx-0.0.3-2004-04-26-00:13:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
323
diff
changeset
|
2284 && !ngx_exiting |
2019 | 2285 && r->keepalive |
230
1119faf4635a
nginx-0.0.1-2004-01-16-09:15:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
220
diff
changeset
|
2286 && clcf->keepalive_timeout > 0) |
1119faf4635a
nginx-0.0.1-2004-01-16-09:15:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
220
diff
changeset
|
2287 { |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2288 ngx_http_set_keepalive(r); |
230
1119faf4635a
nginx-0.0.1-2004-01-16-09:15:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
220
diff
changeset
|
2289 return; |
3984
3e51832c8215
lingering_close "off|on|always"
Igor Sysoev <igor@sysoev.ru>
parents:
3983
diff
changeset
|
2290 } |
3e51832c8215
lingering_close "off|on|always"
Igor Sysoev <igor@sysoev.ru>
parents:
3983
diff
changeset
|
2291 |
3e51832c8215
lingering_close "off|on|always"
Igor Sysoev <igor@sysoev.ru>
parents:
3983
diff
changeset
|
2292 if (clcf->lingering_close == NGX_HTTP_LINGERING_ALWAYS |
3e51832c8215
lingering_close "off|on|always"
Igor Sysoev <igor@sysoev.ru>
parents:
3983
diff
changeset
|
2293 || (clcf->lingering_close == NGX_HTTP_LINGERING_ON |
3e51832c8215
lingering_close "off|on|always"
Igor Sysoev <igor@sysoev.ru>
parents:
3983
diff
changeset
|
2294 && (r->lingering_close |
3e51832c8215
lingering_close "off|on|always"
Igor Sysoev <igor@sysoev.ru>
parents:
3983
diff
changeset
|
2295 || r->header_in->pos < r->header_in->last |
3e51832c8215
lingering_close "off|on|always"
Igor Sysoev <igor@sysoev.ru>
parents:
3983
diff
changeset
|
2296 || r->connection->read->ready))) |
3981
77604e9a1ed8
enable lingering close for pipelined requests
Igor Sysoev <igor@sysoev.ru>
parents:
3978
diff
changeset
|
2297 { |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2298 ngx_http_set_lingering_close(r); |
230
1119faf4635a
nginx-0.0.1-2004-01-16-09:15:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
220
diff
changeset
|
2299 return; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2300 } |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
2301 |
230
1119faf4635a
nginx-0.0.1-2004-01-16-09:15:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
220
diff
changeset
|
2302 ngx_http_close_request(r, 0); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2303 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2304 |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2305 |
525 | 2306 static ngx_int_t |
501 | 2307 ngx_http_set_write_handler(ngx_http_request_t *r) |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2308 { |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2309 ngx_event_t *wev; |
91
637625a2acdb
nginx-0.0.1-2003-05-19-20:39:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
89
diff
changeset
|
2310 ngx_http_core_loc_conf_t *clcf; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2311 |
509 | 2312 r->http_state = NGX_HTTP_WRITING_REQUEST_STATE; |
2313 | |
3215
4edf28522d24
allow discarding body while a long response transfer
Igor Sysoev <igor@sysoev.ru>
parents:
3214
diff
changeset
|
2314 r->read_event_handler = r->discard_body ? |
4edf28522d24
allow discarding body while a long response transfer
Igor Sysoev <igor@sysoev.ru>
parents:
3214
diff
changeset
|
2315 ngx_http_discarded_request_body_handler: |
4edf28522d24
allow discarding body while a long response transfer
Igor Sysoev <igor@sysoev.ru>
parents:
3214
diff
changeset
|
2316 ngx_http_test_reading; |
525 | 2317 r->write_event_handler = ngx_http_writer; |
2318 | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2319 wev = r->connection->write; |
369
9c2515d70489
nginx-0.0.7-2004-06-25-18:42:03 import
Igor Sysoev <igor@sysoev.ru>
parents:
368
diff
changeset
|
2320 |
362
7650aea1816f
nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
361
diff
changeset
|
2321 if (wev->ready && wev->delayed) { |
525 | 2322 return NGX_OK; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2323 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2324 |
509 | 2325 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
362
7650aea1816f
nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
361
diff
changeset
|
2326 if (!wev->delayed) { |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2327 ngx_add_timer(wev, clcf->send_timeout); |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2328 } |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2329 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2330 if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) { |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
2331 ngx_http_close_request(r, 0); |
525 | 2332 return NGX_ERROR; |
143
5526213be452
nginx-0.0.1-2003-10-10-19:10:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
142
diff
changeset
|
2333 } |
525 | 2334 |
2335 return NGX_OK; | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2336 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2337 |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2338 |
509 | 2339 static void |
2340 ngx_http_writer(ngx_http_request_t *r) | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2341 { |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2342 int rc; |
509 | 2343 ngx_event_t *wev; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2344 ngx_connection_t *c; |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2345 ngx_http_core_loc_conf_t *clcf; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2346 |
509 | 2347 c = r->connection; |
2348 wev = c->write; | |
2349 | |
583 | 2350 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0, |
2351 "http writer handler: \"%V?%V\"", &r->uri, &r->args); | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2352 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2353 clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2354 |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2355 if (wev->timedout) { |
362
7650aea1816f
nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
361
diff
changeset
|
2356 if (!wev->delayed) { |
505 | 2357 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, |
2358 "client timed out"); | |
2359 c->timedout = 1; | |
567 | 2360 |
613 | 2361 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT); |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2362 return; |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2363 } |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2364 |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2365 wev->timedout = 0; |
362
7650aea1816f
nginx-0.0.7-2004-06-21-19:59:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
361
diff
changeset
|
2366 wev->delayed = 0; |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2367 |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2368 if (!wev->ready) { |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2369 ngx_add_timer(wev, clcf->send_timeout); |
160
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
2370 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2371 if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) { |
569 | 2372 ngx_http_close_request(r, 0); |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2373 } |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2374 |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2375 return; |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2376 } |
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2377 |
4195
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2378 } |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2379 |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2380 if (wev->delayed || r->aio) { |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2381 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2382 "http writer delayed"); |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2383 |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2384 if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) { |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2385 ngx_http_close_request(r, 0); |
361
446782c909b3
nginx-0.0.7-2004-06-20-23:54:15 import
Igor Sysoev <igor@sysoev.ru>
parents:
358
diff
changeset
|
2386 } |
4195
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2387 |
35f4997c08ce
Fix for socket leak with "aio sendfile" and "limit_rate".
Maxim Dounin <mdounin@mdounin.ru>
parents:
4194
diff
changeset
|
2388 return; |
160
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
2389 } |
e7e094d34162
nginx-0.0.1-2003-10-27-11:53:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
159
diff
changeset
|
2390 |
583 | 2391 rc = ngx_http_output_filter(r, NULL); |
2392 | |
2393 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, | |
2394 "http writer output filter: %d, \"%V?%V\"", | |
2395 rc, &r->uri, &r->args); | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2396 |
2883
d0cba58e5bfa
fix socket leak introduced in r2378
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
2397 if (rc == NGX_ERROR) { |
d0cba58e5bfa
fix socket leak introduced in r2378
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
2398 ngx_http_finalize_request(r, rc); |
d0cba58e5bfa
fix socket leak introduced in r2378
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
2399 return; |
d0cba58e5bfa
fix socket leak introduced in r2378
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
2400 } |
d0cba58e5bfa
fix socket leak introduced in r2378
Igor Sysoev <igor@sysoev.ru>
parents:
2857
diff
changeset
|
2401 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2402 if (r->buffered || r->postponed || (r == r->main && c->buffered)) { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2403 |
4194
7ce8f2cde0af
Fix for connection drops with AIO.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4033
diff
changeset
|
2404 if (!wev->delayed) { |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2405 ngx_add_timer(wev, clcf->send_timeout); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2406 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2407 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2408 if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) { |
569 | 2409 ngx_http_close_request(r, 0); |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2410 } |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2411 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2412 return; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2413 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2414 |
583 | 2415 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0, |
2416 "http writer done: \"%V?%V\"", &r->uri, &r->args); | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2417 |
3216
79ae445ec57b
fix two previous commits: an early parallel body discarding completion
Igor Sysoev <igor@sysoev.ru>
parents:
3215
diff
changeset
|
2418 r->write_event_handler = ngx_http_request_empty_handler; |
79ae445ec57b
fix two previous commits: an early parallel body discarding completion
Igor Sysoev <igor@sysoev.ru>
parents:
3215
diff
changeset
|
2419 |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2420 ngx_http_finalize_request(r, rc); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2421 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2422 |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2423 |
2377
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2424 static void |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2425 ngx_http_request_finalizer(ngx_http_request_t *r) |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2426 { |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2427 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2428 "http finalizer done: \"%V?%V\"", &r->uri, &r->args); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2429 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2430 ngx_http_finalize_request(r, 0); |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2431 } |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2432 |
87b8c44906b5
*) refactor subrequest handling, now they run as separate posted requests
Igor Sysoev <igor@sysoev.ru>
parents:
2370
diff
changeset
|
2433 |
1368
202cae9a0c2b
rename ngx_http_block_read() and ngx_http_test_read() to ..._reading()
Igor Sysoev <igor@sysoev.ru>
parents:
1283
diff
changeset
|
2434 void |
202cae9a0c2b
rename ngx_http_block_read() and ngx_http_test_read() to ..._reading()
Igor Sysoev <igor@sysoev.ru>
parents:
1283
diff
changeset
|
2435 ngx_http_block_reading(ngx_http_request_t *r) |
13
2aba961a1d34
nginx-0.0.1-2002-09-16-19:01:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
12
diff
changeset
|
2436 { |
1283
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2437 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1368
202cae9a0c2b
rename ngx_http_block_read() and ngx_http_test_read() to ..._reading()
Igor Sysoev <igor@sysoev.ru>
parents:
1283
diff
changeset
|
2438 "http reading blocked"); |
1283
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2439 |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2440 /* aio does not call this handler */ |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2441 |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2442 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2443 && r->connection->read->active) |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2444 { |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2445 if (ngx_del_event(r->connection->read, NGX_READ_EVENT, 0) != NGX_OK) { |
1283
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2446 ngx_http_close_request(r, 0); |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2447 } |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2448 } |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2449 } |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2450 |
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2451 |
2294 | 2452 void |
1368
202cae9a0c2b
rename ngx_http_block_read() and ngx_http_test_read() to ..._reading()
Igor Sysoev <igor@sysoev.ru>
parents:
1283
diff
changeset
|
2453 ngx_http_test_reading(ngx_http_request_t *r) |
1283
a3f8d6d17b94
proxy_ignore_client_abort, fastcgi_ignore_client_abort, and so on were
Igor Sysoev <igor@sysoev.ru>
parents:
1253
diff
changeset
|
2454 { |
1061
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2455 int n; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2456 char buf[1]; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2457 ngx_err_t err; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2458 ngx_event_t *rev; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2459 ngx_connection_t *c; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2460 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2461 c = r->connection; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2462 rev = c->read; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2463 |
1368
202cae9a0c2b
rename ngx_http_block_read() and ngx_http_test_read() to ..._reading()
Igor Sysoev <igor@sysoev.ru>
parents:
1283
diff
changeset
|
2464 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http test reading"); |
1061
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2465 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2466 #if (NGX_HAVE_KQUEUE) |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2467 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2468 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2469 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2470 if (!rev->pending_eof) { |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2471 return; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2472 } |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2473 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2474 rev->eof = 1; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2475 c->error = 1; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2476 err = rev->kq_errno; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2477 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2478 goto closed; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2479 } |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2480 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2481 #endif |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2482 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2483 n = recv(c->fd, buf, 1, MSG_PEEK); |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2484 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2485 if (n == 0) { |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2486 rev->eof = 1; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2487 c->error = 1; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2488 err = 0; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2489 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2490 goto closed; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2491 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2492 } else if (n == -1) { |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2493 err = ngx_socket_errno; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2494 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2495 if (err != NGX_EAGAIN) { |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2496 rev->eof = 1; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2497 c->error = 1; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2498 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2499 goto closed; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2500 } |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2501 } |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2502 |
59
e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
2503 /* aio does not call this handler */ |
e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
2504 |
1061
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2505 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) { |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2506 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2507 if (ngx_del_event(rev, NGX_READ_EVENT, 0) != NGX_OK) { |
89
29bf798b583f
nginx-0.0.1-2003-05-15-19:42:53 import
Igor Sysoev <igor@sysoev.ru>
parents:
87
diff
changeset
|
2508 ngx_http_close_request(r, 0); |
29bf798b583f
nginx-0.0.1-2003-05-15-19:42:53 import
Igor Sysoev <igor@sysoev.ru>
parents:
87
diff
changeset
|
2509 } |
59
e8cdc2989cee
nginx-0.0.1-2003-02-06-20:21:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
2510 } |
1061
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2511 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2512 return; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2513 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2514 closed: |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2515 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2516 if (err) { |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2517 rev->error = 1; |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2518 } |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2519 |
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2520 ngx_log_error(NGX_LOG_INFO, c->log, err, |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4552
diff
changeset
|
2521 "client prematurely closed connection"); |
1061
9aca452fe12a
if client closes a connection prematurely, then epoll (at least
Igor Sysoev <igor@sysoev.ru>
parents:
1059
diff
changeset
|
2522 |
1115
f07a5f4017d9
finalize request to allow post_action
Igor Sysoev <igor@sysoev.ru>
parents:
1110
diff
changeset
|
2523 ngx_http_finalize_request(r, 0); |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2524 } |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2525 |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2526 |
501 | 2527 static void |
2528 ngx_http_set_keepalive(ngx_http_request_t *r) | |
60
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2529 { |
452 | 2530 int tcp_nodelay; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2531 ngx_int_t i; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2532 ngx_buf_t *b, *f; |
95
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
2533 ngx_event_t *rev, *wev; |
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
2534 ngx_connection_t *c; |
432
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
2535 ngx_http_connection_t *hc; |
95
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
2536 ngx_http_core_srv_conf_t *cscf; |
b48066122884
nginx-0.0.1-2003-05-23-15:53:01 import
Igor Sysoev <igor@sysoev.ru>
parents:
94
diff
changeset
|
2537 ngx_http_core_loc_conf_t *clcf; |
60
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2538 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2539 c = r->connection; |
65
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2540 rev = c->read; |
60
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2541 |
1373
fdea12ffb24a
discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents:
1368
diff
changeset
|
2542 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:
1368
diff
changeset
|
2543 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
2544 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler"); |
94
8220378432a8
nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
93
diff
changeset
|
2545 |
1373
fdea12ffb24a
discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents:
1368
diff
changeset
|
2546 if (r->discard_body) { |
2489
d1a7203a8a44
avoid a double redirect response if
Igor Sysoev <igor@sysoev.ru>
parents:
2388
diff
changeset
|
2547 r->write_event_handler = ngx_http_request_empty_handler; |
1373
fdea12ffb24a
discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents:
1368
diff
changeset
|
2548 r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000); |
fdea12ffb24a
discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents:
1368
diff
changeset
|
2549 ngx_add_timer(rev, clcf->lingering_timeout); |
fdea12ffb24a
discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents:
1368
diff
changeset
|
2550 return; |
fdea12ffb24a
discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents:
1368
diff
changeset
|
2551 } |
fdea12ffb24a
discard request body before going to keep-alive state and use lingering timeouts
Igor Sysoev <igor@sysoev.ru>
parents:
1368
diff
changeset
|
2552 |
483 | 2553 c->log->action = "closing request"; |
432
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
2554 |
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
2555 hc = r->http_connection; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2556 b = r->header_in; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2557 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2558 if (b->pos < b->last) { |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2559 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2560 /* the pipelined request */ |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2561 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2562 if (b != c->buffer) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2563 |
455 | 2564 /* |
2565 * If the large header buffers were allocated while the previous | |
2566 * request processing then we do not use c->buffer for | |
2567 * the pipelined request (see ngx_http_init_request()). | |
577 | 2568 * |
455 | 2569 * Now we would move the large header buffers to the free list. |
2570 */ | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2571 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2572 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2573 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2574 if (hc->free == NULL) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2575 hc->free = ngx_palloc(c->pool, |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2576 cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *)); |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2577 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2578 if (hc->free == NULL) { |
477 | 2579 ngx_http_close_request(r, 0); |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2580 return; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2581 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2582 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2583 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2584 for (i = 0; i < hc->nbusy - 1; i++) { |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2585 f = hc->busy[i]; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2586 hc->free[hc->nfree++] = f; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2587 f->pos = f->start; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2588 f->last = f->start; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2589 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2590 |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2591 hc->busy[0] = b; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2592 hc->nbusy = 1; |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2593 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2594 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2595 |
3180
0e420f3f8e18
clear r->keepalive to disable preventively calling
Igor Sysoev <igor@sysoev.ru>
parents:
3176
diff
changeset
|
2596 r->keepalive = 0; |
0e420f3f8e18
clear r->keepalive to disable preventively calling
Igor Sysoev <igor@sysoev.ru>
parents:
3176
diff
changeset
|
2597 |
3049 | 2598 ngx_http_free_request(r, 0); |
569 | 2599 |
432
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
2600 c->data = hc; |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2601 |
93
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
2602 ngx_add_timer(rev, clcf->keepalive_timeout); |
738fe44c70d5
nginx-0.0.1-2003-05-21-17:28:21 import
Igor Sysoev <igor@sysoev.ru>
parents:
92
diff
changeset
|
2603 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2604 if (ngx_handle_read_event(rev, 0) != NGX_OK) { |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2605 ngx_http_close_connection(c); |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2606 return; |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2607 } |
65
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2608 |
259
d30f2c39caae
nginx-0.0.2-2004-02-12-23:57:10 import
Igor Sysoev <igor@sysoev.ru>
parents:
258
diff
changeset
|
2609 wev = c->write; |
509 | 2610 wev->handler = ngx_http_empty_handler; |
65
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2611 |
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:
335
diff
changeset
|
2612 if (b->pos < b->last) { |
65
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2613 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
2614 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request"); |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2615 |
567 | 2616 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
2617 (void) ngx_atomic_fetch_add(ngx_stat_reading, 1); |
567 | 2618 #endif |
2619 | |
432
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
2620 hc->pipeline = 1; |
483 | 2621 c->log->action = "reading client pipelined request line"; |
567 | 2622 |
2014 | 2623 rev->handler = ngx_http_init_request; |
2624 ngx_post_event(rev, &ngx_posted_events); | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2625 return; |
65
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2626 } |
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2627 |
432
11362a3e3911
nginx-0.0.11-2004-09-21-09:38:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
430
diff
changeset
|
2628 hc->pipeline = 0; |
65
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2629 |
455 | 2630 /* |
2631 * To keep a memory footprint as small as possible for an idle | |
2632 * keepalive connection we try to free the ngx_http_request_t and | |
2633 * c->buffer's memory if they were allocated outside the c->pool. | |
2634 * The large header buffers are always allocated outside the c->pool and | |
2635 * are freed too. | |
2636 */ | |
2637 | |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2638 if (ngx_pfree(c->pool, r) == NGX_OK) { |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2639 hc->request = NULL; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2640 } |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2641 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2642 b = c->buffer; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2643 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2644 if (ngx_pfree(c->pool, b->start) == NGX_OK) { |
455 | 2645 |
2646 /* | |
2647 * the special note for ngx_http_keepalive_handler() that | |
2648 * c->buffer's memory was freed | |
2649 */ | |
2650 | |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2651 b->pos = NULL; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2652 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2653 } else { |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2654 b->pos = b->start; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2655 b->last = b->start; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2656 } |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2657 |
461 | 2658 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: %p %d", |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2659 hc->free, hc->nfree); |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2660 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2661 if (hc->free) { |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2662 for (i = 0; i < hc->nfree; i++) { |
1708
3748e50f9b23
large_client_header_buffers did not free()ed before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1704
diff
changeset
|
2663 ngx_pfree(c->pool, hc->free[i]->start); |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2664 hc->free[i] = NULL; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2665 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2666 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2667 hc->nfree = 0; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2668 } |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2669 |
461 | 2670 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: %p %d", |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2671 hc->busy, hc->nbusy); |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2672 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2673 if (hc->busy) { |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2674 for (i = 0; i < hc->nbusy; i++) { |
1708
3748e50f9b23
large_client_header_buffers did not free()ed before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1704
diff
changeset
|
2675 ngx_pfree(c->pool, hc->busy[i]->start); |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2676 hc->busy[i] = NULL; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2677 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2678 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2679 hc->nbusy = 0; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2680 } |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2681 |
1779
06014cfdb5b1
create ssl buffer on demand and free it before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1776
diff
changeset
|
2682 #if (NGX_HTTP_SSL) |
06014cfdb5b1
create ssl buffer on demand and free it before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1776
diff
changeset
|
2683 if (c->ssl) { |
06014cfdb5b1
create ssl buffer on demand and free it before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1776
diff
changeset
|
2684 ngx_ssl_free_buffer(c); |
06014cfdb5b1
create ssl buffer on demand and free it before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1776
diff
changeset
|
2685 } |
06014cfdb5b1
create ssl buffer on demand and free it before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1776
diff
changeset
|
2686 #endif |
06014cfdb5b1
create ssl buffer on demand and free it before keep-alive
Igor Sysoev <igor@sysoev.ru>
parents:
1776
diff
changeset
|
2687 |
509 | 2688 rev->handler = ngx_http_keepalive_handler; |
65
4222c496acb3
nginx-0.0.1-2003-03-05-09:37:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
64
diff
changeset
|
2689 |
583 | 2690 if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) { |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2691 if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) { |
583 | 2692 ngx_http_close_connection(c); |
2693 return; | |
60
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2694 } |
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2695 } |
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2696 |
483 | 2697 c->log->action = "keepalive"; |
64
34d647deb1da
nginx-0.0.1-2003-03-04-09:33:48 import
Igor Sysoev <igor@sysoev.ru>
parents:
60
diff
changeset
|
2698 |
344
e366ba5db8f8
nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
343
diff
changeset
|
2699 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) { |
501 | 2700 if (ngx_tcp_push(c->fd) == -1) { |
328
fb4dfb2ac0fc
nginx-0.0.3-2004-04-28-10:14:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
2701 ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed"); |
fb4dfb2ac0fc
nginx-0.0.3-2004-04-28-10:14:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
2702 ngx_http_close_connection(c); |
fb4dfb2ac0fc
nginx-0.0.3-2004-04-28-10:14:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
2703 return; |
101
2e069b6e6920
nginx-0.0.1-2003-06-04-21:28:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
100
diff
changeset
|
2704 } |
452 | 2705 |
344
e366ba5db8f8
nginx-0.0.3-2004-06-01-10:04:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
343
diff
changeset
|
2706 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET; |
473 | 2707 tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0; |
452 | 2708 |
2709 } else { | |
473 | 2710 tcp_nodelay = 1; |
2711 } | |
2712 | |
483 | 2713 if (tcp_nodelay |
2714 && clcf->tcp_nodelay | |
2715 && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) | |
2716 { | |
473 | 2717 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay"); |
2718 | |
2719 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, | |
635 | 2720 (const void *) &tcp_nodelay, sizeof(int)) |
2721 == -1) | |
473 | 2722 { |
2560
a7443674e429
ignore EINVAL from setsockopt() on Solaris
Igor Sysoev <igor@sysoev.ru>
parents:
2556
diff
changeset
|
2723 #if (NGX_SOLARIS) |
a7443674e429
ignore EINVAL from setsockopt() on Solaris
Igor Sysoev <igor@sysoev.ru>
parents:
2556
diff
changeset
|
2724 /* Solaris returns EINVAL if a socket has been shut down */ |
a7443674e429
ignore EINVAL from setsockopt() on Solaris
Igor Sysoev <igor@sysoev.ru>
parents:
2556
diff
changeset
|
2725 c->log_error = NGX_ERROR_IGNORE_EINVAL; |
a7443674e429
ignore EINVAL from setsockopt() on Solaris
Igor Sysoev <igor@sysoev.ru>
parents:
2556
diff
changeset
|
2726 #endif |
a7443674e429
ignore EINVAL from setsockopt() on Solaris
Igor Sysoev <igor@sysoev.ru>
parents:
2556
diff
changeset
|
2727 |
473 | 2728 ngx_connection_error(c, ngx_socket_errno, |
2729 "setsockopt(TCP_NODELAY) failed"); | |
2560
a7443674e429
ignore EINVAL from setsockopt() on Solaris
Igor Sysoev <igor@sysoev.ru>
parents:
2556
diff
changeset
|
2730 |
a7443674e429
ignore EINVAL from setsockopt() on Solaris
Igor Sysoev <igor@sysoev.ru>
parents:
2556
diff
changeset
|
2731 c->log_error = NGX_ERROR_INFO; |
473 | 2732 ngx_http_close_connection(c); |
2733 return; | |
452 | 2734 } |
473 | 2735 |
483 | 2736 c->tcp_nodelay = NGX_TCP_NODELAY_SET; |
101
2e069b6e6920
nginx-0.0.1-2003-06-04-21:28:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
100
diff
changeset
|
2737 } |
2e069b6e6920
nginx-0.0.1-2003-06-04-21:28:33 import
Igor Sysoev <igor@sysoev.ru>
parents:
100
diff
changeset
|
2738 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2739 #if 0 |
455 | 2740 /* if ngx_http_request_t was freed then we need some other place */ |
367
ceec87d1c2b3
nginx-0.0.7-2004-06-24-11:53:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
362
diff
changeset
|
2741 r->http_state = NGX_HTTP_KEEPALIVE_STATE; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2742 #endif |
367
ceec87d1c2b3
nginx-0.0.7-2004-06-24-11:53:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
362
diff
changeset
|
2743 |
1135
03f1133f24e8
close keep-alive connections in the shuting down processes
Igor Sysoev <igor@sysoev.ru>
parents:
1115
diff
changeset
|
2744 c->idle = 1; |
3880
e3cb8e27e413
reuse keepalive connections if there are no free worker connections
Igor Sysoev <igor@sysoev.ru>
parents:
3848
diff
changeset
|
2745 ngx_reusable_connection(c, 1); |
1135
03f1133f24e8
close keep-alive connections in the shuting down processes
Igor Sysoev <igor@sysoev.ru>
parents:
1115
diff
changeset
|
2746 |
164
84036764e215
nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
161
diff
changeset
|
2747 if (rev->ready) { |
2014 | 2748 ngx_post_event(rev, &ngx_posted_events); |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2749 } |
60
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2750 } |
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2751 |
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2752 |
501 | 2753 static void |
2754 ngx_http_keepalive_handler(ngx_event_t *rev) | |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2755 { |
501 | 2756 size_t size; |
2757 ssize_t n; | |
2758 ngx_buf_t *b; | |
2759 ngx_connection_t *c; | |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2760 |
394
e7a68e14ccd3
nginx-0.0.7-2004-07-16-10:33:35 import
Igor Sysoev <igor@sysoev.ru>
parents:
393
diff
changeset
|
2761 c = rev->data; |
13
2aba961a1d34
nginx-0.0.1-2002-09-16-19:01:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
12
diff
changeset
|
2762 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
2763 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler"); |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2764 |
1135
03f1133f24e8
close keep-alive connections in the shuting down processes
Igor Sysoev <igor@sysoev.ru>
parents:
1115
diff
changeset
|
2765 if (rev->timedout || c->close) { |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2766 ngx_http_close_connection(c); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2767 return; |
68
d549fdc17d7e
nginx-0.0.1-2003-03-12-20:32:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
67
diff
changeset
|
2768 } |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2769 |
469 | 2770 #if (NGX_HAVE_KQUEUE) |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2771 |
455 | 2772 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |
587 | 2773 if (rev->pending_eof) { |
483 | 2774 c->log->handler = NULL; |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2775 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, |
461 | 2776 "kevent() reported that client %V closed " |
483 | 2777 "keepalive connection", &c->addr_text); |
473 | 2778 #if (NGX_HTTP_SSL) |
2779 if (c->ssl) { | |
547 | 2780 c->ssl->no_send_shutdown = 1; |
473 | 2781 } |
2782 #endif | |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2783 ngx_http_close_connection(c); |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2784 return; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2785 } |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2786 } |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2787 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2788 #endif |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2789 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2790 b = c->buffer; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2791 size = b->end - b->start; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2792 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2793 if (b->pos == NULL) { |
455 | 2794 |
2795 /* | |
2796 * The c->buffer's memory was freed by ngx_http_set_keepalive(). | |
2797 * However, the c->buffer->start and c->buffer->end were not changed | |
2798 * to keep the buffer size. | |
2799 */ | |
2800 | |
501 | 2801 b->pos = ngx_palloc(c->pool, size); |
2802 if (b->pos == NULL) { | |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2803 ngx_http_close_connection(c); |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2804 return; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2805 } |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2806 |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2807 b->start = b->pos; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2808 b->last = b->pos; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2809 b->end = b->pos + size; |
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2810 } |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2811 |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2812 /* |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2813 * MSIE closes a keepalive connection with RST flag |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2814 * so we ignore ECONNRESET here. |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2815 */ |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2816 |
256
8e39cab6abd5
nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents:
253
diff
changeset
|
2817 c->log_error = NGX_ERROR_IGNORE_ECONNRESET; |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2818 ngx_set_socket_errno(0); |
396
6f3b20c1ac50
nginx-0.0.7-2004-07-18-23:11:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
395
diff
changeset
|
2819 |
437
470270fa84d2
nginx-0.0.12-2004-09-23-20:39:34 import
Igor Sysoev <igor@sysoev.ru>
parents:
436
diff
changeset
|
2820 n = c->recv(c, b->last, size); |
256
8e39cab6abd5
nginx-0.0.2-2004-02-10-19:23:38 import
Igor Sysoev <igor@sysoev.ru>
parents:
253
diff
changeset
|
2821 c->log_error = NGX_ERROR_INFO; |
13
2aba961a1d34
nginx-0.0.1-2002-09-16-19:01:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
12
diff
changeset
|
2822 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2823 if (n == NGX_AGAIN) { |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2824 if (ngx_handle_read_event(rev, 0) != NGX_OK) { |
475 | 2825 ngx_http_close_connection(c); |
5082
42a888fdad0b
Fixed potential segfault in ngx_http_keepalive_handler().
Valentin Bartenev <vbart@nginx.com>
parents:
5072
diff
changeset
|
2826 return; |
475 | 2827 } |
2828 | |
4891
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2829 /* |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2830 * Like ngx_http_set_keepalive() we are trying to not hold |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2831 * c->buffer's memory for a keepalive connection. |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2832 */ |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2833 |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2834 if (ngx_pfree(c->pool, b->start) == NGX_OK) { |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2835 |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2836 /* |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2837 * the special note that c->buffer's memory was freed |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2838 */ |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2839 |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2840 b->pos = NULL; |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2841 } |
1e666c78a42c
ngx_http_keepalive_handler() is now trying to not keep c->buffer's memory for
Valentin Bartenev <vbart@nginx.com>
parents:
4884
diff
changeset
|
2842 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2843 return; |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2844 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2845 |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2846 if (n == NGX_ERROR) { |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2847 ngx_http_close_connection(c); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2848 return; |
68
d549fdc17d7e
nginx-0.0.1-2003-03-12-20:32:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
67
diff
changeset
|
2849 } |
13
2aba961a1d34
nginx-0.0.1-2002-09-16-19:01:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
12
diff
changeset
|
2850 |
483 | 2851 c->log->handler = NULL; |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2852 |
13
2aba961a1d34
nginx-0.0.1-2002-09-16-19:01:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
12
diff
changeset
|
2853 if (n == 0) { |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2854 ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno, |
483 | 2855 "client %V closed keepalive connection", &c->addr_text); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2856 ngx_http_close_connection(c); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2857 return; |
13
2aba961a1d34
nginx-0.0.1-2002-09-16-19:01:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
12
diff
changeset
|
2858 } |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2859 |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2860 b->last += n; |
483 | 2861 |
567 | 2862 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
2863 (void) ngx_atomic_fetch_add(ngx_stat_reading, 1); |
567 | 2864 #endif |
2865 | |
483 | 2866 c->log->handler = ngx_http_log_error; |
2867 c->log->action = "reading client request line"; | |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2868 |
1135
03f1133f24e8
close keep-alive connections in the shuting down processes
Igor Sysoev <igor@sysoev.ru>
parents:
1115
diff
changeset
|
2869 c->idle = 0; |
3880
e3cb8e27e413
reuse keepalive connections if there are no free worker connections
Igor Sysoev <igor@sysoev.ru>
parents:
3848
diff
changeset
|
2870 ngx_reusable_connection(c, 0); |
1135
03f1133f24e8
close keep-alive connections in the shuting down processes
Igor Sysoev <igor@sysoev.ru>
parents:
1115
diff
changeset
|
2871 |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2872 ngx_http_init_request(rev); |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2873 } |
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2874 |
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
2875 |
501 | 2876 static void |
2877 ngx_http_set_lingering_close(ngx_http_request_t *r) | |
577 | 2878 { |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2879 ngx_event_t *rev, *wev; |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2880 ngx_connection_t *c; |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2881 ngx_http_core_loc_conf_t *clcf; |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
2882 |
60
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2883 c = r->connection; |
53
d1e42f1b8fd4
nginx-0.0.1-2003-01-27-00:08:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
52
diff
changeset
|
2884 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2885 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
44
0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
41
diff
changeset
|
2886 |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2887 rev = c->read; |
509 | 2888 rev->handler = ngx_http_lingering_close_handler; |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2889 |
557 | 2890 r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000); |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2891 ngx_add_timer(rev, clcf->lingering_timeout); |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2892 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2893 if (ngx_handle_read_event(rev, 0) != NGX_OK) { |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2894 ngx_http_close_request(r, 0); |
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2895 return; |
53
d1e42f1b8fd4
nginx-0.0.1-2003-01-27-00:08:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
52
diff
changeset
|
2896 } |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2897 |
144
ef8c87afcfc5
nginx-0.0.1-2003-10-12-20:49:16 import
Igor Sysoev <igor@sysoev.ru>
parents:
143
diff
changeset
|
2898 wev = c->write; |
509 | 2899 wev->handler = ngx_http_empty_handler; |
53
d1e42f1b8fd4
nginx-0.0.1-2003-01-27-00:08:14 import
Igor Sysoev <igor@sysoev.ru>
parents:
52
diff
changeset
|
2900 |
583 | 2901 if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) { |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2902 if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) { |
583 | 2903 ngx_http_close_request(r, 0); |
2904 return; | |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2905 } |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2906 } |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2907 |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2908 if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) { |
328
fb4dfb2ac0fc
nginx-0.0.3-2004-04-28-10:14:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
2909 ngx_connection_error(c, ngx_socket_errno, |
fb4dfb2ac0fc
nginx-0.0.3-2004-04-28-10:14:50 import
Igor Sysoev <igor@sysoev.ru>
parents:
326
diff
changeset
|
2910 ngx_shutdown_socket_n " failed"); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2911 ngx_http_close_request(r, 0); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2912 return; |
60
50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
Igor Sysoev <igor@sysoev.ru>
parents:
59
diff
changeset
|
2913 } |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2914 |
164
84036764e215
nginx-0.0.1-2003-10-29-11:30:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
161
diff
changeset
|
2915 if (rev->ready) { |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2916 ngx_http_lingering_close_handler(rev); |
67
5a7d1aaa1618
nginx-0.0.1-2003-03-11-23:38:13 import
Igor Sysoev <igor@sysoev.ru>
parents:
66
diff
changeset
|
2917 } |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2918 } |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2919 |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2920 |
501 | 2921 static void |
2922 ngx_http_lingering_close_handler(ngx_event_t *rev) | |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
24
diff
changeset
|
2923 { |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2924 ssize_t n; |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2925 ngx_msec_t timer; |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2926 ngx_connection_t *c; |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2927 ngx_http_request_t *r; |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2928 ngx_http_core_loc_conf_t *clcf; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2929 u_char buffer[NGX_HTTP_LINGERING_BUFFER_SIZE]; |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2930 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2931 c = rev->data; |
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2932 r = c->data; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
55
diff
changeset
|
2933 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
2934 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, |
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
2935 "http lingering close handler"); |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2936 |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2937 if (rev->timedout) { |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2938 ngx_http_close_request(r, 0); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2939 return; |
38
2ffaa35fba42
nginx-0.0.1-2002-12-24-10:09:57 import
Igor Sysoev <igor@sysoev.ru>
parents:
37
diff
changeset
|
2940 } |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2941 |
1640 | 2942 timer = (ngx_msec_t) (r->lingering_time - ngx_time()); |
38
2ffaa35fba42
nginx-0.0.1-2002-12-24-10:09:57 import
Igor Sysoev <igor@sysoev.ru>
parents:
37
diff
changeset
|
2943 if (timer <= 0) { |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2944 ngx_http_close_request(r, 0); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2945 return; |
38
2ffaa35fba42
nginx-0.0.1-2002-12-24-10:09:57 import
Igor Sysoev <igor@sysoev.ru>
parents:
37
diff
changeset
|
2946 } |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2947 |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2948 do { |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2949 n = c->recv(c, buffer, NGX_HTTP_LINGERING_BUFFER_SIZE); |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2950 |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
2951 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %d", n); |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2952 |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2953 if (n == NGX_ERROR || n == 0) { |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2954 ngx_http_close_request(r, 0); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
2955 return; |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2956 } |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2957 |
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2958 } while (rev->ready); |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2959 |
2388
722b5aff05ae
use "!= NGX_OK" instead of "== NGX_ERROR"
Igor Sysoev <igor@sysoev.ru>
parents:
2385
diff
changeset
|
2960 if (ngx_handle_read_event(rev, 0) != NGX_OK) { |
477 | 2961 ngx_http_close_request(r, 0); |
475 | 2962 return; |
2963 } | |
2964 | |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2965 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2966 |
13
2aba961a1d34
nginx-0.0.1-2002-09-16-19:01:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
12
diff
changeset
|
2967 timer *= 1000; |
436
9549fc9508e5
nginx-0.0.11-2004-09-23-10:32:00 import
Igor Sysoev <igor@sysoev.ru>
parents:
435
diff
changeset
|
2968 |
96
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2969 if (timer > clcf->lingering_timeout) { |
a23d010f356d
nginx-0.0.1-2003-05-27-16:18:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
95
diff
changeset
|
2970 timer = clcf->lingering_timeout; |
38
2ffaa35fba42
nginx-0.0.1-2002-12-24-10:09:57 import
Igor Sysoev <igor@sysoev.ru>
parents:
37
diff
changeset
|
2971 } |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2972 |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
2973 ngx_add_timer(rev, timer); |
12
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2974 } |
055ed05235ae
nginx-0.0.1-2002-09-13-18:47:42 import
Igor Sysoev <igor@sysoev.ru>
parents:
11
diff
changeset
|
2975 |
3
34a521b1a148
nginx-0.0.1-2002-08-20-18:48:28 import
Igor Sysoev <igor@sysoev.ru>
parents:
2
diff
changeset
|
2976 |
501 | 2977 void |
2978 ngx_http_empty_handler(ngx_event_t *wev) | |
94
8220378432a8
nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
93
diff
changeset
|
2979 { |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
2980 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http empty handler"); |
94
8220378432a8
nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
93
diff
changeset
|
2981 |
8220378432a8
nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
93
diff
changeset
|
2982 return; |
8220378432a8
nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
93
diff
changeset
|
2983 } |
8220378432a8
nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
93
diff
changeset
|
2984 |
8220378432a8
nginx-0.0.1-2003-05-22-19:23:47 import
Igor Sysoev <igor@sysoev.ru>
parents:
93
diff
changeset
|
2985 |
509 | 2986 void |
2987 ngx_http_request_empty_handler(ngx_http_request_t *r) | |
2988 { | |
2989 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
583 | 2990 "http request empty handler"); |
509 | 2991 |
2992 return; | |
2993 } | |
2994 | |
2995 | |
501 | 2996 ngx_int_t |
581 | 2997 ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags) |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
2998 { |
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:
335
diff
changeset
|
2999 ngx_buf_t *b; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
3000 ngx_chain_t out; |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
3001 |
501 | 3002 b = ngx_calloc_buf(r->pool); |
3003 if (b == NULL) { | |
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:
335
diff
changeset
|
3004 return NGX_ERROR; |
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:
335
diff
changeset
|
3005 } |
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:
335
diff
changeset
|
3006 |
581 | 3007 if (flags & NGX_HTTP_LAST) { |
2971
87ddbe960172
fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
3008 |
87ddbe960172
fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
3009 if (r == r->main && !r->post_action) { |
87ddbe960172
fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
3010 b->last_buf = 1; |
87ddbe960172
fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
3011 |
87ddbe960172
fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
3012 } else { |
2993
f592d466bbda
fix r2972, it caused "zero size buf" alert.
Igor Sysoev <igor@sysoev.ru>
parents:
2992
diff
changeset
|
3013 b->sync = 1; |
2971
87ddbe960172
fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
3014 b->last_in_chain = 1; |
87ddbe960172
fix ngx_http_send_special() for subrequests handled by perl
Igor Sysoev <igor@sysoev.ru>
parents:
2951
diff
changeset
|
3015 } |
581 | 3016 } |
3017 | |
3018 if (flags & NGX_HTTP_FLUSH) { | |
3019 b->flush = 1; | |
3020 } | |
3021 | |
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:
335
diff
changeset
|
3022 out.buf = b; |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
3023 out.next = NULL; |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
3024 |
153
c71aeb75c071
nginx-0.0.1-2003-10-21-20:49:56 import
Igor Sysoev <igor@sysoev.ru>
parents:
152
diff
changeset
|
3025 return ngx_http_output_filter(r, &out); |
142
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
3026 } |
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
3027 |
cb77c084acdb
nginx-0.0.1-2003-10-09-11:00:45 import
Igor Sysoev <igor@sysoev.ru>
parents:
137
diff
changeset
|
3028 |
613 | 3029 static ngx_int_t |
3030 ngx_http_post_action(ngx_http_request_t *r) | |
3031 { | |
3032 ngx_http_core_loc_conf_t *clcf; | |
3033 | |
3034 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); | |
3035 | |
3036 if (clcf->post_action.data == NULL) { | |
3037 return NGX_DECLINED; | |
3038 } | |
3039 | |
4472
c95b828912a3
Core: protection from cycles with named locations and post_action.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4471
diff
changeset
|
3040 if (r->post_action && r->uri_changes == 0) { |
c95b828912a3
Core: protection from cycles with named locations and post_action.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4471
diff
changeset
|
3041 return NGX_DECLINED; |
c95b828912a3
Core: protection from cycles with named locations and post_action.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4471
diff
changeset
|
3042 } |
c95b828912a3
Core: protection from cycles with named locations and post_action.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4471
diff
changeset
|
3043 |
623 | 3044 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
3045 "post action: \"%V\"", &clcf->post_action); | |
3046 | |
3145
9160a117a46a
fix request counter for post_action, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3076
diff
changeset
|
3047 r->main->count--; |
9160a117a46a
fix request counter for post_action, the bug was introduced in r3050
Igor Sysoev <igor@sysoev.ru>
parents:
3076
diff
changeset
|
3048 |
613 | 3049 r->http_version = NGX_HTTP_VERSION_9; |
3050 r->header_only = 1; | |
629 | 3051 r->post_action = 1; |
613 | 3052 |
1368
202cae9a0c2b
rename ngx_http_block_read() and ngx_http_test_read() to ..._reading()
Igor Sysoev <igor@sysoev.ru>
parents:
1283
diff
changeset
|
3053 r->read_event_handler = ngx_http_block_reading; |
895
49d03c183ad2
fix post_action for disconnected client
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
3054 |
1894
22e28e77246b
named locations in post_action
Igor Sysoev <igor@sysoev.ru>
parents:
1858
diff
changeset
|
3055 if (clcf->post_action.data[0] == '/') { |
22e28e77246b
named locations in post_action
Igor Sysoev <igor@sysoev.ru>
parents:
1858
diff
changeset
|
3056 ngx_http_internal_redirect(r, &clcf->post_action, NULL); |
22e28e77246b
named locations in post_action
Igor Sysoev <igor@sysoev.ru>
parents:
1858
diff
changeset
|
3057 |
22e28e77246b
named locations in post_action
Igor Sysoev <igor@sysoev.ru>
parents:
1858
diff
changeset
|
3058 } else { |
22e28e77246b
named locations in post_action
Igor Sysoev <igor@sysoev.ru>
parents:
1858
diff
changeset
|
3059 ngx_http_named_location(r, &clcf->post_action); |
22e28e77246b
named locations in post_action
Igor Sysoev <igor@sysoev.ru>
parents:
1858
diff
changeset
|
3060 } |
613 | 3061 |
3062 return NGX_OK; | |
3063 } | |
3064 | |
3065 | |
3066 static void | |
3049 | 3067 ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc) |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3068 { |
639 | 3069 ngx_connection_t *c; |
569 | 3070 |
3049 | 3071 r = r->main; |
569 | 3072 c = r->connection; |
639 | 3073 |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
3074 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
3075 "http request count:%d blk:%d", r->count, r->blocked); |
3049 | 3076 |
3077 if (r->count == 0) { | |
3078 ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http request count is zero"); | |
3079 } | |
3080 | |
3081 r->count--; | |
3082 | |
3052
6060225e9261
FreeBSD and Linux AIO support
Igor Sysoev <igor@sysoev.ru>
parents:
3051
diff
changeset
|
3083 if (r->count || r->blocked) { |
3049 | 3084 return; |
3085 } | |
3086 | |
3087 ngx_http_free_request(r, rc); | |
569 | 3088 ngx_http_close_connection(c); |
3089 } | |
3090 | |
3091 | |
613 | 3092 static void |
3049 | 3093 ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc) |
569 | 3094 { |
2261 | 3095 ngx_log_t *log; |
3096 struct linger linger; | |
3097 ngx_http_cleanup_t *cln; | |
3098 ngx_http_log_ctx_t *ctx; | |
3099 ngx_http_core_loc_conf_t *clcf; | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3100 |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
3101 log = r->connection->log; |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
3102 |
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
3103 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request"); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3104 |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3105 if (r->pool == NULL) { |
531 | 3106 ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed"); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3107 return; |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3108 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3109 |
639 | 3110 for (cln = r->cleanup; cln; cln = cln->next) { |
3111 if (cln->handler) { | |
3112 cln->handler(cln->data); | |
3113 } | |
3114 } | |
3115 | |
427
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3116 #if (NGX_STAT_STUB) |
567 | 3117 |
427
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3118 if (r->stat_reading) { |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
3119 (void) ngx_atomic_fetch_add(ngx_stat_reading, -1); |
427
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3120 } |
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3121 |
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3122 if (r->stat_writing) { |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
3123 (void) ngx_atomic_fetch_add(ngx_stat_writing, -1); |
427
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3124 } |
567 | 3125 |
427
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3126 #endif |
0d08eabe5c7b
nginx-0.0.10-2004-09-15-20:00:43 import
Igor Sysoev <igor@sysoev.ru>
parents:
426
diff
changeset
|
3127 |
3049 | 3128 if (rc > 0 && (r->headers_out.status == 0 || r->connection->sent == 0)) { |
3129 r->headers_out.status = rc; | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3130 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3131 |
2077 | 3132 log->action = "logging request"; |
3133 | |
2261 | 3134 ngx_http_log_request(r); |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3135 |
2077 | 3136 log->action = "closing request"; |
3137 | |
346
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3138 if (r->connection->timedout) { |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3139 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3140 |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3141 if (clcf->reset_timedout_connection) { |
509 | 3142 linger.l_onoff = 1; |
3143 linger.l_linger = 0; | |
346
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3144 |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3145 if (setsockopt(r->connection->fd, SOL_SOCKET, SO_LINGER, |
509 | 3146 (const void *) &linger, sizeof(struct linger)) == -1) |
346
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3147 { |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3148 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3149 "setsockopt(SO_LINGER) failed"); |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3150 } |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3151 } |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3152 } |
55e496a8ece3
nginx-0.0.3-2004-06-06-23:49:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
344
diff
changeset
|
3153 |
509 | 3154 /* the various request strings were allocated from r->pool */ |
201
267ea1d98683
nginx-0.0.1-2003-11-30-23:03:18 import
Igor Sysoev <igor@sysoev.ru>
parents:
200
diff
changeset
|
3155 ctx = log->data; |
461 | 3156 ctx->request = NULL; |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3157 |
367
ceec87d1c2b3
nginx-0.0.7-2004-06-24-11:53:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
362
diff
changeset
|
3158 r->request_line.len = 0; |
ceec87d1c2b3
nginx-0.0.7-2004-06-24-11:53:37 import
Igor Sysoev <igor@sysoev.ru>
parents:
362
diff
changeset
|
3159 |
583 | 3160 r->connection->destroyed = 1; |
3161 | |
87
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3162 ngx_destroy_pool(r->pool); |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3163 } |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3164 |
5f6d848dcbef
nginx-0.0.1-2003-05-13-20:02:32 import
Igor Sysoev <igor@sysoev.ru>
parents:
86
diff
changeset
|
3165 |
531 | 3166 static void |
2261 | 3167 ngx_http_log_request(ngx_http_request_t *r) |
3168 { | |
3169 ngx_uint_t i, n; | |
3170 ngx_http_handler_pt *log_handler; | |
3171 ngx_http_core_main_conf_t *cmcf; | |
3172 | |
3173 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); | |
3174 | |
3175 log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts; | |
3176 n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts; | |
3177 | |
3178 for (i = 0; i < n; i++) { | |
3179 log_handler[i](r); | |
3180 } | |
3181 } | |
3182 | |
3183 | |
3184 static void | |
501 | 3185 ngx_http_close_connection(ngx_connection_t *c) |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
3186 { |
479 | 3187 ngx_pool_t *pool; |
3188 | |
239
574bea0142be
nginx-0.0.1-2004-01-26-11:52:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
233
diff
changeset
|
3189 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
257
70e1c7d2b83d
nginx-0.0.2-2004-02-11-20:08:49 import
Igor Sysoev <igor@sysoev.ru>
parents:
256
diff
changeset
|
3190 "close http connection: %d", c->fd); |
86
3973260705cc
nginx-0.0.1-2003-05-12-19:52:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
82
diff
changeset
|
3191 |
539 | 3192 #if (NGX_HTTP_SSL) |
452 | 3193 |
3194 if (c->ssl) { | |
3195 if (ngx_ssl_shutdown(c) == NGX_AGAIN) { | |
577 | 3196 c->ssl->handler = ngx_http_close_connection; |
452 | 3197 return; |
3198 } | |
3199 } | |
3200 | |
3201 #endif | |
3202 | |
426
3f88935a02e8
nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
3203 #if (NGX_STAT_STUB) |
2951
5acd98486a33
ignore ngx_atomic_fetch_add() result
Igor Sysoev <igor@sysoev.ru>
parents:
2902
diff
changeset
|
3204 (void) ngx_atomic_fetch_add(ngx_stat_active, -1); |
426
3f88935a02e8
nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
3205 #endif |
3f88935a02e8
nginx-0.0.10-2004-09-14-23:39:54 import
Igor Sysoev <igor@sysoev.ru>
parents:
423
diff
changeset
|
3206 |
583 | 3207 c->destroyed = 1; |
3208 | |
479 | 3209 pool = c->pool; |
3210 | |
417
0526206251f6
nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents:
416
diff
changeset
|
3211 ngx_close_connection(c); |
479 | 3212 |
501 | 3213 ngx_destroy_pool(pool); |
18
72ad26c77d2d
nginx-0.0.1-2002-10-04-21:58:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
17
diff
changeset
|
3214 } |
72ad26c77d2d
nginx-0.0.1-2002-10-04-21:58:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
17
diff
changeset
|
3215 |
72ad26c77d2d
nginx-0.0.1-2002-10-04-21:58:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
17
diff
changeset
|
3216 |
501 | 3217 static u_char * |
3218 ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len) | |
6
669801705ab1
nginx-0.0.1-2002-08-26-19:18:19 import
Igor Sysoev <igor@sysoev.ru>
parents:
3
diff
changeset
|
3219 { |
483 | 3220 u_char *p; |
505 | 3221 ngx_http_request_t *r; |
483 | 3222 ngx_http_log_ctx_t *ctx; |
461 | 3223 |
483 | 3224 if (log->action) { |
509 | 3225 p = ngx_snprintf(buf, len, " while %s", log->action); |
461 | 3226 len -= p - buf; |
505 | 3227 buf = p; |
461 | 3228 } |
3229 | |
509 | 3230 ctx = log->data; |
3231 | |
1810 | 3232 p = ngx_snprintf(buf, len, ", client: %V", &ctx->connection->addr_text); |
509 | 3233 len -= p - buf; |
505 | 3234 |
3235 r = ctx->request; | |
3236 | |
509 | 3237 if (r) { |
665 | 3238 return r->log_handler(r, ctx->current_request, p, len); |
1810 | 3239 |
3240 } else { | |
3241 p = ngx_snprintf(p, len, ", server: %V", | |
3242 &ctx->connection->listening->addr_text); | |
69
e43f406e4525
nginx-0.0.1-2003-03-20-19:09:44 import
Igor Sysoev <igor@sysoev.ru>
parents:
68
diff
changeset
|
3243 } |
461 | 3244 |
509 | 3245 return p; |
3246 } | |
3247 | |
3248 | |
3249 static u_char * | |
665 | 3250 ngx_http_log_error_handler(ngx_http_request_t *r, ngx_http_request_t *sr, |
3251 u_char *buf, size_t len) | |
509 | 3252 { |
1811 | 3253 char *uri_separator; |
3254 u_char *p; | |
3255 ngx_http_upstream_t *u; | |
3256 ngx_http_core_srv_conf_t *cscf; | |
3257 | |
3258 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); | |
3259 | |
3260 p = ngx_snprintf(buf, len, ", server: %V", &cscf->server_name); | |
3261 len -= p - buf; | |
3262 buf = p; | |
503 | 3263 |
1656
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3264 if (r->request_line.data == NULL && r->request_start) { |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3265 for (p = r->request_start; p < r->header_in->last; p++) { |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3266 if (*p == CR || *p == LF) { |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3267 break; |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3268 } |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3269 } |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3270 |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3271 r->request_line.len = p - r->request_start; |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3272 r->request_line.data = r->request_start; |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3273 } |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3274 |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3275 if (r->request_line.len) { |
7a9b44e35c53
log entire request line instead of URI only
Igor Sysoev <igor@sysoev.ru>
parents:
1640
diff
changeset
|
3276 p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line); |
505 | 3277 len -= p - buf; |
3278 buf = p; | |
461 | 3279 } |
3280 | |
665 | 3281 if (r != sr) { |
3282 p = ngx_snprintf(buf, len, ", subrequest: \"%V\"", &sr->uri); | |
3283 len -= p - buf; | |
3284 buf = p; | |
3285 } | |
3286 | |
3287 u = sr->upstream; | |
3288 | |
884 | 3289 if (u && u->peer.name) { |
3290 | |
3291 uri_separator = ""; | |
3292 | |
3293 #if (NGX_HAVE_UNIX_DOMAIN) | |
3294 if (u->peer.sockaddr && u->peer.sockaddr->sa_family == AF_UNIX) { | |
3295 uri_separator = ":"; | |
3296 } | |
3297 #endif | |
665 | 3298 |
3299 p = ngx_snprintf(buf, len, ", upstream: \"%V%V%s%V\"", | |
1658 | 3300 &u->schema, u->peer.name, |
884 | 3301 uri_separator, &u->uri); |
665 | 3302 len -= p - buf; |
3303 buf = p; | |
3304 } | |
3305 | |
505 | 3306 if (r->headers_in.host) { |
3307 p = ngx_snprintf(buf, len, ", host: \"%V\"", | |
3308 &r->headers_in.host->value); | |
3309 len -= p - buf; | |
3310 buf = p; | |
3311 } | |
3312 | |
3313 if (r->headers_in.referer) { | |
3314 p = ngx_snprintf(buf, len, ", referrer: \"%V\"", | |
3315 &r->headers_in.referer->value); | |
3316 buf = p; | |
3317 } | |
3318 | |
3319 return buf; | |
3320 } |