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