annotate src/http/ngx_http_request.c @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) Feature: the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate" directives. *) Change: the $request_method variable now returns the main request method. *) Change: the ° symbol codes were changed in koi-win conversion table. *) Feature: the euro и N symbols were added to koi-win conversion table. *) Bugfix: if nginx distributed the requests among several backends and some backend failed, then requests intended for this backend was directed to one live backend only instead of being distributed among the rest.
author Igor Sysoev <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 003bd800ec2a
children e6da4931e0e0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 static void ngx_http_init_request(ngx_event_t *ev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 static void ngx_http_process_request_line(ngx_event_t *rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 static void ngx_http_process_request_headers(ngx_event_t *rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 static ssize_t ngx_http_read_request_header(ngx_http_request_t *r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 static ngx_int_t ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
18 ngx_uint_t request_line);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
19
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
20 static ngx_int_t ngx_http_process_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
21 ngx_table_elt_t *h, ngx_uint_t offset);
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
22 static ngx_int_t ngx_http_process_unique_header_line(ngx_http_request_t *r,
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
23 ngx_table_elt_t *h, ngx_uint_t offset);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
24 static ngx_int_t ngx_http_process_cookie(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
25 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
26
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 static ngx_int_t ngx_http_process_request_header(ngx_http_request_t *r);
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
28 static void ngx_http_find_virtual_server(ngx_http_request_t *r);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
30 static void ngx_http_request_handler(ngx_event_t *ev);
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
31 static ngx_int_t ngx_http_set_write_handler(ngx_http_request_t *r);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
32 static void ngx_http_writer(ngx_http_request_t *r);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
33
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
34 static void ngx_http_block_read(ngx_http_request_t *r);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 static void ngx_http_set_keepalive(ngx_http_request_t *r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 static void ngx_http_keepalive_handler(ngx_event_t *ev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 static void ngx_http_set_lingering_close(ngx_http_request_t *r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 static void ngx_http_lingering_close_handler(ngx_event_t *ev);
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
39 static ngx_int_t ngx_http_post_action(ngx_http_request_t *r);
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
40 static void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
41 static void ngx_http_request_done(ngx_http_request_t *r, ngx_int_t error);
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
42 static void ngx_http_close_connection(ngx_connection_t *c);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
44 static u_char *ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
45 static u_char *ngx_http_log_error_handler(ngx_http_request_t *r, u_char *buf,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
46 size_t len);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
48 #if (NGX_HTTP_SSL)
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
49 static void ngx_http_ssl_handshake(ngx_event_t *rev);
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
50 static void ngx_http_ssl_handshake_handler(ngx_connection_t *c);
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
51 #endif
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
52
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
54 static char *ngx_http_client_errors[] = {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
55
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
56 /* NGX_HTTP_PARSE_INVALID_METHOD */
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
57 "client sent invalid method",
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
58
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
59 /* NGX_HTTP_PARSE_INVALID_REQUEST */
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
60 "client sent invalid request",
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
61
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
62 /* NGX_HTTP_PARSE_INVALID_09_METHOD */
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
63 "client sent invalid method in HTTP/0.9 request"
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 };
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 ngx_http_header_t ngx_http_headers_in[] = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
68 { ngx_string("Host"), offsetof(ngx_http_headers_in_t, host),
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
69 ngx_http_process_unique_header_line },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
70
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
71 { ngx_string("Connection"), offsetof(ngx_http_headers_in_t, connection),
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
72 ngx_http_process_unique_header_line },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
73
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 { ngx_string("If-Modified-Since"),
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
75 offsetof(ngx_http_headers_in_t, if_modified_since),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
76 ngx_http_process_header_line },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
77
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
78 { ngx_string("User-Agent"), offsetof(ngx_http_headers_in_t, user_agent),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
79 ngx_http_process_header_line },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
80
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
81 { ngx_string("Referer"), offsetof(ngx_http_headers_in_t, referer),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
82 ngx_http_process_header_line },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
83
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 { ngx_string("Content-Length"),
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
85 offsetof(ngx_http_headers_in_t, content_length),
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
86 ngx_http_process_unique_header_line },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
87
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
88 { ngx_string("Content-Type"),
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
89 offsetof(ngx_http_headers_in_t, content_type),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
90 ngx_http_process_header_line },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
91
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
92 { ngx_string("Range"), offsetof(ngx_http_headers_in_t, range),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
93 ngx_http_process_header_line },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
94
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
95 { ngx_string("Transfer-Encoding"),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
96 offsetof(ngx_http_headers_in_t, transfer_encoding),
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
97 ngx_http_process_header_line },
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
98
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 #if (NGX_HTTP_GZIP)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 { ngx_string("Accept-Encoding"),
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
101 offsetof(ngx_http_headers_in_t, accept_encoding),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
102 ngx_http_process_header_line },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
103
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
104 { ngx_string("Via"), offsetof(ngx_http_headers_in_t, via),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
105 ngx_http_process_header_line },
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 { ngx_string("Authorization"),
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
109 offsetof(ngx_http_headers_in_t, authorization),
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
110 ngx_http_process_unique_header_line },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
111
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
112 { ngx_string("Keep-Alive"), offsetof(ngx_http_headers_in_t, keep_alive),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
113 ngx_http_process_header_line },
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
115 #if (NGX_HTTP_PROXY || NGX_HTTP_REALIP)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 { ngx_string("X-Forwarded-For"),
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
117 offsetof(ngx_http_headers_in_t, x_forwarded_for),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
118 ngx_http_process_header_line },
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 #endif
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
120
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
121 #if (NGX_HTTP_REALIP)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
122 { ngx_string("X-Real-IP"),
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
123 offsetof(ngx_http_headers_in_t, x_real_ip),
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
124 ngx_http_process_header_line },
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
125 #endif
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
126
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
127 #if (NGX_HTTP_HEADERS)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
128 { ngx_string("Accept"), offsetof(ngx_http_headers_in_t, accept),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
129 ngx_http_process_header_line },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
130
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
131 { ngx_string("Accept-Language"),
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
132 offsetof(ngx_http_headers_in_t, accept_language),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
133 ngx_http_process_header_line },
38
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
134 #endif
2879cd3a40cb nginx 0.1.19
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
135
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
136 #if (NGX_HTTP_DAV)
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
137 { ngx_string("Depth"), offsetof(ngx_http_headers_in_t, depth),
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
138 ngx_http_process_header_line },
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
139
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
140 { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination),
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
141 ngx_http_process_header_line },
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
142 #endif
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
143
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
144 { ngx_string("Cookie"), 0, ngx_http_process_cookie },
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
145
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
146 { ngx_null_string, 0, NULL }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 };
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
150 void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
151 ngx_http_init_connection(ngx_connection_t *c)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 ngx_event_t *rev;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154 ngx_http_log_ctx_t *ctx;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
156 ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
157 if (ctx == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
162 ctx->client = &c->addr_text;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
163 ctx->request = NULL;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
164
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
165 c->log->connection = c->number;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
166 c->log->handler = ngx_http_log_error;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 c->log->data = ctx;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
168 c->log->action = "reading client request line";
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
169
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170 c->log_error = NGX_ERROR_INFO;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 rev = c->read;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
173 rev->handler = ngx_http_init_request;
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
174 c->write->handler = ngx_http_empty_handler;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
176 #if (NGX_STAT_STUB)
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
177 ngx_atomic_fetch_add(ngx_stat_reading, 1);
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
178 #endif
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
179
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 if (rev->ready) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 /* the deferred accept(), rtsig, aio, iocp */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 154
diff changeset
183 if (ngx_use_accept_mutex) {
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
184 ngx_post_event(rev, &ngx_posted_events);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 ngx_http_init_request(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 ngx_add_timer(rev, c->listening->post_accept_timeout);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
195 #if (NGX_STAT_STUB)
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
196 ngx_atomic_fetch_add(ngx_stat_reading, -1);
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
197 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
202
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
204 static void
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
205 ngx_http_init_request(ngx_event_t *rev)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 {
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
207 socklen_t len;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
208 ngx_uint_t i;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
209 struct sockaddr_in sin;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
210 ngx_connection_t *c;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
211 ngx_http_request_t *r;
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
212 ngx_http_in_port_t *hip;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
213 ngx_http_in_addr_t *hia;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
214 ngx_http_log_ctx_t *ctx;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
215 ngx_http_connection_t *hc;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
216 ngx_http_core_srv_conf_t *cscf;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
217 ngx_http_core_loc_conf_t *clcf;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
218 ngx_http_core_main_conf_t *cmcf;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 #if (NGX_HTTP_SSL)
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
220 ngx_http_ssl_srv_conf_t *sscf;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
223 #if (NGX_STAT_STUB)
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
224 ngx_atomic_fetch_add(ngx_stat_reading, -1);
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
225 #endif
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
226
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227 c = rev->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229 if (rev->timedout) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 hc = c->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
238 if (hc == NULL) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
239 hc = ngx_pcalloc(c->pool, sizeof(ngx_http_connection_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
240 if (hc == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 r = hc->request;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 if (r) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 ngx_memzero(r, sizeof(ngx_http_request_t));
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 r->pipeline = hc->pipeline;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 if (hc->nbusy) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 r->header_in = hc->busy[0];
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 } else {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
258 r = ngx_pcalloc(c->pool, sizeof(ngx_http_request_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
259 if (r == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 hc->request = r;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267 c->data = r;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 r->http_connection = hc;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 c->sent = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 r->signature = NGX_HTTP_MODULE;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
273 /* find the server configuration for the address:port */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
274
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275 /* AF_INET only */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
277 hip = c->listening->servers;
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
278 hia = hip->addrs;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
279
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
280 r->port = hip->port;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
281 r->port_text = &hip->port_text;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283 i = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
285 if (hip->naddrs > 1) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288 * There are several addresses on this port and one of them
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 * is the "*:port" wildcard so getsockname() is needed to determine
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290 * the server address.
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291 *
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 * AcceptEx() already gave this address.
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
295 #if (NGX_WIN32)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 if (c->local_sockaddr) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 r->in_addr =
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298 ((struct sockaddr_in *) c->local_sockaddr)->sin_addr.s_addr;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
300 } else
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 #endif
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
302 {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 len = sizeof(struct sockaddr_in);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
304 if (getsockname(c->fd, (struct sockaddr *) &sin, &len) == -1) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305 ngx_connection_error(c, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306 "getsockname() failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
311 r->in_addr = sin.sin_addr.s_addr;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
314 /* the last address is "*" */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
316 for ( /* void */ ; i < hip->naddrs - 1; i++) {
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
317 if (hia[i].addr == r->in_addr) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 } else {
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
323 r->in_addr = hia[0].addr;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
326 r->virtual_names = hia[i].virtual_names;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328 /* the default server configuration for the address:port */
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
329 cscf = hia[i].core_srv_conf;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 r->main_conf = cscf->ctx->main_conf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 r->srv_conf = cscf->ctx->srv_conf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 r->loc_conf = cscf->ctx->loc_conf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
335 r->server_name = cscf->server_name;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
336
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
337 rev->handler = ngx_http_process_request_line;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 #if (NGX_HTTP_SSL)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341 sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 if (sscf->enable) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 if (c->ssl == NULL) {
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
345 if (ngx_ssl_create_connection(&sscf->ssl, c, NGX_SSL_BUFFER)
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
346 == NGX_ERROR)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
352 rev->handler = ngx_http_ssl_handshake;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
354
62
0790a8599248 nginx 0.1.31
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
355 r->main_filter_need_in_memory = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
360 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
361 c->log->file = clcf->err_log->file;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362 if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 c->log->log_level = clcf->err_log->log_level;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 if (c->buffer == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367 c->buffer = ngx_create_temp_buf(c->pool,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368 cscf->client_header_buffer_size);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 if (c->buffer == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375 if (r->header_in == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 r->header_in = c->buffer;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
379 r->pool = ngx_create_pool(cscf->request_pool_size, c->log);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
380 if (r->pool == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386 if (ngx_list_init(&r->headers_out.headers, r->pool, 20,
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
387 sizeof(ngx_table_elt_t))
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
388 == NGX_ERROR)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
391 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395 if (r->ctx == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
400 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
401
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
402 r->variables = ngx_pcalloc(r->pool, cmcf->variables.nelts
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
403 * sizeof(ngx_http_variable_value_t));
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
404 if (r->variables == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
405 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
406 return;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
407 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
408
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 c->single_connection = 1;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
410 c->destroyed = 0;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
411
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412 r->connection = c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413
102
f63280c59dd5 nginx 0.2.5
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
414 r->main = r;
f63280c59dd5 nginx 0.2.5
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
415
46
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents: 44
diff changeset
416 r->start_time = ngx_time();
9f3205d496a0 nginx 0.1.23
Igor Sysoev <http://sysoev.ru>
parents: 44
diff changeset
417
180
4cd3e70c4d60 nginx 0.3.37
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
418 r->method = NGX_HTTP_UNKNOWN;
4cd3e70c4d60 nginx 0.3.37
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
419
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
420 r->headers_in.content_length_n = -1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
421 r->headers_in.keep_alive_n = -1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
422 r->headers_out.content_length_n = -1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
423 r->headers_out.last_modified_time = -1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
424
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
425 r->http_state = NGX_HTTP_READING_REQUEST_STATE;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
426
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
427 ctx = c->log->data;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
428 ctx->request = r;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
429 r->log_handler = ngx_http_log_error_handler;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
430
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
431 #if (NGX_STAT_STUB)
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
432 ngx_atomic_fetch_add(ngx_stat_reading, 1);
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
433 r->stat_reading = 1;
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
434 ngx_atomic_fetch_add(ngx_stat_requests, 1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
435 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
436
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
437 rev->handler(rev);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
438 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
439
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
440
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
441 #if (NGX_HTTP_SSL)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
443 static void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
444 ngx_http_ssl_handshake(ngx_event_t *rev)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445 {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
446 u_char buf[1];
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
447 ssize_t n;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
448 ngx_int_t rc;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
449 ngx_connection_t *c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
450 ngx_http_request_t *r;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
451
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
452 c = rev->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
453 r = c->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
454
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
455 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
456 "http check ssl handshake");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
457
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
458 if (rev->timedout) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
459 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
460 c->timedout = 1;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
461 ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
462 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
463 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
464
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
465 n = recv(c->fd, (char *) buf, 1, MSG_PEEK);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
466
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
467 if (n == -1 && ngx_socket_errno == NGX_EAGAIN) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
468 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
469 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
470
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
471 if (n == 1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
472 if (buf[0] == 0x80 /* SSLv2 */ || buf[0] == 0x16 /* SSLv3/TLSv1 */) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
473 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, rev->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
474 "https ssl handshake: 0x%02Xd", buf[0]);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
475
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
476 rc = ngx_ssl_handshake(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
477
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
478 if (rc == NGX_AGAIN) {
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
479 c->ssl->handler = ngx_http_ssl_handshake_handler;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
480 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
481 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
483 ngx_http_ssl_handshake_handler(c);
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
484
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
485 return;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
486
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
487 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
488 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
489 "plain http");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
490
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
491 r->plain_http = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
492 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
493 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
494
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
495 rev->handler = ngx_http_process_request_line;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
496 ngx_http_process_request_line(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
497 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
498
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
499
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
500 static void
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
501 ngx_http_ssl_handshake_handler(ngx_connection_t *c)
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
502 {
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
503 ngx_http_request_t *r;
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
504
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
505 if (c->ssl->handshaked) {
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
506
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
507 /*
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
508 * The majority of browsers do not send the "close notify" alert.
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
509 * Among them are MSIE, old Mozilla, Netscape 4, Konqueror,
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
510 * and Links. And what is more, MSIE ignores the server's alert.
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
511 *
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
512 * Opera and recent Mozilla send the alert.
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
513 */
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
514
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
515 c->ssl->no_wait_shutdown = 1;
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
516
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
517 c->read->handler = ngx_http_process_request_line;
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
518 /* STUB: epoll edge */ c->write->handler = ngx_http_empty_handler;
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
519
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
520 ngx_http_process_request_line(c->read);
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
521
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
522 return;
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
523 }
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
524
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
525 r = c->data;
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
526
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
527 ngx_http_close_request(r, NGX_HTTP_BAD_REQUEST);
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
528
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
529 return;
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
530 }
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
531
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
532
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
533 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
534
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
535
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
536 static void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
537 ngx_http_process_request_line(ngx_event_t *rev)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
538 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
539 ssize_t n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 ngx_int_t rc, rv;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541 ngx_connection_t *c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542 ngx_http_request_t *r;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543 ngx_http_log_ctx_t *ctx;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545 c = rev->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546 r = c->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
549 "http process request line");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
550
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551 if (rev->timedout) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
552 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
553 c->timedout = 1;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
554 ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
555 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
556 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
557
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
558 rc = NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560 for ( ;; ) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
561
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
562 if (rc == NGX_AGAIN) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
563 n = ngx_http_read_request_header(r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565 if (n == NGX_AGAIN || n == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
566 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
567 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
568 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
569
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570 rc = ngx_http_parse_request_line(r, r->header_in);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
571
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
572 if (rc == NGX_OK) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
573
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
574 /* the request line has been parsed successfully */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
575
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
576 r->request_line.len = r->request_end - r->request_start;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
577 r->request_line.data = r->request_start;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
578
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
579
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
580 if (r->args_start) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581 r->uri.len = r->args_start - 1 - r->uri_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
583 r->uri.len = r->uri_end - r->uri_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
584 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
585
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
586
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
587 if (r->complex_uri || r->quoted_uri) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
588
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
589 r->uri.data = ngx_palloc(r->pool, r->uri.len + 1);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
590 if (r->uri.data == NULL) {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
591 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
592 return;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
593 }
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
594
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
595 rc = ngx_http_parse_complex_uri(r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
596
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
597 if (rc == NGX_HTTP_PARSE_INVALID_REQUEST) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
598 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
599 "client sent invalid request");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
600 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
602 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
603
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
604 } else {
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
605 r->uri.data = r->uri_start;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
606 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
607
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
608
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
609 r->unparsed_uri.len = r->uri_end - r->uri_start;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
610 r->unparsed_uri.data = r->uri_start;
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
611
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
612
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
613 r->method_name.len = r->method_end - r->request_start + 1;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
614 r->method_name.data = r->request_line.data;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
616
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
617 if (r->http_protocol.data) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
618 r->http_protocol.len = r->request_end - r->http_protocol.data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
619 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
620
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
621
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622 if (r->uri_ext) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
623 if (r->args_start) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
624 r->exten.len = r->args_start - 1 - r->uri_ext;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
625 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
626 r->exten.len = r->uri_end - r->uri_ext;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
627 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
628
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
629 r->exten.data = r->uri_ext;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
630 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
631
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
632
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
633 if (r->args_start && r->uri_end > r->args_start) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
634 r->args.len = r->uri_end - r->args_start;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
635 r->args.data = r->args_start;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
636 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
637
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
638
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
639 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
640 "http request line: \"%V\"", &r->request_line);
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
641
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
642 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
643 "http uri: \"%V\"", &r->uri);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
644
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
645 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
646 "http args: \"%V\"", &r->args);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
647
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
648 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
649 "http exten: \"%V\"", &r->exten);
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
650
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
651 if (r->http_version < NGX_HTTP_VERSION_10) {
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
652
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
653 if (rev->timer_set) {
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
654 ngx_del_timer(rev);
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
655 }
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
656
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
657 #if (NGX_STAT_STUB)
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
658 ngx_atomic_fetch_add(ngx_stat_reading, -1);
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
659 r->stat_reading = 0;
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
660 ngx_atomic_fetch_add(ngx_stat_writing, 1);
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
661 r->stat_writing = 1;
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
662 #endif
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
663
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
664 rev->handler = ngx_http_request_handler;
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
665 c->write->handler = ngx_http_request_handler;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
666 r->read_event_handler = ngx_http_block_read;
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
667
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
668 ngx_http_handler(r);
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
669
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
670 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
671 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
672
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
673
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
674 if (ngx_list_init(&r->headers_in.headers, r->pool, 20,
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
675 sizeof(ngx_table_elt_t))
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
676 == NGX_ERROR)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
677 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
678 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
679 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
680 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
681
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
682
48
6cfc63e68377 nginx 0.1.24
Igor Sysoev <http://sysoev.ru>
parents: 46
diff changeset
683 if (ngx_array_init(&r->headers_in.cookies, r->pool, 2,
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
684 sizeof(ngx_table_elt_t *))
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
685 == NGX_ERROR)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
686 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
687 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
688 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
689 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
690
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
691 c->log->action = "reading client request headers";
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
692
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
693 rev->handler = ngx_http_process_request_headers;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
694 ngx_http_process_request_headers(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
695
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
696 return;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
697 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
698
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
699 if (rc != NGX_AGAIN) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
700
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
701 /* there was error while a request line parsing */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
702
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
703 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
704 ngx_http_client_errors[rc - NGX_HTTP_CLIENT_ERROR]);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
705 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
706 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
707 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
708
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
709 /* NGX_AGAIN: a request line parsing is still incomplete */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
710
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
711 if (r->header_in->pos == r->header_in->end) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
712
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
713 rv = ngx_http_alloc_large_header_buffer(r, 1);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
714
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
715 if (rv == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
716 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
717 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
718 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
719
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
720 if (rv == NGX_DECLINED) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
721 ctx = c->log->data;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
722 ctx->request = r;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
723
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
724 r->request_line.len = r->header_in->end - r->request_start;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
725 r->request_line.data = r->request_start;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
726
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
727 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
728 "client sent too long URI");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
729 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
730 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
731 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
732 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
733 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
734 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
735
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
736
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
737 static void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
738 ngx_http_process_request_headers(ngx_event_t *rev)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
739 {
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
740 ssize_t n;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
741 ngx_int_t rc, rv;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
742 ngx_uint_t key;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
743 ngx_str_t header;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
744 ngx_table_elt_t *h;
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
745 ngx_connection_t *c;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
746 ngx_http_header_t *hh;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
747 ngx_http_request_t *r;
60
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
748 ngx_http_core_srv_conf_t *cscf;
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
749 ngx_http_core_main_conf_t *cmcf;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
750
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
751 c = rev->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
752 r = c->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
753
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
754 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
755 "http process request header line");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
756
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
757 if (rev->timedout) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
758 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
759 c->timedout = 1;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
760 ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
761 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
762 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
763
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
764 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
60
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
765 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
766 hh = (ngx_http_header_t *) cmcf->headers_in_hash.buckets;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
767
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
768 rc = NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
769
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
770 for ( ;; ) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
771
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
772 if (rc == NGX_AGAIN) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
773
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
774 if (r->header_in->pos == r->header_in->end) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
775
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
776 rv = ngx_http_alloc_large_header_buffer(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
777
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
778 if (rv == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
779 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
780 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
781 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
782
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
783 if (rv == NGX_DECLINED) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
784 header.len = r->header_in->end - r->header_name_start;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
785 header.data = r->header_name_start;
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
786
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
787 if (header.len > NGX_MAX_ERROR_STR - 300) {
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
788 header.len = NGX_MAX_ERROR_STR - 300;
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
789 header.data[header.len++] = '.';
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
790 header.data[header.len++] = '.';
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
791 header.data[header.len++] = '.';
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
792 }
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
793
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
794 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
795 "client sent too long header line: \"%V\"",
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
796 &header);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
797 ngx_http_close_request(r, NGX_HTTP_BAD_REQUEST);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
798 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
799 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
800 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
801
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
802 n = ngx_http_read_request_header(r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
803
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
804 if (n == NGX_AGAIN || n == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
805 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
806 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
807 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
808
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
809 rc = ngx_http_parse_header_line(r, r->header_in);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
810
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
811 if (rc == NGX_OK) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
812
60
df7d3fff122b nginx 0.1.30
Igor Sysoev <http://sysoev.ru>
parents: 58
diff changeset
813 if (r->invalid_header && cscf->ignore_invalid_headers) {
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
814
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
815 /* there was error while a header line parsing */
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
816
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
817 header.len = r->header_end - r->header_name_start;
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
818 header.data = r->header_name_start;
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
819
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
820 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
821 "client sent invalid header line: \"%V\"",
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
822 &header);
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
823 continue;
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
824 }
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
825
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
826 /* a header line has been parsed successfully */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
827
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
828 h = ngx_list_push(&r->headers_in.headers);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
829 if (h == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
830 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
831 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
832 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
833
56
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
834 h->hash = r->header_hash;
3050baa54a26 nginx 0.1.28
Igor Sysoev <http://sysoev.ru>
parents: 54
diff changeset
835
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
836 h->key.len = r->header_name_end - r->header_name_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
837 h->key.data = r->header_name_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
838 h->key.data[h->key.len] = '\0';
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
839
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
840 h->value.len = r->header_end - r->header_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
841 h->value.data = r->header_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
842 h->value.data[h->value.len] = '\0';
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
843
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
844 key = h->hash % cmcf->headers_in_hash.hash_size;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
845
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
846 if (hh[key].name.len == h->key.len
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
847 && ngx_strcasecmp(hh[key].name.data, h->key.data) == 0)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
848 {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
849 if (hh[key].handler(r, h, hh[key].offset) != NGX_OK) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
850 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
851 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
852 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
853
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
854 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
855 "http header: \"%V: %V\"",
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
856 &h->key, &h->value);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
857
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
858 continue;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
859 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
860
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
861 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
862
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
863 /* a whole header has been parsed successfully */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
864
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
865 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
866 "http header done");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
867
24
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
868 r->request_length += r->header_in->pos - r->header_in->start;
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
869
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
870 r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
871
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
872 rc = ngx_http_process_request_header(r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
873
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
874 if (rc != NGX_OK) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
875 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
876 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
877
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
878 if (rev->timer_set) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
879 ngx_del_timer(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
880 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
881
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
882 #if (NGX_STAT_STUB)
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
883 ngx_atomic_fetch_add(ngx_stat_reading, -1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
884 r->stat_reading = 0;
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
885 ngx_atomic_fetch_add(ngx_stat_writing, 1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
886 r->stat_writing = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
887 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
888
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
889 rev->handler = ngx_http_request_handler;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
890 c->write->handler = ngx_http_request_handler;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
891 r->read_event_handler = ngx_http_block_read;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
892
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
893 ngx_http_handler(r);
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 84
diff changeset
894
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
895 return;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
896 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
897
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
898 if (rc == NGX_AGAIN) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
899
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
900 /* a header line parsing is still not complete */
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
901
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
902 continue;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
903 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
904
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
905 /* rc == NGX_HTTP_PARSE_INVALID_HEADER: "\r" is not followed by "\n" */
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
906
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
907 header.len = r->header_end - r->header_name_start;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
908 header.data = r->header_name_start;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
909 ngx_log_error(NGX_LOG_INFO, c->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
910 "client sent invalid header line: \"%V\\r...\"",
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
911 &header);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
912 ngx_http_close_request(r, NGX_HTTP_BAD_REQUEST);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
913 return;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
914 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
915 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
916
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
917
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
918 static ssize_t
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
919 ngx_http_read_request_header(ngx_http_request_t *r)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
920 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
921 ssize_t n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
922 ngx_event_t *rev;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
923 ngx_http_core_srv_conf_t *cscf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
924
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
925 rev = r->connection->read;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
926
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
927 n = r->header_in->last - r->header_in->pos;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
928
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
929 if (n > 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
930 return n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
931 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
932
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
933 if (rev->ready) {
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
934 n = r->connection->recv(r->connection, r->header_in->last,
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
935 r->header_in->end - r->header_in->last);
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
936 } else {
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
937 n = NGX_AGAIN;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
938 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
939
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
940 if (n == NGX_AGAIN) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
941 if (!r->header_timeout_set) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
942 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
943 ngx_add_timer(rev, cscf->client_header_timeout);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
944 r->header_timeout_set = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
945 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
946
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
947 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
948 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
949 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
950 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
951
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
952 return NGX_AGAIN;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
953 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
954
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
955 if (n == 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
956 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
957 "client closed prematurely connection");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
958 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
959
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
960 if (n == 0 || n == NGX_ERROR) {
194
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
961 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
962 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
963 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
964
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
965 r->header_in->last += n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
966
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
967 return n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
968 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
969
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
970
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
971 static ngx_int_t
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
972 ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
973 ngx_uint_t request_line)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
974 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
975 u_char *old, *new;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
976 ngx_buf_t *b;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
977 ngx_http_connection_t *hc;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
978 ngx_http_core_srv_conf_t *cscf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
979
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
980 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
981 "http alloc large header buffer");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
982
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
983 if (request_line && r->state == 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
984
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
985 /* the client fills up the buffer with "\r\n" */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
986
24
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
987 r->request_length += r->header_in->end - r->header_in->start;
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
988
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
989 r->header_in->pos = r->header_in->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
990 r->header_in->last = r->header_in->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
991
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
992 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
993 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
994
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
995 old = request_line ? r->request_start : r->header_name_start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
996
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
997 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
998
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
999 if (r->state != 0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1000 && (size_t) (r->header_in->pos - old)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1001 >= cscf->large_client_header_buffers.size)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1002 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1003 return NGX_DECLINED;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1004 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1005
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1006 hc = r->http_connection;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1007
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1008 if (hc->nfree) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1009 b = hc->free[--hc->nfree];
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1010
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1011 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
1012 "http large header free: %p %uz",
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1013 b->pos, b->end - b->last);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1014
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1015 } else if (hc->nbusy < cscf->large_client_header_buffers.num) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1016
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1017 if (hc->busy == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1018 hc->busy = ngx_palloc(r->connection->pool,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1019 cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1020 if (hc->busy == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1021 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1022 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1023 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1024
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1025 b = ngx_create_temp_buf(r->connection->pool,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1026 cscf->large_client_header_buffers.size);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1027 if (b == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1028 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1029 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1030
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1031 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
1032 "http large header alloc: %p %uz",
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1033 b->pos, b->end - b->last);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1034
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1035 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1036 return NGX_DECLINED;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1037 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1038
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1039 hc->busy[hc->nbusy++] = b;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1040
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1041 if (r->state == 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1042 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1043 * r->state == 0 means that a header line was parsed successfully
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1044 * and we do not need to copy incomplete header line and
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1045 * to relocate the parser header pointers
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1046 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1047
24
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1048 r->request_length += r->header_in->end - r->header_in->start;
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1049
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1050 r->header_in = b;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1051
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1052 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1053 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1054
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1055 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1056 "http large header copy: %d", r->header_in->pos - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1057
24
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1058 r->request_length += old - r->header_in->start;
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1059
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1060 new = b->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1061
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1062 ngx_memcpy(new, old, r->header_in->pos - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1063
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1064 b->pos = new + (r->header_in->pos - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1065 b->last = new + (r->header_in->pos - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1066
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1067 if (request_line) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1068 r->request_start = new;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1069
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1070 if (r->request_end) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1071 r->request_end = new + (r->request_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1072 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1073
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1074 r->method_end = new + (r->method_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1075
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1076 r->uri_start = new + (r->uri_start - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1077 r->uri_end = new + (r->uri_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1078
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1079 if (r->schema_start) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1080 r->schema_start = new + (r->schema_start - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1081 r->schema_end = new + (r->schema_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1082 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1083
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1084 if (r->host_start) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1085 r->host_start = new + (r->host_start - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1086 r->host_end = new + (r->host_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1087 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1088
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1089 if (r->port_start) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1090 r->port_start = new + (r->port_start - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1091 r->port_end = new + (r->port_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1092 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1093
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1094 if (r->uri_ext) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1095 r->uri_ext = new + (r->uri_ext - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1096 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1097
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1098 if (r->args_start) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1099 r->args_start = new + (r->args_start - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1100 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1101
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1102 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1103 r->header_name_start = new;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1104 r->header_name_end = new + (r->header_name_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1105 r->header_start = new + (r->header_start - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1106 r->header_end = new + (r->header_end - old);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1107 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1108
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1109 r->header_in = b;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1110
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1111 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1112 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1113
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1114
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1115 static ngx_int_t
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1116 ngx_http_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1117 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1118 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1119 ngx_table_elt_t **ph;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1120
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1121 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1122
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1123 if (*ph == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1124 *ph = h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1125 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1126
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1127 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1128 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1129
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1130
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1131 static ngx_int_t
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1132 ngx_http_process_unique_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1133 ngx_uint_t offset)
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1134 {
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1135 ngx_table_elt_t **ph;
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1136
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1137 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1138
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1139 if (*ph == NULL) {
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1140 *ph = h;
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1141 return NGX_OK;
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1142 }
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1143
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1144 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1145 "client sent duplicate header line: \"%V: %V\"",
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1146 &h->key, &h->value);
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1147
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1148 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1149
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1150 return NGX_ERROR;
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1151 }
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1152
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1153
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1154 static ngx_int_t
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1155 ngx_http_process_cookie(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1156 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1157 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1158 ngx_table_elt_t **cookie;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1159
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1160 cookie = ngx_array_push(&r->headers_in.cookies);
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1161 if (cookie) {
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1162 *cookie = h;
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1163 return NGX_OK;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1164 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1165
72
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1166 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1167
b31656313b59 nginx 0.1.36
Igor Sysoev <http://sysoev.ru>
parents: 70
diff changeset
1168 return NGX_ERROR;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1169 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1170
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1171
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1172 static ngx_int_t
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1173 ngx_http_process_request_header(ngx_http_request_t *r)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1174 {
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1175 size_t len;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1176 u_char *ua, *user_agent, ch;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1177 #if (NGX_HTTP_SSL)
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1178 long rc;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1179 ngx_http_ssl_srv_conf_t *sscf;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1180 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1181
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1182 if (r->headers_in.host) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1183 for (len = 0; len < r->headers_in.host->value.len; len++) {
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1184 ch = r->headers_in.host->value.data[len];
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1185
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1186 if (ch == ':') {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1187 break;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1188 }
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1189
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1190 r->headers_in.host->value.data[len] = ngx_tolower(ch);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1191 }
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1192
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1193 if (r->headers_in.host->value.data[len - 1] == '.') {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1194 len--;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1195 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1196
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1197 r->headers_in.host_name_len = len;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1198
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1199 ngx_http_find_virtual_server(r);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1200
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1201 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1202 if (r->http_version > NGX_HTTP_VERSION_10) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1203 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1204 "client sent HTTP/1.1 request without \"Host\" header");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1205 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1206 return NGX_ERROR;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1207 }
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1208
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1209 r->headers_in.host_name_len = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1210 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1211
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1212 if (r->headers_in.content_length) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1213 r->headers_in.content_length_n =
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1214 ngx_atosz(r->headers_in.content_length->value.data,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1215 r->headers_in.content_length->value.len);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1216
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1217 if (r->headers_in.content_length_n == NGX_ERROR) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1218 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1219 "client sent invalid \"Content-Length\" header");
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1220 ngx_http_finalize_request(r, NGX_HTTP_LENGTH_REQUIRED);
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1221 return NGX_ERROR;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1222 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1223 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1224
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
1225 if (r->method & (NGX_HTTP_POST|NGX_HTTP_PUT)
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
1226 && r->headers_in.content_length_n == -1)
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
1227 {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1228 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1229 "client sent POST method without \"Content-Length\" header");
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1230 ngx_http_finalize_request(r, NGX_HTTP_LENGTH_REQUIRED);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1231 return NGX_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1232 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1233
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1234 if (r->headers_in.transfer_encoding
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1235 && ngx_strstr(r->headers_in.transfer_encoding->value.data, "chunked"))
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1236 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1237 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1238 "client sent \"Transfer-Encoding: chunked\" header");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1239 ngx_http_finalize_request(r, NGX_HTTP_LENGTH_REQUIRED);
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1240 return NGX_ERROR;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1241 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1242
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1243 if (r->plain_http) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1244 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1245 "client sent plain HTTP request to HTTPS port");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1246 ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1247 return NGX_ERROR;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1248 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1249
196
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1250 #if (NGX_HTTP_SSL)
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1251
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1252 if (r->connection->ssl) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1253 sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module);
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1254
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1255 if (sscf->verify) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1256 rc = SSL_get_verify_result(r->connection->ssl->connection);
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1257
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1258 if (rc != X509_V_OK) {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1259 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1260 "client SSL certificate verify error: %l ", rc);
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1261 ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR);
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1262 return NGX_ERROR;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1263 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1264
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1265 if (SSL_get_peer_certificate(r->connection->ssl->connection)
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1266 == NULL)
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1267 {
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1268 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1269 "client sent no required SSL certificate");
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1270 ngx_http_finalize_request(r, NGX_HTTPS_NO_CERT);
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1271 return NGX_ERROR;
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1272 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1273 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1274 }
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1275
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1276 #endif
8759b346e431 nginx 0.3.45
Igor Sysoev <http://sysoev.ru>
parents: 194
diff changeset
1277
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1278 if (r->headers_in.connection) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1279 if (r->headers_in.connection->value.len == 5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1280 && ngx_strcasecmp(r->headers_in.connection->value.data, "close")
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1281 == 0)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1282 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1283 r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1284
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1285 } else if (r->headers_in.connection->value.len == 10
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1286 && ngx_strcasecmp(r->headers_in.connection->value.data,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1287 "keep-alive") == 0)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1288 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1289 r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1290
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1291 if (r->headers_in.keep_alive) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1292 r->headers_in.keep_alive_n =
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1293 ngx_atotm(r->headers_in.keep_alive->value.data,
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1294 r->headers_in.keep_alive->value.len);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1295 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1296 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1297 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1298
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1299 if (r->headers_in.user_agent) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1300
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1301 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1302 * check some widespread browsers while the headers are still
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1303 * in CPU cache
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1304 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1305
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1306 user_agent = r->headers_in.user_agent->value.data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1307
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1308 ua = (u_char *) ngx_strstr(user_agent, "MSIE");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1309
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1310 if (ua && ua + 8 < user_agent + r->headers_in.user_agent->value.len) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1311
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1312 r->headers_in.msie = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1313
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1314 if (ua[4] == ' ' && ua[5] == '4' && ua[6] == '.') {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1315 r->headers_in.msie4 = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1316 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1317
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1318 #if 0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1319 /* MSIE ignores the SSL "close notify" alert */
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1320 if (c->ssl) {
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
1321 c->ssl->no_send_shutdown = 1;
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1322 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1323 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1324 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1325
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1326 if (ngx_strstr(user_agent, "Opera")) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1327 r->headers_in.opera = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1328 r->headers_in.msie = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1329 r->headers_in.msie4 = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1330 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1331
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1332 if (!r->headers_in.msie && !r->headers_in.opera) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1333
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1334 if (ngx_strstr(user_agent, "Gecko/")) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1335 r->headers_in.gecko = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1336
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1337 } else if (ngx_strstr(user_agent, "Konqueror")) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1338 r->headers_in.konqueror = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1339 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1340 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1341 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1342
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1343 return NGX_OK;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1344 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1345
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1346
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1347 static void
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1348 ngx_http_find_virtual_server(ngx_http_request_t *r)
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1349 {
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1350 size_t len;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1351 u_char *host;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1352 ngx_http_virtual_names_t *vn;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1353 ngx_http_core_loc_conf_t *clcf;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1354 ngx_http_core_srv_conf_t *cscf;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1355
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1356 vn = r->virtual_names;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1357
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1358 if (vn == NULL) {
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1359 return;
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1360 }
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1361
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1362 host = r->headers_in.host->value.data;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1363 len = r->headers_in.host_name_len;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1364
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1365 /* STUB: ngx_hash_key() here is STUB */
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1366
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1367 if (vn->hash.buckets) {
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1368 cscf = ngx_hash_find(&vn->hash, ngx_hash_key(host, len), host, len);
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1369 if (cscf) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1370 goto found;
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1371 }
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1372 }
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1373
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1374 if (vn->dns_wildcards && vn->dns_wildcards->hash.buckets) {
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1375 cscf = ngx_hash_find_wildcard(vn->dns_wildcards, host, len);
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1376
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1377 if (cscf) {
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1378 goto found;
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1379 }
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1380 }
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1381
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1382 return;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1383
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1384 found:
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1385
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1386 r->server_name.len = len;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1387 r->server_name.data = host;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1388
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1389 r->srv_conf = cscf->ctx->srv_conf;
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1390 r->loc_conf = cscf->ctx->loc_conf;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1391
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1392 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1393 r->connection->log->file = clcf->err_log->file;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1394
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1395 if (!(r->connection->log->log_level & NGX_LOG_DEBUG_CONNECTION)) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1396 r->connection->log->log_level = clcf->err_log->log_level;
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1397 }
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1398
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1399 return;
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1400 }
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1401
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1402
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1403 static void
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1404 ngx_http_request_handler(ngx_event_t *ev)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1405 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1406 ngx_connection_t *c;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1407 ngx_http_request_t *r;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1408
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1409 c = ev->data;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1410 r = c->data;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1411
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1412 if (ev->write) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1413 r->write_event_handler(r);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1414
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1415 } else {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1416 r->read_event_handler(r);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1417 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1418 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1419
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1420
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1421 void
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1422 ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1423 {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1424 ngx_http_request_t *pr;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1425 ngx_http_core_loc_conf_t *clcf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1426
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1427 if (rc == NGX_DONE) {
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1428 /* the request pool may be already destroyed */
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1429 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1430 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1431
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1432 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1433 "http finalize request: %d, \"%V?%V\"",
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1434 rc, &r->uri, &r->args);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1435
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1436 if (rc == NGX_ERROR
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1437 || rc == NGX_HTTP_REQUEST_TIME_OUT
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1438 || r->connection->error)
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1439 {
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
1440 if (rc == NGX_HTTP_CLIENT_CLOSED_REQUEST
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
1441 && r->headers_out.status == 0)
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
1442 {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
1443 r->headers_out.status = NGX_HTTP_CLIENT_CLOSED_REQUEST;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
1444 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 188
diff changeset
1445
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1446 if (ngx_http_post_action(r) == NGX_OK) {
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1447 return;
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1448 }
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1449
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1450 ngx_http_close_request(r, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1451 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1452 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1453
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
1454 if (rc >= NGX_HTTP_SPECIAL_RESPONSE
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
1455 || rc == NGX_HTTP_CREATED
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
1456 || rc == NGX_HTTP_NO_CONTENT)
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 184
diff changeset
1457 {
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1458
136
3656228c0b56 nginx 0.3.15
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
1459 if (rc == NGX_HTTP_CLOSE) {
3656228c0b56 nginx 0.3.15
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
1460 ngx_http_close_request(r, rc);
3656228c0b56 nginx 0.3.15
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
1461 return;
3656228c0b56 nginx 0.3.15
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
1462 }
3656228c0b56 nginx 0.3.15
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
1463
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1464 if (r == r->main) {
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1465 if (r->connection->read->timer_set) {
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1466 ngx_del_timer(r->connection->read);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1467 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1468
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1469 if (r->connection->write->timer_set) {
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1470 ngx_del_timer(r->connection->write);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1471 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1472 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1473
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1474 ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc));
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1475 return;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1476 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1477
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1478 if (r != r->main || rc == NGX_AGAIN) {
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1479 if (ngx_http_set_write_handler(r) != NGX_OK) {
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1480 return;
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1481 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1482 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1483
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1484 r->done = 1;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1485
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1486 if (r != r->connection->data) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1487 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1488 "http finalize non-active request: \"%V?%V\"",
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1489 &r->uri, &r->args);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1490 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1491 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1492
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1493 if (r != r->main) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1494
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1495 pr = r->parent;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1496
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1497 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1498 "http parent request: \"%V?%V\"", &pr->uri, &pr->args);
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1499
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1500 if (rc != NGX_AGAIN) {
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1501 r->connection->data = pr;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1502 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1503
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1504 if (pr->postponed) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1505
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1506 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1507 "http request: \"%V?%V\" has postponed",
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1508 &pr->uri, &pr->args);
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1509
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1510 if (rc != NGX_AGAIN && pr->postponed->request == r) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1511 pr->postponed = pr->postponed->next;
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1512 }
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1513
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1514 if (r->fast_subrequest) {
194
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1515
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1516 if (rc == NGX_AGAIN) {
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1517 r->fast_subrequest = 0;
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1518 }
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1519
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1520 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1521 "http fast subrequest: \"%V?%V\" done",
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1522 &r->uri, &r->args);
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1523 return;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1524 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1525
194
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1526 if (rc != NGX_AGAIN) {
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1527 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1528 "http wake parent request: \"%V?%V\"",
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1529 &pr->uri, &pr->args);
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1530
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1531 pr->write_event_handler(pr);
003bd800ec2a nginx 0.3.44
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1532 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1533 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1534
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1535 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1536 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1537
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1538 if (rc == NGX_AGAIN) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1539 return;
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1540 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1541
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1542 if (r->connection->buffered) {
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1543 (void) ngx_http_set_write_handler(r);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1544 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1545 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1546
178
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
1547 if (!r->post_action) {
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
1548 r->request_complete = 1;
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
1549 }
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
1550
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1551 if (ngx_http_post_action(r) == NGX_OK) {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1552 return;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1553 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1554
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1555 if (r->connection->read->timer_set) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1556 ngx_del_timer(r->connection->read);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1557 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1558
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1559 if (r->connection->write->timer_set) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1560 r->connection->write->delayed = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1561 ngx_del_timer(r->connection->write);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1562 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1563
138
8e6d4d96ec4c nginx 0.3.16
Igor Sysoev <http://sysoev.ru>
parents: 136
diff changeset
1564 if (r->connection->destroyed) {
8e6d4d96ec4c nginx 0.3.16
Igor Sysoev <http://sysoev.ru>
parents: 136
diff changeset
1565 return;
8e6d4d96ec4c nginx 0.3.16
Igor Sysoev <http://sysoev.ru>
parents: 136
diff changeset
1566 }
8e6d4d96ec4c nginx 0.3.16
Igor Sysoev <http://sysoev.ru>
parents: 136
diff changeset
1567
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1568 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1569
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1570 if (!ngx_terminate
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1571 && !ngx_exiting
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1572 && r->keepalive != 0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1573 && clcf->keepalive_timeout > 0)
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1574 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1575 ngx_http_set_keepalive(r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1576 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1577
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1578 } else if (r->lingering_close && clcf->lingering_timeout > 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1579 ngx_http_set_lingering_close(r);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1580 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1581 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1582
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1583 ngx_http_close_request(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1584 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1585
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1586
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1587 static ngx_int_t
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1588 ngx_http_set_write_handler(ngx_http_request_t *r)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1589 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1590 ngx_event_t *wev;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1591 ngx_http_core_loc_conf_t *clcf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1592
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1593 r->http_state = NGX_HTTP_WRITING_REQUEST_STATE;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1594
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1595 r->write_event_handler = ngx_http_writer;
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1596
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1597 wev = r->connection->write;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1598
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1599 if (wev->ready && wev->delayed) {
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1600 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1601 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1602
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1603 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1604 if (!wev->delayed) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1605 ngx_add_timer(wev, clcf->send_timeout);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1606 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1607
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1608 if (ngx_handle_write_event(wev, clcf->send_lowat) == NGX_ERROR) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1609 ngx_http_close_request(r, 0);
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1610 return NGX_ERROR;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1611 }
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1612
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 72
diff changeset
1613 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1614 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1615
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1616
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1617 static void
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1618 ngx_http_writer(ngx_http_request_t *r)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1619 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1620 int rc;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1621 ngx_event_t *wev;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1622 ngx_connection_t *c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1623 ngx_http_core_loc_conf_t *clcf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1624
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1625 c = r->connection;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1626 wev = c->write;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1627
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1628 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1629 "http writer handler: \"%V?%V\"", &r->uri, &r->args);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1630
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1631 if (wev->timedout) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1632 if (!wev->delayed) {
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1633 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1634 "client timed out");
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
1635 c->timedout = 1;
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1636
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
1637 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1638 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1639 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1640
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1641 wev->timedout = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1642 wev->delayed = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1643
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1644 if (!wev->ready) {
102
f63280c59dd5 nginx 0.2.5
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
1645 clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1646 ngx_add_timer(wev, clcf->send_timeout);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1647
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1648 if (ngx_handle_write_event(wev, clcf->send_lowat) == NGX_ERROR) {
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1649 ngx_http_close_request(r, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1650 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1651
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1652 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1653 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1654
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1655 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1656 if (wev->delayed) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1657 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1658 "http writer delayed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1659
102
f63280c59dd5 nginx 0.2.5
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
1660 clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1661
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1662 if (ngx_handle_write_event(wev, clcf->send_lowat) == NGX_ERROR) {
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1663 ngx_http_close_request(r, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1664 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1665
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1666 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1667 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1668 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1669
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1670 rc = ngx_http_output_filter(r, NULL);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1671
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1672 if (c->destroyed) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1673 return;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1674 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1675
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1676 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1677 "http writer output filter: %d, \"%V?%V\"",
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1678 rc, &r->uri, &r->args);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1679
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1680 if (rc == NGX_AGAIN) {
102
f63280c59dd5 nginx 0.2.5
Igor Sysoev <http://sysoev.ru>
parents: 96
diff changeset
1681 clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1682 if (!wev->ready && !wev->delayed) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1683 ngx_add_timer(wev, clcf->send_timeout);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1684 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1685
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1686 if (ngx_handle_write_event(wev, clcf->send_lowat) == NGX_ERROR) {
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1687 ngx_http_close_request(r, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1688 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1689
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1690 if (r == r->main) {
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1691 return;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1692 }
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1693
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1694 rc = NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1695 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1696
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1697 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, wev->log, 0,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1698 "http writer done: \"%V?%V\"", &r->uri, &r->args);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1699
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1700 ngx_http_finalize_request(r, rc);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1701 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1702
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1703
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1704 static void
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1705 ngx_http_block_read(ngx_http_request_t *r)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1706 {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1707 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1708 "http read blocked");
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1709
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1710 /* aio does not call this handler */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1711
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1712 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1713 && r->connection->read->active)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1714 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1715 if (ngx_del_event(r->connection->read, NGX_READ_EVENT, 0)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1716 == NGX_ERROR)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1717 {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1718 ngx_http_close_request(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1719 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1720 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1721 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1722
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1723
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1724 static void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1725 ngx_http_set_keepalive(ngx_http_request_t *r)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1726 {
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1727 int tcp_nodelay;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1728 ngx_int_t i;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1729 ngx_buf_t *b, *f;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1730 ngx_event_t *rev, *wev;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1731 ngx_connection_t *c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1732 ngx_http_connection_t *hc;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1733 ngx_http_core_srv_conf_t *cscf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1734 ngx_http_core_loc_conf_t *clcf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1735
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1736 c = r->connection;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1737 rev = c->read;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1738
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1739 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1740
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1741 c->log->action = "closing request";
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1742
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1743 hc = r->http_connection;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1744 b = r->header_in;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1745
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1746 if (b->pos < b->last) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1747
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1748 /* the pipelined request */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1749
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1750 if (b != c->buffer) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1751
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1752 /*
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1753 * If the large header buffers were allocated while the previous
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1754 * request processing then we do not use c->buffer for
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1755 * the pipelined request (see ngx_http_init_request()).
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1756 *
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1757 * Now we would move the large header buffers to the free list.
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1758 */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1759
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1760 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1761
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1762 if (hc->free == NULL) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1763 hc->free = ngx_palloc(c->pool,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1764 cscf->large_client_header_buffers.num * sizeof(ngx_buf_t *));
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1765
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1766 if (hc->free == NULL) {
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1767 ngx_http_close_request(r, 0);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1768 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1769 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1770 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1771
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1772 for (i = 0; i < hc->nbusy - 1; i++) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1773 f = hc->busy[i];
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1774 hc->free[hc->nfree++] = f;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1775 f->pos = f->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1776 f->last = f->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1777 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1778
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1779 hc->busy[0] = b;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1780 hc->nbusy = 1;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1781 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1782 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1783
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1784 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
1785
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1786 ngx_http_request_done(r, 0);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
1787
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1788 c->data = hc;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1789
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1790 ngx_add_timer(rev, clcf->keepalive_timeout);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1791
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1792 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1793 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1794 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1795 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1796
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1797 wev = c->write;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1798 wev->handler = ngx_http_empty_handler;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1799
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1800 if (b->pos < b->last) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1801
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1802 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1803
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1804 #if (NGX_STAT_STUB)
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1805 ngx_atomic_fetch_add(ngx_stat_reading, 1);
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1806 #endif
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1807
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1808 hc->pipeline = 1;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1809 c->log->action = "reading client pipelined request line";
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
1810
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1811 ngx_http_init_request(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1812 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1813 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1814
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1815 hc->pipeline = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1816
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1817 /*
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1818 * To keep a memory footprint as small as possible for an idle
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1819 * keepalive connection we try to free the ngx_http_request_t and
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1820 * c->buffer's memory if they were allocated outside the c->pool.
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1821 * The large header buffers are always allocated outside the c->pool and
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1822 * are freed too.
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1823 */
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1824
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1825 if (ngx_pfree(c->pool, r) == NGX_OK) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1826 hc->request = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1827 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1828
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1829 b = c->buffer;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1830
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1831 if (ngx_pfree(c->pool, b->start) == NGX_OK) {
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1832
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1833 /*
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1834 * the special note for ngx_http_keepalive_handler() that
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1835 * c->buffer's memory was freed
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1836 */
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1837
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1838 b->pos = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1839
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1840 } else {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1841 b->pos = b->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1842 b->last = b->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1843 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1844
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
1845 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc free: %p %d",
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1846 hc->free, hc->nfree);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1847
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1848 if (hc->free) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1849 for (i = 0; i < hc->nfree; i++) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1850 ngx_pfree(c->pool, hc->free[i]);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1851 hc->free[i] = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1852 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1853
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1854 hc->nfree = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1855 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1856
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
1857 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, "hc busy: %p %d",
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1858 hc->busy, hc->nbusy);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1859
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1860 if (hc->busy) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1861 for (i = 0; i < hc->nbusy; i++) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1862 ngx_pfree(c->pool, hc->busy[i]);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1863 hc->busy[i] = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1864 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1865
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1866 hc->nbusy = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1867 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1868
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1869 rev->handler = ngx_http_keepalive_handler;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1870
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1871 if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1872 if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1873 ngx_http_close_connection(c);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1874 return;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1875 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1876 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1877
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1878 c->log->action = "keepalive";
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1879
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1880 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1881 if (ngx_tcp_push(c->fd) == -1) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1882 ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1883 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1884 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1885 }
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1886
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1887 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1888 tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1889
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1890 } else {
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1891 tcp_nodelay = 1;
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1892 }
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1893
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1894 if (tcp_nodelay
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1895 && clcf->tcp_nodelay
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1896 && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1897 {
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1898 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1899
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1900 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
184
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
1901 (const void *) &tcp_nodelay, sizeof(int))
71ff1e2b484a nginx 0.3.39
Igor Sysoev <http://sysoev.ru>
parents: 182
diff changeset
1902 == -1)
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1903 {
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1904 ngx_connection_error(c, ngx_socket_errno,
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1905 "setsockopt(TCP_NODELAY) failed");
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1906 ngx_http_close_connection(c);
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1907 return;
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
1908 }
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1909
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1910 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1911 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1912
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1913 #if 0
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1914 /* if ngx_http_request_t was freed then we need some other place */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1915 r->http_state = NGX_HTTP_KEEPALIVE_STATE;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1916 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1917
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1918 if (rev->ready) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1919 ngx_http_keepalive_handler(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1920 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1921 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1922
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1923
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1924 static void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1925 ngx_http_keepalive_handler(ngx_event_t *rev)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1926 {
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1927 size_t size;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1928 ssize_t n;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1929 ngx_buf_t *b;
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1930 ngx_connection_t *c;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1931
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1932 c = rev->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1933
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1934 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1935
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1936 if (rev->timedout) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1937 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1938 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1939 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1940
18
6f8b0dc0f8dd nginx 0.1.9
Igor Sysoev <http://sysoev.ru>
parents: 10
diff changeset
1941 #if (NGX_HAVE_KQUEUE)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1942
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1943 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
136
3656228c0b56 nginx 0.3.15
Igor Sysoev <http://sysoev.ru>
parents: 132
diff changeset
1944 if (rev->pending_eof) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1945 c->log->handler = NULL;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1946 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
1947 "kevent() reported that client %V closed "
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
1948 "keepalive connection", &c->addr_text);
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1949 #if (NGX_HTTP_SSL)
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1950 if (c->ssl) {
96
ca4f70b3ccc6 nginx 0.2.2
Igor Sysoev <http://sysoev.ru>
parents: 92
diff changeset
1951 c->ssl->no_send_shutdown = 1;
22
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1952 }
8b6db3bda591 nginx 0.1.11
Igor Sysoev <http://sysoev.ru>
parents: 18
diff changeset
1953 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1954 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1955 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1956 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1957 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1958
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1959 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1960
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1961 b = c->buffer;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1962 size = b->end - b->start;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1963
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1964 if (b->pos == NULL) {
4
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1965
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1966 /*
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1967 * The c->buffer's memory was freed by ngx_http_set_keepalive().
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1968 * However, the c->buffer->start and c->buffer->end were not changed
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1969 * to keep the buffer size.
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1970 */
4b2dafa26fe2 nginx 0.1.2
Igor Sysoev <http://sysoev.ru>
parents: 2
diff changeset
1971
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1972 b->pos = ngx_palloc(c->pool, size);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
1973 if (b->pos == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1974 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1975 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1976 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1977
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1978 b->start = b->pos;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1979 b->last = b->pos;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1980 b->end = b->pos + size;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1981 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1982
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1983 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1984 * MSIE closes a keepalive connection with RST flag
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1985 * so we ignore ECONNRESET here.
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1986 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1987
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1988 c->log_error = NGX_ERROR_IGNORE_ECONNRESET;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1989 ngx_set_socket_errno(0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1990
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1991 n = c->recv(c, b->last, size);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1992 c->log_error = NGX_ERROR_INFO;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1993
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1994 if (n == NGX_AGAIN) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1995 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
24
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1996 ngx_http_close_connection(c);
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1997 }
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
1998
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1999 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2000 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2001
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2002 if (n == NGX_ERROR) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2003 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2004 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2005 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2006
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2007 c->log->handler = NULL;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2008
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2009 if (n == 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2010 ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2011 "client %V closed keepalive connection", &c->addr_text);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2012 ngx_http_close_connection(c);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2013 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2014 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2015
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2016 b->last += n;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2017
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2018 #if (NGX_STAT_STUB)
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2019 ngx_atomic_fetch_add(ngx_stat_reading, 1);
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2020 #endif
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2021
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2022 c->log->handler = ngx_http_log_error;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2023 c->log->action = "reading client request line";
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2024
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2025 ngx_http_init_request(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2026 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2027
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2028
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2029 static void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2030 ngx_http_set_lingering_close(ngx_http_request_t *r)
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2031 {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2032 ngx_event_t *rev, *wev;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2033 ngx_connection_t *c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2034 ngx_http_core_loc_conf_t *clcf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2035
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2036 c = r->connection;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2037
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2038 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2039
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2040 rev = c->read;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2041 rev->handler = ngx_http_lingering_close_handler;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2042
106
45f7329b4bd0 nginx 0.3.0
Igor Sysoev <http://sysoev.ru>
parents: 102
diff changeset
2043 r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2044 ngx_add_timer(rev, clcf->lingering_timeout);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2045
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2046 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2047 ngx_http_close_request(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2048 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2049 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2050
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2051 wev = c->write;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2052 wev->handler = ngx_http_empty_handler;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2053
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2054 if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2055 if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2056 ngx_http_close_request(r, 0);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2057 return;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2058 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2059 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2060
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2061 if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2062 ngx_connection_error(c, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2063 ngx_shutdown_socket_n " failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2064 ngx_http_close_request(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2065 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2066 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2067
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2068 if (rev->ready) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2069 ngx_http_lingering_close_handler(rev);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2070 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2071 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2072
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2073
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2074 static void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2075 ngx_http_lingering_close_handler(ngx_event_t *rev)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2076 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2077 ssize_t n;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2078 ngx_msec_t timer;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2079 ngx_connection_t *c;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2080 ngx_http_request_t *r;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2081 ngx_http_core_loc_conf_t *clcf;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2082 u_char buffer[NGX_HTTP_LINGERING_BUFFER_SIZE];
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2083
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2084 c = rev->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2085 r = c->data;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2086
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2087 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2088 "http lingering close handler");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2089
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2090 if (rev->timedout) {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2091 c->timedout = 1;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2092 ngx_http_close_request(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2093 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2094 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2095
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2096 timer = r->lingering_time - ngx_time();
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2097 if (timer <= 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2098 ngx_http_close_request(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2099 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2100 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2101
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2102 do {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2103 n = c->recv(c, buffer, NGX_HTTP_LINGERING_BUFFER_SIZE);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2104
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2105 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %d", n);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2106
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2107 if (n == NGX_ERROR || n == 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2108 ngx_http_close_request(r, 0);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2109 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2110 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2111
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2112 } while (rev->ready);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2113
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2114 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
26
45fe5b98a9de nginx 0.1.13
Igor Sysoev <http://sysoev.ru>
parents: 24
diff changeset
2115 ngx_http_close_request(r, 0);
24
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
2116 return;
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
2117 }
420dd3f9e703 nginx 0.1.12
Igor Sysoev <http://sysoev.ru>
parents: 22
diff changeset
2118
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2119 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2120
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2121 timer *= 1000;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2122
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2123 if (timer > clcf->lingering_timeout) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2124 timer = clcf->lingering_timeout;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2125 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2126
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2127 ngx_add_timer(rev, timer);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2128 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2129
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2130
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2131 void
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2132 ngx_http_empty_handler(ngx_event_t *wev)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2133 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2134 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http empty handler");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2135
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2136 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2137 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2138
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2139
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2140 void
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2141 ngx_http_request_empty_handler(ngx_http_request_t *r)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2142 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2143 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2144 "http request empty handler");
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2145
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2146 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2147 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2148
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2149
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2150 ngx_int_t
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2151 ngx_http_send_special(ngx_http_request_t *r, ngx_uint_t flags)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2152 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2153 ngx_buf_t *b;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2154 ngx_chain_t out;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2155
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2156 b = ngx_calloc_buf(r->pool);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2157 if (b == NULL) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2158 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2159 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2160
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2161 if (flags & NGX_HTTP_LAST) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2162 b->last_buf = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2163 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2164
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2165 if (flags & NGX_HTTP_FLUSH) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2166 b->flush = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2167 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2168
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2169 out.buf = b;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2170 out.next = NULL;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2171
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2172 return ngx_http_output_filter(r, &out);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2173 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2174
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2175
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2176 static ngx_int_t
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2177 ngx_http_post_action(ngx_http_request_t *r)
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2178 {
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2179 ngx_http_core_loc_conf_t *clcf;
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2180
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2181 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2182
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2183 if (clcf->post_action.data == NULL) {
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2184 return NGX_DECLINED;
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2185 }
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2186
172
1b490fc19afa nginx 0.3.33
Igor Sysoev <http://sysoev.ru>
parents: 164
diff changeset
2187 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
1b490fc19afa nginx 0.3.33
Igor Sysoev <http://sysoev.ru>
parents: 164
diff changeset
2188 "post action: \"%V\"", &clcf->post_action);
1b490fc19afa nginx 0.3.33
Igor Sysoev <http://sysoev.ru>
parents: 164
diff changeset
2189
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2190 r->http_version = NGX_HTTP_VERSION_9;
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2191 r->header_only = 1;
178
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
2192 r->post_action = 1;
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2193
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2194 ngx_http_internal_redirect(r, &clcf->post_action, NULL);
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2195
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2196 return NGX_OK;
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2197 }
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2198
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2199
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2200 static void
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2201 ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2202 {
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2203 ngx_connection_t *c;
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2204
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2205 c = r->connection;
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2206
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2207 ngx_http_request_done(r->main, error);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2208 ngx_http_close_connection(c);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2209 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2210
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2211
162
6be073125f2e nginx 0.3.28
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
2212 static void
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2213 ngx_http_request_done(ngx_http_request_t *r, ngx_int_t error)
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2214 {
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2215 ngx_log_t *log;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2216 ngx_uint_t i, n;
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2217 struct linger linger;
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2218 ngx_http_cleanup_t *cln;
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2219 ngx_http_log_ctx_t *ctx;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2220 ngx_http_handler_pt *log_handler;
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2221 ngx_http_core_loc_conf_t *clcf;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2222 ngx_http_core_main_conf_t *cmcf;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2223
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2224 log = r->connection->log;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2225
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2226 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2227
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2228 if (r->pool == NULL) {
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2229 ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed");
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2230 return;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2231 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2232
188
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2233 for (cln = r->cleanup; cln; cln = cln->next) {
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2234 if (cln->handler) {
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2235 cln->handler(cln->data);
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2236 }
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2237 }
af37b7cb6698 nginx 0.3.41
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
2238
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2239 #if (NGX_STAT_STUB)
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2240
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2241 if (r->stat_reading) {
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
2242 ngx_atomic_fetch_add(ngx_stat_reading, -1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2243 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2244
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2245 if (r->stat_writing) {
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
2246 ngx_atomic_fetch_add(ngx_stat_writing, -1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2247 }
116
e38f51cd0905 nginx 0.3.5
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2248
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2249 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2250
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2251 if (error && r->headers_out.status == 0) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2252 r->headers_out.status = error;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2253 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2254
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2255 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2256
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2257 log_handler = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.elts;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2258 n = cmcf->phases[NGX_HTTP_LOG_PHASE].handlers.nelts;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2259 for (i = 0; i < n; i++) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2260 log_handler[i](r);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 116
diff changeset
2261 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2262
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2263 if (r->connection->timedout) {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2264 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2265
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2266 if (clcf->reset_timedout_connection) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2267 linger.l_onoff = 1;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2268 linger.l_linger = 0;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2269
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2270 if (setsockopt(r->connection->fd, SOL_SOCKET, SO_LINGER,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2271 (const void *) &linger, sizeof(struct linger)) == -1)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2272 {
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2273 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2274 "setsockopt(SO_LINGER) failed");
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2275 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2276 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2277 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2278
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2279 /* the various request strings were allocated from r->pool */
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2280 ctx = log->data;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2281 ctx->request = NULL;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2282
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2283 r->request_line.len = 0;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2284
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2285 r->connection->destroyed = 1;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2286
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2287 ngx_destroy_pool(r->pool);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2288 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2289
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2290
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2291 static void
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2292 ngx_http_close_connection(ngx_connection_t *c)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2293 {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
2294 ngx_pool_t *pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
2295
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2296 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2297 "close http connection: %d", c->fd);
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2298
88
e916a291e9aa nginx 0.1.44
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
2299 #if (NGX_HTTP_SSL)
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2300
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2301 if (c->ssl) {
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2302 if (ngx_ssl_shutdown(c) == NGX_AGAIN) {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2303 c->ssl->handler = ngx_http_close_connection;
2
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2304 return;
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2305 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2306 }
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2307
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2308 #endif
cc9f381affaa nginx 0.1.1
Igor Sysoev <http://sysoev.ru>
parents: 0
diff changeset
2309
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2310 #if (NGX_STAT_STUB)
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents: 106
diff changeset
2311 ngx_atomic_fetch_add(ngx_stat_active, -1);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2312 #endif
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2313
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2314 c->destroyed = 1;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2315
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
2316 pool = c->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
2317
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2318 ngx_close_connection(c);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents: 26
diff changeset
2319
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2320 ngx_destroy_pool(pool);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2321 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2322
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2323
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2324 static u_char *
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 48
diff changeset
2325 ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2326 {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2327 u_char *p;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2328 ngx_http_request_t *r;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2329 ngx_http_log_ctx_t *ctx;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2330
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 28
diff changeset
2331 if (log->action) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2332 p = ngx_snprintf(buf, len, " while %s", log->action);
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2333 len -= p - buf;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2334 buf = p;
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2335 }
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2336
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2337 ctx = log->data;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2338
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2339 p = ngx_snprintf(buf, len, ", client: %V", ctx->client);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2340 len -= p - buf;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2341
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2342 r = ctx->request;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2343
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2344 if (r) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2345 return r->log_handler(r, p, len);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2346 }
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2347
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2348 return p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2349 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2350
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2351
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2352 static u_char *
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2353 ngx_http_log_error_handler(ngx_http_request_t *r, u_char *buf, size_t len)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2354 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2355 u_char *p;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2356
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2357 if (r->server_name.data) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2358 p = ngx_snprintf(buf, len, ", server: %V", &r->server_name);
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
2359 len -= p - buf;
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2360 buf = p;
52
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
2361 }
0d75d65c642f nginx 0.1.26
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
2362
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2363 if (r->unparsed_uri.data) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2364 p = ngx_snprintf(buf, len, ", URL: \"%V\"", &r->unparsed_uri);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2365 len -= p - buf;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2366 buf = p;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2367
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2368 } else {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2369 if (r->request_line.data == NULL && r->request_start) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2370 for (p = r->request_start; p < r->header_in->last; p++) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2371 if (*p == CR || *p == LF) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2372 break;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2373 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2374 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2375
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2376 r->request_line.len = p - r->request_start;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2377 r->request_line.data = r->request_start;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2378 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2379
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2380 if (r->request_line.len) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2381 p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2382 len -= p - buf;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2383 buf = p;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2384 }
10
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2385 }
46833bd150cb nginx 0.1.5
Igor Sysoev <http://sysoev.ru>
parents: 6
diff changeset
2386
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2387 return ngx_http_log_error_info(r, buf, len);
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2388 }
54
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2389
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2390
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2391 u_char *
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2392 ngx_http_log_error_info(ngx_http_request_t *r, u_char *buf, size_t len)
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2393 {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2394 u_char *p;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2395
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2396 if (r->headers_in.host) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2397 p = ngx_snprintf(buf, len, ", host: \"%V\"",
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2398 &r->headers_in.host->value);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2399 len -= p - buf;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2400 buf = p;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2401 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2402
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2403 if (r->headers_in.referer) {
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2404 p = ngx_snprintf(buf, len, ", referrer: \"%V\"",
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2405 &r->headers_in.referer->value);
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2406 buf = p;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2407 }
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2408
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2409 return buf;
bcb5fce0b038 nginx 0.1.27
Igor Sysoev <http://sysoev.ru>
parents: 52
diff changeset
2410 }