annotate src/http/ngx_http_upstream.c @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents 984bb0b1399b
children 34fb3a573548
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
12 static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
13 static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
14 static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
15 static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
16 ngx_event_t *ev);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 static void ngx_http_upstream_connect(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
18 ngx_http_upstream_t *u);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
19 static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
20 ngx_http_upstream_t *u);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 static void ngx_http_upstream_send_request(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
22 ngx_http_upstream_t *u);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 static void ngx_http_upstream_send_request_handler(ngx_event_t *wev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 static void ngx_http_upstream_process_header(ngx_event_t *rev);
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
25 static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c);
248
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
26 static void ngx_http_upstream_process_body_in_memory(ngx_event_t *rev);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 static void ngx_http_upstream_send_response(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
28 ngx_http_upstream_t *u);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
29 static void
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
30 ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
31 static void ngx_http_upstream_process_non_buffered_body(ngx_event_t *ev);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
32 static ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
33 static ngx_int_t ngx_http_upstream_non_buffered_filter(void *data,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
34 ssize_t bytes);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
35 static void ngx_http_upstream_process_downstream(ngx_http_request_t *r);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 static void ngx_http_upstream_process_body(ngx_event_t *ev);
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
37 static void ngx_http_upstream_store(ngx_http_request_t *r,
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
38 ngx_http_upstream_t *u);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39 static void ngx_http_upstream_dummy_handler(ngx_event_t *wev);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 static void ngx_http_upstream_next(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
41 ngx_http_upstream_t *u, ngx_uint_t ft_type);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
42 static void ngx_http_upstream_cleanup(void *data);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 static void ngx_http_upstream_finalize_request(ngx_http_request_t *r,
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
44 ngx_http_upstream_t *u, ngx_int_t rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
46 static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
47 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
48 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
49 ngx_http_upstream_process_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
50 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
51 static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
52 ngx_table_elt_t *h, ngx_uint_t offset);
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
53 static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
54 ngx_table_elt_t *h, ngx_uint_t offset);
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
55 static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
56 ngx_table_elt_t *h, ngx_uint_t offset);
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
57 static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r,
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
58 ngx_table_elt_t *h, ngx_uint_t offset);
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
59 static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r,
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
60 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
61 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
62 ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
63 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
64 static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
65 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
66 static ngx_int_t ngx_http_upstream_copy_content_length(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
67 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
68 static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
69 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
70 static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
71 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
72 #if (NGX_HTTP_GZIP)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
73 static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
74 ngx_table_elt_t *h, ngx_uint_t offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
75 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
76
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
77 static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);
298
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
78 static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r,
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
79 ngx_http_variable_value_t *v, uintptr_t data);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
80 static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
81 ngx_http_variable_value_t *v, uintptr_t data);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
82 static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
83 ngx_http_variable_value_t *v, uintptr_t data);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
84
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
85 static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
86 static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
87 void *conf);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
88
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
89 static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf);
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
90 static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
91
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
92 #if (NGX_HTTP_SSL)
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
93 static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
94 ngx_http_upstream_t *u, ngx_connection_t *c);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
95 static void ngx_http_upstream_ssl_handshake(ngx_connection_t *c);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
96 #endif
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
97
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
98
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
99 ngx_http_upstream_header_t ngx_http_upstream_headers_in[] = {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
100
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
101 { ngx_string("Status"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
102 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
103 offsetof(ngx_http_upstream_headers_in_t, status),
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
104 ngx_http_upstream_copy_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
105
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
106 { ngx_string("Content-Type"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
107 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
108 offsetof(ngx_http_upstream_headers_in_t, content_type),
222
dd6c66b5b0e2 nginx 0.3.58
Igor Sysoev <http://sysoev.ru>
parents: 220
diff changeset
109 ngx_http_upstream_copy_content_type, 0, 1 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
110
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
111 { ngx_string("Content-Length"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
112 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
113 offsetof(ngx_http_upstream_headers_in_t, content_length),
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
114 ngx_http_upstream_copy_content_length, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
115
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
116 { ngx_string("Date"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
117 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
118 offsetof(ngx_http_upstream_headers_in_t, date),
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
119 ngx_http_upstream_copy_header_line,
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
120 offsetof(ngx_http_headers_out_t, date), 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
121
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
122 { ngx_string("Last-Modified"),
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
123 ngx_http_upstream_process_header_line,
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
124 offsetof(ngx_http_upstream_headers_in_t, last_modified),
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
125 ngx_http_upstream_copy_header_line,
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
126 offsetof(ngx_http_headers_out_t, last_modified), 0 },
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
127
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
128 { ngx_string("Server"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
129 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
130 offsetof(ngx_http_upstream_headers_in_t, server),
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
131 ngx_http_upstream_copy_header_line,
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
132 offsetof(ngx_http_headers_out_t, server), 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
133
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
134 { ngx_string("WWW-Authenticate"),
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
135 ngx_http_upstream_process_header_line,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
136 offsetof(ngx_http_upstream_headers_in_t, www_authenticate),
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
137 ngx_http_upstream_copy_header_line, 0, 0 },
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
138
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
139 { ngx_string("Location"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
140 ngx_http_upstream_ignore_header_line, 0,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
141 ngx_http_upstream_rewrite_location, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
142
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
143 { ngx_string("Refresh"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
144 ngx_http_upstream_ignore_header_line, 0,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
145 ngx_http_upstream_rewrite_refresh, 0, 0 },
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
146
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
147 { ngx_string("Set-Cookie"),
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
148 ngx_http_upstream_ignore_header_line, 0,
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
149 ngx_http_upstream_copy_header_line, 0, 1 },
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
150
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
151 { ngx_string("Content-Disposition"),
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
152 ngx_http_upstream_ignore_header_line, 0,
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
153 ngx_http_upstream_copy_header_line, 0, 1 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
154
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
155 { ngx_string("Cache-Control"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
156 ngx_http_upstream_process_multi_header_lines,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
157 offsetof(ngx_http_upstream_headers_in_t, cache_control),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
158 ngx_http_upstream_copy_multi_header_lines,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
159 offsetof(ngx_http_headers_out_t, cache_control), 1 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
160
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
161 { ngx_string("Expires"),
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
162 ngx_http_upstream_process_header_line,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
163 offsetof(ngx_http_upstream_headers_in_t, expires),
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
164 ngx_http_upstream_copy_header_line,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
165 offsetof(ngx_http_headers_out_t, expires), 1 },
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
166
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
167 { ngx_string("Accept-Ranges"),
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
168 ngx_http_upstream_process_header_line,
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
169 offsetof(ngx_http_upstream_headers_in_t, accept_ranges),
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
170 ngx_http_upstream_copy_header_line,
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
171 offsetof(ngx_http_headers_out_t, accept_ranges), 1 },
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
172
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
173 { ngx_string("Connection"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
174 ngx_http_upstream_ignore_header_line, 0,
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
175 ngx_http_upstream_ignore_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
176
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
177 { ngx_string("Keep-Alive"),
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
178 ngx_http_upstream_ignore_header_line, 0,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
179 ngx_http_upstream_ignore_header_line, 0, 0 },
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
180
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
181 { ngx_string("X-Powered-By"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
182 ngx_http_upstream_ignore_header_line, 0,
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
183 ngx_http_upstream_copy_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
184
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
185 { ngx_string("X-Accel-Expires"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
186 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
187 offsetof(ngx_http_upstream_headers_in_t, x_accel_expires),
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
188 ngx_http_upstream_copy_header_line, 0, 0 },
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
189
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
190 { ngx_string("X-Accel-Redirect"),
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
191 ngx_http_upstream_process_header_line,
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
192 offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect),
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
193 ngx_http_upstream_ignore_header_line, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
194
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
195 { ngx_string("X-Accel-Limit-Rate"),
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
196 ngx_http_upstream_process_limit_rate, 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
197 ngx_http_upstream_ignore_header_line, 0, 0 },
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
198
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
199 { ngx_string("X-Accel-Buffering"),
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
200 ngx_http_upstream_process_buffering, 0,
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
201 ngx_http_upstream_ignore_header_line, 0, 0 },
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
202
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
203 { ngx_string("X-Accel-Charset"),
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
204 ngx_http_upstream_process_charset, 0,
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
205 ngx_http_upstream_ignore_header_line, 0, 0 },
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
206
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
207 #if (NGX_HTTP_GZIP)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
208 { ngx_string("Content-Encoding"),
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
209 ngx_http_upstream_process_header_line,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
210 offsetof(ngx_http_upstream_headers_in_t, content_encoding),
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
211 ngx_http_upstream_copy_content_encoding, 0, 0 },
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
212 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
213
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
214 { ngx_null_string, NULL, 0, NULL, 0, 0 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
215 };
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
218 static ngx_command_t ngx_http_upstream_commands[] = {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
219
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
220 { ngx_string("upstream"),
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
221 NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
222 ngx_http_upstream,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
223 0,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
224 0,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
225 NULL },
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
226
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
227 { ngx_string("server"),
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
228 NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
229 ngx_http_upstream_server,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
230 NGX_HTTP_SRV_CONF_OFFSET,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
231 0,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
232 NULL },
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
233
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
234 ngx_null_command
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
235 };
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
236
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
237
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
238 static ngx_http_module_t ngx_http_upstream_module_ctx = {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
239 ngx_http_upstream_add_variables, /* preconfiguration */
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
240 NULL, /* postconfiguration */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
241
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
242 ngx_http_upstream_create_main_conf, /* create main configuration */
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
243 ngx_http_upstream_init_main_conf, /* init main configuration */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 NULL, /* create server configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246 NULL, /* merge server configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 NULL, /* create location configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 NULL /* merge location configuration */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 };
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
251
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253 ngx_module_t ngx_http_upstream_module = {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
254 NGX_MODULE_V1,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255 &ngx_http_upstream_module_ctx, /* module context */
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
256 ngx_http_upstream_commands, /* module directives */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 NGX_HTTP_MODULE, /* module type */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
258 NULL, /* init master */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 NULL, /* init module */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
260 NULL, /* init process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
261 NULL, /* init thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
262 NULL, /* exit thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
263 NULL, /* exit process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
264 NULL, /* exit master */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 86
diff changeset
265 NGX_MODULE_V1_PADDING
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 };
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
269 static ngx_http_variable_t ngx_http_upstream_vars[] = {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
270
298
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
271 { ngx_string("upstream_addr"), NULL,
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
272 ngx_http_upstream_addr_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
273
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
274 { ngx_string("upstream_status"), NULL,
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
275 ngx_http_upstream_status_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
276
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
277 { ngx_string("upstream_response_time"), NULL,
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
278 ngx_http_upstream_response_time_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
279
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
280 { ngx_null_string, NULL, NULL, 0, 0, 0 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
281 };
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
282
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
283
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
284 void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
285 ngx_http_upstream_init(ngx_http_request_t *r)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 {
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
287 ngx_str_t *host;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
288 ngx_uint_t i;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
289 ngx_connection_t *c;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
290 ngx_resolver_ctx_t *ctx, temp;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
291 ngx_http_cleanup_t *cln;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
292 ngx_http_upstream_t *u;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
293 ngx_http_core_loc_conf_t *clcf;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
294 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
295 ngx_http_upstream_main_conf_t *umcf;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 c = r->connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 "http init upstream, client timer: %d", c->read->timer_set);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 if (c->read->timer_set) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 ngx_del_timer(c->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
305
178
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
306 u = r->upstream;
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
307
87699398f955 nginx 0.3.36
Igor Sysoev <http://sysoev.ru>
parents: 172
diff changeset
308 if (!r->post_action && !u->conf->ignore_client_abort) {
164
b922c231a392 nginx 0.3.29
Igor Sysoev <http://sysoev.ru>
parents: 162
diff changeset
309 r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
b922c231a392 nginx 0.3.29
Igor Sysoev <http://sysoev.ru>
parents: 162
diff changeset
310 r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;
b922c231a392 nginx 0.3.29
Igor Sysoev <http://sysoev.ru>
parents: 162
diff changeset
311 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
312
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 if (!c->write->active) {
80
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
316 if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT)
6ae11d59d10e nginx 0.1.40
Igor Sysoev <http://sysoev.ru>
parents: 78
diff changeset
317 == NGX_ERROR)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
325 if (r->request_body) {
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
326 u->request_bufs = r->request_body->bufs;
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
327 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
328
86
962c43960644 nginx 0.1.43
Igor Sysoev <http://sysoev.ru>
parents: 80
diff changeset
329 if (u->create_request(r) != NGX_OK) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
334 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 u->output.pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337 u->output.bufs.num = 1;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
338 u->output.bufs.size = clcf->client_body_buffer_size;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 u->output.output_filter = ngx_chain_writer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 u->output.filter_ctx = &u->writer;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342 u->writer.pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
344 if (r->upstream_states == NULL) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
345
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
346 r->upstream_states = ngx_array_create(r->pool, 1,
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
347 sizeof(ngx_http_upstream_state_t));
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
348 if (r->upstream_states == NULL) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
349 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
350 return;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
351 }
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
352
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
353 } else {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
354
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
355 u->state = ngx_array_push(r->upstream_states);
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
356 if (u->state == NULL) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
357 ngx_http_upstream_finalize_request(r, u,
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
358 NGX_HTTP_INTERNAL_SERVER_ERROR);
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
359 return;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
360 }
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
361
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
362 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364
142
84910468f6de nginx 0.3.18
Igor Sysoev <http://sysoev.ru>
parents: 140
diff changeset
365 cln = ngx_http_cleanup_add(r, 0);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
366 if (cln == NULL) {
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
367 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
368 return;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
369 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
370
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
371 cln->handler = ngx_http_upstream_cleanup;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
372 cln->data = r;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
373 u->cleanup = &cln->handler;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
374
320
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
375 u->store = (u->conf->store || u->conf->store_lengths);
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
376
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
377 if (u->resolved == NULL) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
378
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
379 uscf = u->conf->upstream;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
380
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
381 } else {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
382
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
383 host = &u->resolved->host;
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
384
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
385 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
386
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
387 uscfp = umcf->upstreams.elts;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
388
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
389 for (i = 0; i < umcf->upstreams.nelts; i++) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
390
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
391 uscf = uscfp[i];
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
392
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
393 if (uscf->host.len == host->len
366
babd3d9efb62 nginx 0.6.27
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
394 && ((uscf->port == 0 && u->resolved->default_port)
babd3d9efb62 nginx 0.6.27
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
395 || uscf->port == u->resolved->port)
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
396 && ngx_memcmp(uscf->host.data, host->data, host->len) == 0)
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
397 {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
398 goto found;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
399 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
400 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
401
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
402 temp.name = *host;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
403
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
404 ctx = ngx_resolve_start(clcf->resolver, &temp);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
405 if (ctx == NULL) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
406 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
407 return;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
408 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
409
354
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
410 if (ctx == NGX_NO_RESOLVER) {
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
411 ngx_log_error(NGX_LOG_ERR, c->log, 0,
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
412 "no resolver defined to resolve %V", host);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
413
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
414 ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY);
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
415 return;
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
416 }
583decdb82a4 nginx 0.6.21
Igor Sysoev <http://sysoev.ru>
parents: 348
diff changeset
417
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
418 ctx->name = *host;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
419 ctx->type = NGX_RESOLVE_A;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
420 ctx->handler = ngx_http_upstream_resolve_handler;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
421 ctx->data = r;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
422 ctx->timeout = clcf->resolver_timeout;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
423
372
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
424 u->resolved->ctx = ctx;
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
425
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
426 if (ngx_resolve_name(ctx) != NGX_OK) {
372
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
427 u->resolved->ctx = NULL;
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
428 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
429 return;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
430 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
431
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
432 return;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
433 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
434
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
435 found:
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
436
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
437 if (uscf->peer.init(r, uscf) != NGX_OK) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
438 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
439 return;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
440 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
441
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
442 ngx_http_upstream_connect(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
443 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
444
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
445
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
446 static void
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
447 ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx)
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
448 {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
449 ngx_http_request_t *r;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
450 ngx_http_upstream_resolved_t *ur;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
451
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
452 r = ctx->data;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
453
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
454 r->upstream->resolved->ctx = NULL;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
455
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
456 if (ctx->state) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
457 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
458 "%V could not be resolved (%i: %s)",
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
459 &ctx->name, ctx->state,
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
460 ngx_resolver_strerror(ctx->state));
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
461
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
462 ngx_resolve_name_done(ctx);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
463 ngx_http_finalize_request(r, NGX_HTTP_BAD_GATEWAY);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
464 return;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
465 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
466
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
467 ur = r->upstream->resolved;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
468 ur->naddrs = ctx->naddrs;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
469 ur->addrs = ctx->addrs;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
470
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
471 #if (NGX_DEBUG)
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
472 {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
473 in_addr_t addr;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
474 ngx_uint_t i;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
475
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
476 for (i = 0; i < ctx->naddrs; i++) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
477 addr = ntohl(ur->addrs[i]);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
478
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
479 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
480 "name was resolved to %ud.%ud.%ud.%ud",
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
481 (addr >> 24) & 0xff, (addr >> 16) & 0xff,
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
482 (addr >> 8) & 0xff, addr & 0xff);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
483 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
484 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
485 #endif
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
486
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
487 if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
488 ngx_resolve_name_done(ctx);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
489 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
490 return;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
491 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
492
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
493 ngx_resolve_name_done(ctx);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
494
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
495 ngx_http_upstream_connect(r, r->upstream);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
496 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
497
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
498
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
499 static void
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
500 ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
501 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
502 ngx_http_upstream_check_broken_connection(r, r->connection->read);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
503 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
504
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
505
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
506 static void
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
507 ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
508 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
509 ngx_http_upstream_check_broken_connection(r, r->connection->write);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
510 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
511
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
512
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
513 static void
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
514 ngx_http_upstream_check_broken_connection(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
515 ngx_event_t *ev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
516 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
517 int n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
518 char buf[1];
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
519 ngx_err_t err;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
520 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
521 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
522
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
523 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
524 "http upstream check client, write event:%d, \"%V\"",
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
525 ev->write, &r->uri);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
526
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
527 c = r->connection;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
528 u = r->upstream;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
529
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
530 if (c->error) {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
531 ngx_http_upstream_finalize_request(r, u,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
532 NGX_HTTP_CLIENT_CLOSED_REQUEST);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
533 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
534 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
535
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
536 if (u->peer.connection == NULL) {
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
537 return;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
538 }
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
539
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
540 #if (NGX_HAVE_KQUEUE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
541
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
542 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
543
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
544 if (!ev->pending_eof) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
545 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
546 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
547
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
548 ev->eof = 1;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
549 c->error = 1;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
550
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
551 if (ev->kq_errno) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
552 ev->error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
553 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
554
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
555 if (!u->cacheable && !u->store && u->peer.connection) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
556 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
557 "kevent() reported that client closed prematurely "
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
558 "connection, so upstream connection is closed too");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
559 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
560 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
561 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
562 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
563
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
564 ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
565 "kevent() reported that client closed "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
566 "prematurely connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
567
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
568 if (u->peer.connection == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
569 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
570 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
571 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
572 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
573
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
574 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
575 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
576
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
577 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
578
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
579 n = recv(c->fd, buf, 1, MSG_PEEK);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
580
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
581 err = ngx_socket_errno;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
582
286
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
583 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err,
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
584 "http upstream recv(): %d", n);
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
585
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
586 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
587 * we do not need to disable the write event because
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
588 * that event has NGX_USE_CLEAR_EVENT type
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
589 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
590
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
591 if (ev->write && (n >= 0 || err == NGX_EAGAIN)) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
592 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
593 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
594
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
595 if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
596 if (ngx_del_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
597 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
598 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
599 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
600 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
601 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
602
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
603 if (n > 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
604 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
605 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
606
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
607 if (n == -1) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
608 if (err == NGX_EAGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
609 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
610 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
611
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
612 ev->error = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
613
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
614 } else { /* n == 0 */
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
615 err = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
616 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
617
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
618 ev->eof = 1;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
619 c->error = 1;
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
620
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
621 if (!u->cacheable && !u->store && u->peer.connection) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
622 ngx_log_error(NGX_LOG_INFO, ev->log, err,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
623 "client closed prematurely connection, "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
624 "so upstream connection is closed too");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
625 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
626 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
627 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
628 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
629
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
630 ngx_log_error(NGX_LOG_INFO, ev->log, err,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
631 "client closed prematurely connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
632
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
633 if (u->peer.connection == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
634 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
635 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
636 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
637 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
638 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
639
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
640
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
641 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
642 ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
643 {
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
644 ngx_int_t rc;
214
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
645 ngx_time_t *tp;
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
646 ngx_connection_t *c;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
647
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
648 r->connection->log->action = "connecting to upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
649
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
650 r->connection->single_connection = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
651
262
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
652 if (u->state && u->state->response_sec) {
214
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
653 tp = ngx_timeofday();
262
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
654 u->state->response_sec = tp->sec - u->state->response_sec;
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
655 u->state->response_msec = tp->msec - u->state->response_msec;
214
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
656 }
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
657
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
658 u->state = ngx_array_push(r->upstream_states);
214
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
659 if (u->state == NULL) {
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
660 ngx_http_upstream_finalize_request(r, u,
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
661 NGX_HTTP_INTERNAL_SERVER_ERROR);
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
662 return;
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
663 }
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
664
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
665 ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
666
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
667 tp = ngx_timeofday();
262
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
668 u->state->response_sec = tp->sec;
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
669 u->state->response_msec = tp->msec;
214
0ad9eeb6ac7f nginx 0.3.54
Igor Sysoev <http://sysoev.ru>
parents: 212
diff changeset
670
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
671 rc = ngx_event_connect_peer(&u->peer);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
672
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
673 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
674 "http upstream connect: %i", rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
675
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
676 if (rc == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
677 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
678 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
679 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
680 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
681
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
682 u->state->peer = u->peer.name;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
683
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
684 if (rc == NGX_BUSY) {
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
685 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams");
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
686 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE);
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
687 return;
92
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
688 }
45945fa8b8ba nginx 0.2.0
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
689
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
690 if (rc == NGX_DECLINED) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
691 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
692 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
693 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
694
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
695 /* rc == NGX_OK || rc == NGX_AGAIN */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
696
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
697 c = u->peer.connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
698
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
699 c->data = r;
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
700
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
701 c->write->handler = ngx_http_upstream_send_request_handler;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
702 c->read->handler = ngx_http_upstream_process_header;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
703
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
704 c->sendfile &= r->connection->sendfile;
372
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
705 u->output.sendfile = c->sendfile;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
706
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
707 c->pool = r->pool;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
708 c->read->log = c->write->log = c->log = r->connection->log;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
709
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
710 /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
711
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
712 u->writer.out = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
713 u->writer.last = &u->writer.out;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
714 u->writer.connection = c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
715 u->writer.limit = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
716
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
717 if (u->request_sent) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
718 if (ngx_http_upstream_reinit(r, u) != NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
719 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
720 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
721 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
722 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
723 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
724
276
c5c2b2883984 nginx 0.5.8
Igor Sysoev <http://sysoev.ru>
parents: 274
diff changeset
725 if (r->request_body
c5c2b2883984 nginx 0.5.8
Igor Sysoev <http://sysoev.ru>
parents: 274
diff changeset
726 && r->request_body->buf
c5c2b2883984 nginx 0.5.8
Igor Sysoev <http://sysoev.ru>
parents: 274
diff changeset
727 && r->request_body->temp_file
c5c2b2883984 nginx 0.5.8
Igor Sysoev <http://sysoev.ru>
parents: 274
diff changeset
728 && r == r->main)
c5c2b2883984 nginx 0.5.8
Igor Sysoev <http://sysoev.ru>
parents: 274
diff changeset
729 {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
730 /*
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
731 * the r->request_body->buf can be reused for one request only,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
732 * the subrequests should allocate their own temporay bufs
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
733 */
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
734
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
735 u->output.free = ngx_alloc_chain_link(r->pool);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
736 if (u->output.free == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
737 ngx_http_upstream_finalize_request(r, u,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
738 NGX_HTTP_INTERNAL_SERVER_ERROR);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
739 return;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
740 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
741
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
742 u->output.free->buf = r->request_body->buf;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
743 u->output.free->next = NULL;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
744 u->output.allocated = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
745
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
746 r->request_body->buf->pos = r->request_body->buf->start;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
747 r->request_body->buf->last = r->request_body->buf->start;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
748 r->request_body->buf->tag = u->output.tag;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
749 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
750
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
751 u->request_sent = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
752
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
753 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
754 ngx_add_timer(c->write, u->conf->connect_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
755 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
756 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
757
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
758 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
759
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
760 if (u->ssl && c->ssl == NULL) {
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
761 ngx_http_upstream_ssl_init_connection(r, u, c);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
762 return;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
763 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
764
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
765 #endif
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
766
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
767 ngx_http_upstream_send_request(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
768 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
769
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
770
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
771 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
772
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
773 static void
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
774 ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
775 ngx_http_upstream_t *u, ngx_connection_t *c)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
776 {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
777 ngx_int_t rc;
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
778
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
779 if (ngx_ssl_create_connection(u->conf->ssl, c,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
780 NGX_SSL_BUFFER|NGX_SSL_CLIENT)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
781 == NGX_ERROR)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
782 {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
783 ngx_http_upstream_finalize_request(r, u,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
784 NGX_HTTP_INTERNAL_SERVER_ERROR);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
785 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
786 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
787
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
788 c->sendfile = 0;
168
3314be145cb9 nginx 0.3.31
Igor Sysoev <http://sysoev.ru>
parents: 164
diff changeset
789 u->output.sendfile = 0;
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
790
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
791 if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) {
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
792 ngx_http_upstream_finalize_request(r, u,
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
793 NGX_HTTP_INTERNAL_SERVER_ERROR);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
794 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
795 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
796
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
797 r->connection->log->action = "SSL handshaking to upstream";
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 186
diff changeset
798
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
799 rc = ngx_ssl_handshake(c);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
800
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
801 if (rc == NGX_AGAIN) {
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
802 c->ssl->handler = ngx_http_upstream_ssl_handshake;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
803 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
804 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
805
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
806 ngx_http_upstream_ssl_handshake(c);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
807 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
808
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
809
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
810 static void
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
811 ngx_http_upstream_ssl_handshake(ngx_connection_t *c)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
812 {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
813 ngx_http_request_t *r;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
814 ngx_http_upstream_t *u;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
815
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
816 r = c->data;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
817 u = r->upstream;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
818
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
819 if (c->ssl->handshaked) {
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
820
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
821 u->peer.save_session(&u->peer, u->peer.data);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
822
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
823 c->write->handler = ngx_http_upstream_send_request_handler;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
824 c->read->handler = ngx_http_upstream_process_header;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
825
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
826 ngx_http_upstream_send_request(r, u);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
827
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
828 return;
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
829 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
830
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
831 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
832
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
833 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
834
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
835 #endif
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
836
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
837
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
838 static ngx_int_t
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
839 ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
840 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
841 ngx_chain_t *cl;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
842
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
843 if (u->reinit_request(r) != NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
844 return NGX_ERROR;
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
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
847 ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t));
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
848
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
849 if (ngx_list_init(&u->headers_in.headers, r->pool, 8,
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
850 sizeof(ngx_table_elt_t))
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
851 != NGX_OK)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
852 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
853 return NGX_ERROR;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
854 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
855
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
856 /* reinit the request chain */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
857
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
858 for (cl = u->request_bufs; cl; cl = cl->next) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
859 cl->buf->pos = cl->buf->start;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
860 cl->buf->file_pos = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
861 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
862
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
863 /* reinit the subrequest's ngx_output_chain() context */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
864
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
865 if (r->request_body && r->request_body->temp_file
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
866 && r != r->main && u->output.buf)
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
867 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
868 u->output.free = ngx_alloc_chain_link(r->pool);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
869 if (u->output.free == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
870 return NGX_ERROR;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
871 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
872
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
873 u->output.free->buf = u->output.buf;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
874 u->output.free->next = NULL;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
875
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
876 u->output.buf->pos = u->output.buf->start;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
877 u->output.buf->last = u->output.buf->start;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
878 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
879
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
880 u->output.buf = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
881 u->output.in = NULL;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
882 u->output.busy = NULL;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
883
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
884 /* reinit u->buffer */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
885
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
886 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
887 if (u->cache) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
888 u->buffer.pos = u->buffer.start + u->cache->ctx.header_size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
889 u->buffer.last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
890
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
891 } else {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
892 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
893 u->buffer.last = u->buffer.start;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
894 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
895 #else
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
896
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
897 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
898 u->buffer.last = u->buffer.start;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
899
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
900 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
901
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
902 return NGX_OK;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
903 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
904
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
905
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
906 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
907 ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
908 {
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
909 ngx_int_t rc;
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
910 ngx_connection_t *c;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
911
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
912 c = u->peer.connection;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
913
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
914 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
915 "http upstream send request");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
916
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
917 if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
918 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
919 return;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
920 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
921
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
922 c->log->action = "sending request to upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
923
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
924 rc = ngx_output_chain(&u->output, u->request_sent ? NULL : u->request_bufs);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
925
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
926 u->request_sent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
927
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
928 if (rc == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
929 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
930 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
931 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
932
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
933 if (c->write->timer_set) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
934 ngx_del_timer(c->write);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
935 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
936
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
937 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
938 ngx_add_timer(c->write, u->conf->send_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
939
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
940 if (ngx_handle_write_event(c->write, u->conf->send_lowat) == NGX_ERROR)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
941 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
942 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
943 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
944 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
945 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
946
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
947 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
948 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
949
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
950 /* rc == NGX_OK */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
951
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
952 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
953 if (ngx_tcp_push(c->fd) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
954 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
955 ngx_tcp_push_n " failed");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
956 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
957 NGX_HTTP_INTERNAL_SERVER_ERROR);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
958 return;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
959 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
960
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
961 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
962 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
963
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
964 ngx_add_timer(c->read, u->conf->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
965
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
966 #if 1
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
967 if (c->read->ready) {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
968
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
969 /* post aio operation */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
970
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
971 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
972 * TODO comment
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
973 * although we can post aio operation just in the end
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
974 * of ngx_http_upstream_connect() CHECK IT !!!
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
975 * it's better to do here because we postpone header buffer allocation
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
976 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
977
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
978 ngx_http_upstream_process_header(c->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
979 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
980 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
981 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
982
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
983 c->write->handler = ngx_http_upstream_dummy_handler;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
984
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
985 if (ngx_handle_write_event(c->write, 0) == NGX_ERROR) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
986 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
987 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
988 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
989 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
990 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
991
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
992
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
993 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
994 ngx_http_upstream_send_request_handler(ngx_event_t *wev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
995 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
996 ngx_connection_t *c;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
997 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
998 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
999
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1000 c = wev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1001 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1002 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1003
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1004 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1005 "http upstream send request handler");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1006
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1007 if (wev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1008 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1009 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1010 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1011
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1012 #if (NGX_HTTP_SSL)
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1013
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
1014 if (u->ssl && c->ssl == NULL) {
140
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1015 ngx_http_upstream_ssl_init_connection(r, u, c);
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1016 return;
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1017 }
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1018
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1019 #endif
55a211e5eeb7 nginx 0.3.17
Igor Sysoev <http://sysoev.ru>
parents: 138
diff changeset
1020
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1021 if (u->header_sent) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1022 wev->handler = ngx_http_upstream_dummy_handler;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1023
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1024 (void) ngx_handle_write_event(wev, 0);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1025
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1026 return;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1027 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
1028
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1029 ngx_http_upstream_send_request(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1030 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1031
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1032
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1033 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1034 ngx_http_upstream_process_header(ngx_event_t *rev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1035 {
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1036 ssize_t n;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1037 ngx_int_t rc;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1038 ngx_str_t *uri, args;
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1039 ngx_uint_t i, flags;
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1040 ngx_list_part_t *part;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1041 ngx_table_elt_t *h;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1042 ngx_connection_t *c;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1043 ngx_http_request_t *r;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1044 ngx_http_upstream_t *u;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1045 ngx_http_err_page_t *err_page;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1046 ngx_http_core_loc_conf_t *clcf;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1047 ngx_http_upstream_header_t *hh;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1048 ngx_http_upstream_main_conf_t *umcf;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1049
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1050 c = rev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1051 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1052 u = r->upstream;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1053
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1054 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1055 "http upstream process header");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1056
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1057 c->log->action = "reading response header from upstream";
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1058
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1059 if (rev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1060 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1061 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1062 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1063
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1064 if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1065 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1066 return;
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1067 }
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1068
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1069 if (u->buffer.start == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1070 u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1071 if (u->buffer.start == NULL) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1072 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1073 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1074 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1075 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1076
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1077 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1078 u->buffer.last = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1079 u->buffer.end = u->buffer.start + u->conf->buffer_size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1080 u->buffer.temporary = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1081
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1082 u->buffer.tag = u->output.tag;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1083
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
1084 if (ngx_list_init(&u->headers_in.headers, r->pool, 8,
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1085 sizeof(ngx_table_elt_t))
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1086 != NGX_OK)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1087 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1088 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1089 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1090 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1091 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1092
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1093 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1094 if (u->cache) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1095 u->buffer.pos += u->cache->ctx.header_size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1096 u->buffer.last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1097 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1098 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1099 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1100
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
1101 n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1102
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1103 if (n == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1104 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1105 ngx_add_timer(rev, u->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1106 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1107
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1108 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1109 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1110 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1111 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1112 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1113
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1114 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1115 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1116
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1117 if (n == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1118 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1119 "upstream prematurely closed connection");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1120 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1121
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1122 if (n == NGX_ERROR || n == 0) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1123 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1124 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1125 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1126
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1127 u->buffer.last += n;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1128
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1129 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1130 u->valid_header_in = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1131
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1132 u->peer.cached = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1133 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1134
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1135 rc = u->process_header(r);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1136
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1137 if (rc == NGX_AGAIN) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1138 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1139 ngx_add_timer(rev, u->read_timeout);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1140 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1141
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1142 if (u->buffer.pos == u->buffer.end) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1143 ngx_log_error(NGX_LOG_ERR, rev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1144 "upstream sent too big header");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1145
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1146 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1147 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1148 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1149
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1150 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1151 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1152 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1153 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1154 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1155
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1156 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1157 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1158
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1159 if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1160 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1161 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1162 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1163
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
1164 if (rc == NGX_ERROR) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1165 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1166 NGX_HTTP_INTERNAL_SERVER_ERROR);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1167 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1168 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1169
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1170 /* rc == NGX_OK */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1171
248
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1172 if (u->headers_in.status_n >= NGX_HTTP_BAD_REQUEST
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1173 && r->subrequest_in_memory)
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1174 {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1175 u->buffer.last = u->buffer.pos;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1176 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1177
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1178 if (u->headers_in.status_n == NGX_HTTP_INTERNAL_SERVER_ERROR) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1179
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1180 if (u->peer.tries > 1
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1181 && (u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_HTTP_500))
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1182 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1183 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_HTTP_500);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1184 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1185 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1186
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1187 #if (NGX_HTTP_CACHE)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1188
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1189 if (u->peer.tries == 0
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1190 && u->stale
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1191 && (u->conf->use_stale & NGX_HTTP_UPSTREAM_FT_HTTP_500))
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1192 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1193 ngx_http_upstream_finalize_request(r, u,
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1194 ngx_http_send_cached_response(r));
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1195 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1196 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1197
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1198 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1199 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1200
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1201 if (u->headers_in.status_n == NGX_HTTP_NOT_FOUND) {
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1202
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1203 if (u->peer.tries > 1
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1204 && u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_HTTP_404)
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1205 {
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1206 ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_HTTP_404);
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1207 return;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1208 }
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1209
224
9909a161eb28 nginx 0.3.59
Igor Sysoev <http://sysoev.ru>
parents: 222
diff changeset
1210 if (u->conf->intercept_404) {
9909a161eb28 nginx 0.3.59
Igor Sysoev <http://sysoev.ru>
parents: 222
diff changeset
1211 ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);
146
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1212 return;
36af50a5582d nginx 0.3.20
Igor Sysoev <http://sysoev.ru>
parents: 142
diff changeset
1213 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1214 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1215
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1216
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1217 if (u->headers_in.status_n >= NGX_HTTP_BAD_REQUEST
224
9909a161eb28 nginx 0.3.59
Igor Sysoev <http://sysoev.ru>
parents: 222
diff changeset
1218 && u->conf->intercept_errors)
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1219 {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1220 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1221
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1222 if (clcf->error_pages) {
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1223
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1224 err_page = clcf->error_pages->elts;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1225 for (i = 0; i < clcf->error_pages->nelts; i++) {
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1226 if (err_page[i].status == (ngx_int_t) u->headers_in.status_n) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1227
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1228 if (u->headers_in.status_n == NGX_HTTP_UNAUTHORIZED) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1229
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1230 r->headers_out.www_authenticate =
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1231 ngx_list_push(&r->headers_out.headers);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1232
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1233 if (r->headers_out.www_authenticate == NULL) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1234 ngx_http_upstream_finalize_request(r, u,
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1235 NGX_HTTP_INTERNAL_SERVER_ERROR);
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1236 return;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1237 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1238
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1239 *r->headers_out.www_authenticate =
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1240 *u->headers_in.www_authenticate;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1241 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1242
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1243 ngx_http_upstream_finalize_request(r, u,
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1244 u->headers_in.status_n);
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1245 return;
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1246 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1247 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1248 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1249 }
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1250
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1251 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1252
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
1253 if (u->headers_in.x_accel_redirect) {
244
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1254
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1255 ngx_http_upstream_finalize_request(r, u, NGX_DECLINED);
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1256
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
1257 part = &u->headers_in.headers.part;
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1258 h = part->elts;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1259
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1260 for (i = 0; /* void */; i++) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1261
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1262 if (i >= part->nelts) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1263 if (part->next == NULL) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1264 break;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1265 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1266
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1267 part = part->next;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1268 h = part->elts;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1269 i = 0;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1270 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1271
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1272 hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1273 h[i].lowcase_key, h[i].key.len);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1274
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1275 if (hh && hh->redirect) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1276 if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {
250
fbf2b2f66c9f nginx 0.4.10
Igor Sysoev <http://sysoev.ru>
parents: 248
diff changeset
1277 ngx_http_finalize_request(r,
244
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1278 NGX_HTTP_INTERNAL_SERVER_ERROR);
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1279 return;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1280 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1281 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1282 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1283
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
1284 uri = &u->headers_in.x_accel_redirect->value;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1285 args.len = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1286 args.data = NULL;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1287 flags = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1288
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1289 if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {
244
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1290 ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1291 return;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1292 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1293
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1294 if (flags & NGX_HTTP_ZERO_IN_URI) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1295 r->zero_in_uri = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1296 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1297
202
ca5f86d94316 nginx 0.3.48
Igor Sysoev <http://sysoev.ru>
parents: 200
diff changeset
1298 if (r->method != NGX_HTTP_HEAD) {
ca5f86d94316 nginx 0.3.48
Igor Sysoev <http://sysoev.ru>
parents: 200
diff changeset
1299 r->method = NGX_HTTP_GET;
ca5f86d94316 nginx 0.3.48
Igor Sysoev <http://sysoev.ru>
parents: 200
diff changeset
1300 }
ca5f86d94316 nginx 0.3.48
Igor Sysoev <http://sysoev.ru>
parents: 200
diff changeset
1301
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1302 ngx_http_internal_redirect(r, uri, &args);
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1303 return;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1304 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
1305
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
1306 part = &u->headers_in.headers.part;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1307 h = part->elts;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1308
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1309 for (i = 0; /* void */; i++) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1310
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1311 if (i >= part->nelts) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1312 if (part->next == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1313 break;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1314 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1315
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1316 part = part->next;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1317 h = part->elts;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1318 i = 0;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1319 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1320
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1321 if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash,
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1322 h[i].lowcase_key, h[i].key.len))
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1323 {
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1324 continue;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1325 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1326
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1327 hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash,
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1328 h[i].lowcase_key, h[i].key.len);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1329
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1330 if (hh) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1331 if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1332 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1333 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1334 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1335 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1336
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1337 continue;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1338 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1339
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1340 if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1341 ngx_http_upstream_finalize_request(r, u,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1342 NGX_HTTP_INTERNAL_SERVER_ERROR);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1343 return;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1344 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1345 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1346
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1347 if (r->headers_out.server && r->headers_out.server->value.data == NULL) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1348 r->headers_out.server->hash = 0;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1349 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1350
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1351 if (r->headers_out.date && r->headers_out.date->value.data == NULL) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1352 r->headers_out.date->hash = 0;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1353 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1354
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1355 r->headers_out.status = u->headers_in.status_n;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1356 r->headers_out.status_line = u->headers_in.status_line;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
1357
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
1358 u->headers_in.content_length_n = r->headers_out.content_length_n;
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
1359
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1360 if (r->headers_out.content_length_n != -1) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1361 u->length = (size_t) r->headers_out.content_length_n;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1362
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1363 } else {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1364 u->length = NGX_MAX_SIZE_T_VALUE;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1365 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1366
248
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1367 if (!r->subrequest_in_memory) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1368 ngx_http_upstream_send_response(r, u);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1369 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1370 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1371
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1372 /* subrequest content in memory */
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1373
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1374 if (u->input_filter == NULL) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1375 u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1376 u->input_filter = ngx_http_upstream_non_buffered_filter;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1377 u->input_filter_ctx = r;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1378 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1379
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1380 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1381 ngx_http_upstream_finalize_request(r, u,
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1382 NGX_HTTP_INTERNAL_SERVER_ERROR);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1383 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1384 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1385
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1386 if (u->buffer.last - u->buffer.pos >= (ssize_t) u->length) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1387 if (u->input_filter(u->input_filter_ctx, 0) == NGX_ERROR) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1388 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1389 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1390 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1391
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1392 ngx_http_upstream_finalize_request(r, u, 0);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1393 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1394 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1395
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1396 rev->handler = ngx_http_upstream_process_body_in_memory;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1397
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1398 ngx_http_upstream_process_body_in_memory(rev);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1399 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1400
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1401
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1402 static ngx_int_t
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1403 ngx_http_upstream_test_connect(ngx_connection_t *c)
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1404 {
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1405 int err;
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1406 socklen_t len;
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1407
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1408 #if (NGX_HAVE_KQUEUE)
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1409
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1410 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1411 if (c->write->pending_eof) {
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
1412 c->log->action = "connecting to upstream";
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1413 (void) ngx_connection_error(c, c->write->kq_errno,
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1414 "kevent() reported that connect() failed");
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1415 return NGX_ERROR;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1416 }
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1417
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1418 } else
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1419 #endif
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1420 {
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1421 err = 0;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1422 len = sizeof(int);
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1423
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1424 /*
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1425 * BSDs and Linux return 0 and set a pending error in err
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1426 * Solaris returns -1 and sets errno
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1427 */
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1428
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1429 if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1430 == -1)
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1431 {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1432 err = ngx_errno;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1433 }
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1434
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1435 if (err) {
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
1436 c->log->action = "connecting to upstream";
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1437 (void) ngx_connection_error(c, err, "connect() failed");
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1438 return NGX_ERROR;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
1439 }
294
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1440 }
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1441
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1442 return NGX_OK;
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1443 }
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1444
27d9d1f26b38 nginx 0.5.17
Igor Sysoev <http://sysoev.ru>
parents: 292
diff changeset
1445
248
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1446 static void
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1447 ngx_http_upstream_process_body_in_memory(ngx_event_t *rev)
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1448 {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1449 size_t size;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1450 ssize_t n;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1451 ngx_buf_t *b;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1452 ngx_connection_t *c;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1453 ngx_http_request_t *r;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1454 ngx_http_upstream_t *u;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1455
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1456 c = rev->data;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1457 r = c->data;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1458 u = r->upstream;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1459
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1460 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1461 "http upstream process body on memory");
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1462
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1463 if (rev->timedout) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1464 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1465 ngx_http_upstream_finalize_request(r, u, NGX_ETIMEDOUT);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1466 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1467 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1468
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1469 b = &u->buffer;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1470
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1471 for ( ;; ) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1472
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1473 size = b->end - b->last;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1474
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1475 if (size == 0) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1476 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1477 "upstream buffer is too small to read repsonse");
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1478 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1479 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1480 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1481
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1482 n = c->recv(c, b->last, size);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1483
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1484 if (n == NGX_AGAIN) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1485 break;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1486 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1487
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1488 if (n == 0 || n == NGX_ERROR) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1489 ngx_http_upstream_finalize_request(r, u, n);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1490 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1491 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1492
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1493 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1494 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1495 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1496 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1497
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1498 if (!rev->ready) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1499 break;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1500 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1501 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1502
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1503 if (ngx_handle_read_event(rev, 0) == NGX_ERROR) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1504 ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1505 return;
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1506 }
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1507
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1508 if (rev->active) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1509 ngx_add_timer(rev, u->conf->read_timeout);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1510
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1511 } else if (rev->timer_set) {
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1512 ngx_del_timer(rev);
acd2ec3541cb nginx 0.4.9
Igor Sysoev <http://sysoev.ru>
parents: 244
diff changeset
1513 }
230
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1514 }
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1515
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1516
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1517 static void
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1518 ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1519 {
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1520 int tcp_nodelay;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1521 ssize_t size;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1522 ngx_int_t rc;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1523 ngx_event_pipe_t *p;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1524 ngx_connection_t *c;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1525 ngx_pool_cleanup_t *cl;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1526 ngx_pool_cleanup_file_t *clf;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1527 ngx_http_core_loc_conf_t *clcf;
38e7b94d63ac nginx 0.4.0
Igor Sysoev <http://sysoev.ru>
parents: 224
diff changeset
1528
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1529 rc = ngx_http_send_header(r);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1530
274
052a7b1d40e5 nginx 0.5.7
Igor Sysoev <http://sysoev.ru>
parents: 266
diff changeset
1531 if (rc == NGX_ERROR || rc > NGX_OK || r->post_action || r->header_only) {
34
aab2ea7c0458 nginx 0.1.17
Igor Sysoev <http://sysoev.ru>
parents: 32
diff changeset
1532 ngx_http_upstream_finalize_request(r, u, rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1533 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1534 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1535
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1536 u->header_sent = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1537
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
1538 if (r->request_body && r->request_body->temp_file) {
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1539 for (cl = r->pool->cleanup; cl; cl = cl->next) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1540 if (cl->handler == ngx_pool_cleanup_file) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1541 clf = cl->data;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1542
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1543 if (clf->fd == r->request_body->temp_file->file.fd) {
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1544 cl->handler(clf);
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1545 cl->handler = NULL;
208
b12b3b1a9426 nginx 0.3.51
Igor Sysoev <http://sysoev.ru>
parents: 206
diff changeset
1546 r->request_body->temp_file->file.fd = NGX_INVALID_FILE;
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1547 break;
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1548 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1549 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1550 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1551 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
1552
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1553 c = r->connection;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1554
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1555 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1556
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
1557 if (!u->buffering) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1558
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1559 if (u->input_filter == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1560 u->input_filter_init = ngx_http_upstream_non_buffered_filter_init;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1561 u->input_filter = ngx_http_upstream_non_buffered_filter;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1562 u->input_filter_ctx = r;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1563 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1564
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1565 u->peer.connection->read->handler =
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1566 ngx_http_upstream_process_non_buffered_body;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1567 r->write_event_handler =
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1568 ngx_http_upstream_process_non_buffered_downstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1569
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1570 r->limit_rate = 0;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1571
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1572 if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1573 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1574 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1575 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1576
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1577 if (clcf->tcp_nodelay && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1578 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1579
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1580 tcp_nodelay = 1;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1581
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1582 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1583 (const void *) &tcp_nodelay, sizeof(int)) == -1)
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1584 {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1585 ngx_connection_error(c, ngx_socket_errno,
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1586 "setsockopt(TCP_NODELAY) failed");
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1587 ngx_http_upstream_finalize_request(r, u, 0);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1588 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1589 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1590
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1591 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1592 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1593
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1594 size = u->buffer.last - u->buffer.pos;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1595
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1596 if (size) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1597 u->buffer.last = u->buffer.pos;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1598
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1599 if (u->input_filter(u->input_filter_ctx, size) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1600 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1601 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1602 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1603
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1604 ngx_http_upstream_process_non_buffered_body(c->write);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1605
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1606 } else {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1607 u->buffer.pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1608 u->buffer.last = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1609
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1610 if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1611 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1612 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1613 }
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
1614
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
1615 if (u->peer.connection->read->ready) {
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
1616 ngx_http_upstream_process_non_buffered_body(
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
1617 u->peer.connection->read);
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
1618 }
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1619 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1620
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1621 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1622 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1623
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1624 /* TODO: preallocate event_pipe bufs, look "Content-Length" */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1625
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1626 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1627
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1628 if (u->cache && u->cache->ctx.file.fd != NGX_INVALID_FILE) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1629 if (ngx_close_file(u->cache->ctx.file.fd) == NGX_FILE_ERROR) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1630 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1631 ngx_close_file_n " \"%s\" failed",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1632 u->cache->ctx.file.name.data);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1633 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1634 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1635
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
1636 if (u->cacheable) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1637 header = (ngx_http_cache_header_t *) u->buffer->start;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1638
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1639 header->expires = u->cache->ctx.expires;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1640 header->last_modified = u->cache->ctx.last_modified;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1641 header->date = u->cache->ctx.date;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1642 header->length = r->headers_out.content_length_n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1643 u->cache->ctx.length = r->headers_out.content_length_n;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1644
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1645 header->key_len = u->cache->ctx.key0.len;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1646 ngx_memcpy(&header->key, u->cache->ctx.key0.data, header->key_len);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1647 header->key[header->key_len] = LF;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1648 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1649
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1650 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1651
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1652 p = u->pipe;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1653
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1654 p->output_filter = (ngx_event_pipe_output_filter_pt) ngx_http_output_filter;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1655 p->output_ctx = r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1656 p->tag = u->output.tag;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1657 p->bufs = u->conf->bufs;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1658 p->busy_size = u->conf->busy_buffers_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1659 p->upstream = u->peer.connection;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1660 p->downstream = c;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1661 p->pool = r->pool;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1662 p->log = c->log;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1663
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
1664 p->cacheable = u->cacheable || u->store;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1665
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1666 p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1667 if (p->temp_file == NULL) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1668 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1669 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1670 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1671
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1672 p->temp_file->file.fd = NGX_INVALID_FILE;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1673 p->temp_file->file.log = c->log;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1674 p->temp_file->path = u->conf->temp_path;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1675 p->temp_file->pool = r->pool;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1676
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
1677 if (u->cacheable || u->store) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1678 p->temp_file->persistent = 1;
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
1679
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1680 } else {
216
fa32d59d9a15 nginx 0.3.55
Igor Sysoev <http://sysoev.ru>
parents: 214
diff changeset
1681 p->temp_file->log_level = NGX_LOG_WARN;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1682 p->temp_file->warn = "an upstream response is buffered "
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1683 "to a temporary file";
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1684 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1685
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1686 p->max_temp_file_size = u->conf->max_temp_file_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1687 p->temp_file_write_size = u->conf->temp_file_write_size;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1688
50
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1689 p->preread_bufs = ngx_alloc_chain_link(r->pool);
72eb30262aac nginx 0.1.25
Igor Sysoev <http://sysoev.ru>
parents: 36
diff changeset
1690 if (p->preread_bufs == NULL) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1691 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1692 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1693 }
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
1694
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1695 p->preread_bufs->buf = &u->buffer;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1696 p->preread_bufs->next = NULL;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1697 u->buffer.recycled = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1698
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1699 p->preread_size = u->buffer.last - u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1700
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
1701 if (u->cacheable) {
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
1702
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1703 p->buf_to_file = ngx_calloc_buf(r->pool);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1704 if (p->buf_to_file == NULL) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1705 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1706 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1707 }
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
1708
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1709 p->buf_to_file->pos = u->buffer.start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1710 p->buf_to_file->last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1711 p->buf_to_file->temporary = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1712 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1713
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1714 if (ngx_event_flags & NGX_USE_AIO_EVENT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1715 /* the posted aio operation may currupt a shadow buffer */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1716 p->single_buf = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1717 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1718
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1719 /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1720 p->free_bufs = 1;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1721
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1722 /*
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1723 * event_pipe would do u->buffer.last += p->preread_size
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1724 * as though these bytes were read
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1725 */
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1726 u->buffer.last = u->buffer.pos;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1727
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1728 if (u->conf->cyclic_temp_file) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1729
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1730 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1731 * we need to disable the use of sendfile() if we use cyclic temp file
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1732 * because the writing a new data may interfere with sendfile()
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1733 * that uses the same kernel file pages (at least on FreeBSD)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1734 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1735
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1736 p->cyclic_temp_file = 1;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1737 c->sendfile = 0;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1738
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1739 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1740 p->cyclic_temp_file = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1741 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1742
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1743 p->read_timeout = u->conf->read_timeout;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1744 p->send_timeout = clcf->send_timeout;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1745 p->send_lowat = clcf->send_lowat;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1746
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1747 u->peer.connection->read->handler = ngx_http_upstream_process_body;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1748 r->write_event_handler = ngx_http_upstream_process_downstream;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1749
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1750 ngx_http_upstream_process_body(u->peer.connection->read);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1751 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1752
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1753
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1754 static void
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1755 ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1756 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1757 ngx_http_upstream_process_non_buffered_body(r->connection->write);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1758 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1759
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1760
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1761 static void
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1762 ngx_http_upstream_process_non_buffered_body(ngx_event_t *ev)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1763 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1764 size_t size;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1765 ssize_t n;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1766 ngx_buf_t *b;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1767 ngx_int_t rc;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1768 ngx_uint_t do_write;
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1769 ngx_connection_t *c, *downstream, *upstream;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1770 ngx_http_request_t *r;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1771 ngx_http_upstream_t *u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1772 ngx_http_core_loc_conf_t *clcf;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1773
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1774 c = ev->data;
244
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1775 r = c->data;
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1776 u = r->upstream;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1777
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1778 if (ev->write) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1779 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1780 "http upstream process non buffered downstream");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1781 c->log->action = "sending to client";
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1782
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1783 } else {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1784 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1785 "http upstream process non buffered upstream");
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1786 c->log->action = "reading upstream";
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1787 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1788
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1789 if (ev->timedout) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1790 if (ev->write) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1791 c->timedout = 1;
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1792 ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1793
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1794 } else {
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
1795 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1796 }
244
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1797
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1798 ngx_http_upstream_finalize_request(r, u, 0);
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
1799 return;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1800 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1801
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1802 downstream = r->connection;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1803 upstream = u->peer.connection;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1804
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1805 b = &u->buffer;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1806
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1807 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1808
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
1809 do_write = ev->write || u->length == 0;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1810
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1811 for ( ;; ) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1812
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1813 if (do_write) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1814
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1815 if (u->out_bufs || u->busy_bufs) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1816 rc = ngx_http_output_filter(r, u->out_bufs);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1817
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1818 if (downstream->destroyed) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1819 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1820 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1821
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1822 if (rc == NGX_ERROR) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1823 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1824 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1825 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1826
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1827 ngx_chain_update_chains(&u->free_bufs, &u->busy_bufs,
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1828 &u->out_bufs, u->output.tag);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1829 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1830
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1831 if (u->busy_bufs == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1832
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1833 if (u->length == 0
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1834 || upstream->read->eof
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1835 || upstream->read->error)
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1836 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1837 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1838 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1839 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1840
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1841 b->pos = b->start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1842 b->last = b->start;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1843 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1844 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1845
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1846 size = b->end - b->last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1847
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1848 if (size > u->length) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1849 size = u->length;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1850 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1851
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1852 if (size && upstream->read->ready) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1853
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1854 n = upstream->recv(upstream, b->last, size);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1855
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1856 if (n == NGX_AGAIN) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1857 break;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1858 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1859
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1860 if (n > 0) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1861 if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1862 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1863 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1864 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1865 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1866
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1867 do_write = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1868
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1869 continue;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1870 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1871
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1872 break;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1873 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1874
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1875 if (downstream->data == r) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1876 if (ngx_handle_write_event(downstream->write, clcf->send_lowat)
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1877 == NGX_ERROR)
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1878 {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1879 ngx_http_upstream_finalize_request(r, u, 0);
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1880 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1881 }
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1882 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1883
276
c5c2b2883984 nginx 0.5.8
Igor Sysoev <http://sysoev.ru>
parents: 274
diff changeset
1884 if (downstream->write->active && !downstream->write->ready) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1885 ngx_add_timer(downstream->write, clcf->send_timeout);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1886
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1887 } else if (downstream->write->timer_set) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1888 ngx_del_timer(downstream->write);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1889 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1890
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1891 if (ngx_handle_read_event(upstream->read, 0) == NGX_ERROR) {
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1892 ngx_http_upstream_finalize_request(r, u, 0);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1893 return;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1894 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1895
276
c5c2b2883984 nginx 0.5.8
Igor Sysoev <http://sysoev.ru>
parents: 274
diff changeset
1896 if (upstream->read->active && !upstream->read->ready) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1897 ngx_add_timer(upstream->read, u->conf->read_timeout);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1898
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1899 } else if (upstream->read->timer_set) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
1900 ngx_del_timer(upstream->read);
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1901 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1902 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1903
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1904
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1905 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1906 ngx_http_upstream_non_buffered_filter_init(void *data)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1907 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1908 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1909 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1910
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1911
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1912 static ngx_int_t
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1913 ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes)
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1914 {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1915 ngx_http_request_t *r = data;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1916
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1917 ngx_buf_t *b;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1918 ngx_chain_t *cl, **ll;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1919 ngx_http_upstream_t *u;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1920
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1921 u = r->upstream;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1922
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1923 for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1924 ll = &cl->next;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1925 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1926
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1927 cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1928 if (cl == NULL) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1929 return NGX_ERROR;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1930 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1931
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1932 *ll = cl;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1933
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1934 cl->buf->flush = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1935 cl->buf->memory = 1;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1936
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1937 b = &u->buffer;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1938
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1939 cl->buf->pos = b->last;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1940 b->last += bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1941 cl->buf->last = b->last;
366
babd3d9efb62 nginx 0.6.27
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
1942 cl->buf->tag = u->output.tag;
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1943
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1944 if (u->length == NGX_MAX_SIZE_T_VALUE) {
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1945 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1946 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1947
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1948 u->length -= bytes;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1949
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1950 return NGX_OK;
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1951 }
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1952
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1953
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1954 static void
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1955 ngx_http_upstream_process_downstream(ngx_http_request_t *r)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1956 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1957 ngx_http_upstream_process_body(r->connection->write);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1958 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1959
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1960
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1961 static void
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
1962 ngx_http_upstream_process_body(ngx_event_t *ev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1963 {
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
1964 ngx_temp_file_t *tf;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
1965 ngx_event_pipe_t *p;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1966 ngx_connection_t *c, *downstream;
284
3dbecd747fbb nginx 0.5.12
Igor Sysoev <http://sysoev.ru>
parents: 276
diff changeset
1967 ngx_http_log_ctx_t *ctx;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1968 ngx_http_request_t *r;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1969 ngx_http_upstream_t *u;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1970
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1971 c = ev->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1972 r = c->data;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1973 u = r->upstream;
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
1974 downstream = r->connection;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1975
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1976 if (ev->write) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1977 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1978 "http upstream process downstream");
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1979 c->log->action = "sending to client";
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1980
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1981 } else {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1982 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1983 "http upstream process upstream");
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
1984 c->log->action = "reading upstream";
284
3dbecd747fbb nginx 0.5.12
Igor Sysoev <http://sysoev.ru>
parents: 276
diff changeset
1985
3dbecd747fbb nginx 0.5.12
Igor Sysoev <http://sysoev.ru>
parents: 276
diff changeset
1986 ctx = c->log->data;
3dbecd747fbb nginx 0.5.12
Igor Sysoev <http://sysoev.ru>
parents: 276
diff changeset
1987 ctx->current_request = r;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1988 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
1989
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
1990 p = u->pipe;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1991
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1992 if (ev->timedout) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1993 if (ev->write) {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1994 if (ev->delayed) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1995
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1996 ev->timedout = 0;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1997 ev->delayed = 0;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1998
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
1999 if (!ev->ready) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2000 ngx_add_timer(ev, p->send_timeout);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2001
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2002 if (ngx_handle_write_event(ev, p->send_lowat) == NGX_ERROR)
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2003 {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2004 ngx_http_upstream_finalize_request(r, u, 0);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2005 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2006 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2007
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2008 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2009 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2010
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2011 if (ngx_event_pipe(p, ev->write) == NGX_ABORT) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2012
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2013 if (downstream->destroyed) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2014 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2015 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2016
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2017 ngx_http_upstream_finalize_request(r, u, 0);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2018 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2019 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2020
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2021 } else {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2022 p->downstream_error = 1;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2023 c->timedout = 1;
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
2024 ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out");
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2025 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2026
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2027 } else {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2028 p->upstream_error = 1;
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 146
diff changeset
2029 ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2030 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2031
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2032 } else {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2033 if (ev->write && ev->delayed) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2034 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2035 "http downstream delayed");
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2036
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2037 if (ngx_handle_write_event(ev, p->send_lowat) == NGX_ERROR) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2038 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2039 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2040
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2041 return;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2042 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2043
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2044 if (ngx_event_pipe(p, ev->write) == NGX_ABORT) {
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2045
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2046 if (downstream->destroyed) {
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2047 return;
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2048 }
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2049
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2050 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2051 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2052 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2053 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2054
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2055 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2056
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2057 if (u->store) {
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2058
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2059 tf = u->pipe->temp_file;
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2060
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2061 if (p->upstream_eof
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2062 && u->headers_in.status_n == NGX_HTTP_OK
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2063 && (u->headers_in.content_length_n == -1
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2064 || (u->headers_in.content_length_n == tf->offset)))
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2065 {
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2066 ngx_http_upstream_store(r, u);
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2067
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2068 } else if ((p->upstream_error
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2069 || (p->upstream_eof
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2070 && u->headers_in.status_n != NGX_HTTP_OK))
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2071 && tf->file.fd != NGX_INVALID_FILE)
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2072 {
364
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2073 if (ngx_delete_file(tf->file.name.data) == NGX_FILE_ERROR) {
a39aab45a53f nginx 0.6.26
Igor Sysoev <http://sysoev.ru>
parents: 358
diff changeset
2074
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2075 ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2076 ngx_delete_file_n " \"%s\" failed",
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2077 u->pipe->temp_file->file.name.data);
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2078 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2079 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2080 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2081
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2082 #if (NGX_HTTP_FILE_CACHE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2083
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
2084 if (p->upstream_done && u->cacheable) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2085 if (ngx_http_cache_update(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2086 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2087 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2088 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2089 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2090
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
2091 } else if (p->upstream_eof && u->cacheable) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2092
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2093 /* TODO: check length & update cache */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2094
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2095 if (ngx_http_cache_update(r) == NGX_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2096 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2097 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2098 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2099 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2100 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2101
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2102 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2103
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2104 if (p->upstream_done || p->upstream_eof || p->upstream_error) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2105 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2106 "http upstream exit: %p", p->out);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2107 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2108 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2109 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2110 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2111 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2112 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2113 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2114
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2115 if (p->downstream_error) {
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2116 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2117 "http upstream downstream error");
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2118
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
2119 if (!u->cacheable && u->peer.connection) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2120 ngx_http_upstream_finalize_request(r, u, 0);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2121 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2122 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2123 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2124
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2125
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2126 static void
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2127 ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u)
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2128 {
370
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2129 size_t root;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2130 time_t lm;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2131 ngx_str_t path;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2132 ngx_temp_file_t *tf;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2133 ngx_ext_rename_file_t ext;
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2134
358
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
2135 tf = u->pipe->temp_file;
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
2136
9121a0a91f47 nginx 0.6.23
Igor Sysoev <http://sysoev.ru>
parents: 356
diff changeset
2137 if (tf->file.fd == NGX_INVALID_FILE) {
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2138
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2139 /* create file for empty 200 response */
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2140
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2141 tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2142 if (tf == NULL) {
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2143 return;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2144 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2145
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2146 tf->file.fd = NGX_INVALID_FILE;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2147 tf->file.log = r->connection->log;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2148 tf->path = u->conf->temp_path;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2149 tf->pool = r->pool;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2150 tf->persistent = 1;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2151
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2152 if (ngx_create_temp_file(&tf->file, tf->path, tf->pool,
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2153 tf->persistent, tf->clean, tf->access)
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2154 != NGX_OK)
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2155 {
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2156 return;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2157 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2158
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2159 u->pipe->temp_file = tf;
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2160 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2161
370
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2162 ext.access = u->conf->store_access;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2163 ext.time = -1;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2164 ext.create_path = 1;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2165 ext.delete_file = 1;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2166 ext.log = r->connection->log;
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2167
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2168 if (u->headers_in.last_modified) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2169
370
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2170 lm = ngx_http_parse_time(u->headers_in.last_modified->value.data,
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2171 u->headers_in.last_modified->value.len);
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2172
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2173 if (lm != NGX_ERROR) {
370
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2174 ext.time = lm;
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2175 ext.fd = tf->file.fd;
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2176 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2177 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2178
320
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2179 if (u->conf->store_lengths == NULL) {
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2180
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2181 ngx_http_map_uri_to_path(r, &path, &root, 0);
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2182
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2183 } else {
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2184 if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0,
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2185 u->conf->store_values->elts)
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2186 == NULL)
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2187 {
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2188 return;
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2189 }
95183808f549 nginx 0.6.4
Igor Sysoev <http://sysoev.ru>
parents: 318
diff changeset
2190 }
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2191
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2192 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
370
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2193 "upstream stores \"%s\" to \"%s\"",
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2194 tf->file.name.data, path.data);
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2195
9a242235a80a nginx 0.6.29
Igor Sysoev <http://sysoev.ru>
parents: 366
diff changeset
2196 (void) ngx_ext_rename_file(&tf->file.name, &path, &ext);
318
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2197 }
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2198
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2199
fc223117327f nginx 0.6.3
Igor Sysoev <http://sysoev.ru>
parents: 314
diff changeset
2200 static void
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2201 ngx_http_upstream_dummy_handler(ngx_event_t *wev)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2202 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2203 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2204 "http upstream dummy handler");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2205 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2206
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2207
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2208 static void
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2209 ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2210 ngx_uint_t ft_type)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2211 {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2212 ngx_uint_t status, state;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2213
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2214 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2215 "http next upstream, %xi", ft_type);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2216
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2217 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2218 ngx_http_busy_unlock(u->conf->busy_lock, &u->busy_lock);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2219 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2220
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
2221 if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2222 state = NGX_PEER_NEXT;
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
2223 } else {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2224 state = NGX_PEER_FAILED;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2225 }
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
2226
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
2227 if (ft_type != NGX_HTTP_UPSTREAM_FT_NOLIVE) {
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
2228 u->peer.free(&u->peer, u->peer.data, state);
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
2229 }
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
2230
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2231 if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2232 ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2233 "upstream timed out");
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2234 }
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2235
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2236 if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2237 status = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2238
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2239 } else {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2240 switch(ft_type) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2241
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2242 case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2243 status = NGX_HTTP_GATEWAY_TIME_OUT;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2244 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2245
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2246 case NGX_HTTP_UPSTREAM_FT_HTTP_500:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2247 status = NGX_HTTP_INTERNAL_SERVER_ERROR;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2248 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2249
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2250 case NGX_HTTP_UPSTREAM_FT_HTTP_404:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2251 status = NGX_HTTP_NOT_FOUND;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2252 break;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2253
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2254 /*
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2255 * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2256 * never reach here
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2257 */
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2258
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2259 default:
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2260 status = NGX_HTTP_BAD_GATEWAY;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2261 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2262 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2263
132
91372f004adf nginx 0.3.13
Igor Sysoev <http://sysoev.ru>
parents: 130
diff changeset
2264 if (r->connection->error) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2265 ngx_http_upstream_finalize_request(r, u,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2266 NGX_HTTP_CLIENT_CLOSED_REQUEST);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2267 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2268 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2269
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2270 if (status) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2271 u->state->status = status;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2272
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
2273 if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type)) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2274
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2275 #if (NGX_HTTP_CACHE)
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2276
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2277 if (u->stale && (u->conf->use_stale & ft_type)) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2278 ngx_http_upstream_finalize_request(r, u,
74
77969b24f355 nginx 0.1.37
Igor Sysoev <http://sysoev.ru>
parents: 64
diff changeset
2279 ngx_http_send_cached_response(r));
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2280 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2281 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2282
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2283 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2284
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2285 ngx_http_upstream_finalize_request(r, u, status);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2286 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2287 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2288 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2289
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2290 if (u->peer.connection) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2291 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2292 "close http upstream connection: %d",
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2293 u->peer.connection->fd);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2294 #if (NGX_HTTP_SSL)
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2295
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2296 if (u->peer.connection->ssl) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2297 u->peer.connection->ssl->no_wait_shutdown = 1;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2298 u->peer.connection->ssl->no_send_shutdown = 1;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2299
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2300 (void) ngx_ssl_shutdown(u->peer.connection);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2301 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2302 #endif
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2303
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2304 ngx_close_connection(u->peer.connection);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2305 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2306
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2307 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2308 if (u->conf->busy_lock && !u->busy_locked) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2309 ngx_http_upstream_busy_lock(p);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2310 return;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2311 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2312 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2313
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2314 ngx_http_upstream_connect(r, u);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2315 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2316
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2317
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2318 static void
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2319 ngx_http_upstream_cleanup(void *data)
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2320 {
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2321 ngx_http_request_t *r = data;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2322
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2323 ngx_http_upstream_t *u;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2324
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2325 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2326 "cleanup http upstream request: \"%V\"", &r->uri);
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2327
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2328 u = r->upstream;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2329
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2330 if (u->resolved && u->resolved->ctx) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2331 ngx_resolve_name_done(u->resolved->ctx);
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2332 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2333
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
2334 ngx_http_upstream_finalize_request(r, u, NGX_DONE);
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2335 }
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2336
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2337
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2338 static void
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2339 ngx_http_upstream_finalize_request(ngx_http_request_t *r,
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2340 ngx_http_upstream_t *u, ngx_int_t rc)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2341 {
262
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
2342 ngx_time_t *tp;
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2343
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2344 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2345 "finalize http upstream request: %i", rc);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2346
118
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2347 *u->cleanup = NULL;
644a7935144b nginx 0.3.6
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
2348
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2349 if (u->state && u->state->response_sec) {
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2350 tp = ngx_timeofday();
262
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
2351 u->state->response_sec = tp->sec - u->state->response_sec;
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
2352 u->state->response_msec = tp->msec - u->state->response_msec;
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2353 }
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2354
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2355 u->finalize_request(r, rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2356
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2357 if (u->peer.free) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2358 u->peer.free(&u->peer, u->peer.data, 0);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2359 }
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2360
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2361 if (u->peer.connection) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2362
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2363 #if (NGX_HTTP_SSL)
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2364
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2365 /* TODO: do not shutdown persistent connection */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2366
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2367 if (u->peer.connection->ssl) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2368
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2369 /*
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2370 * We send the "close notify" shutdown alert to the upstream only
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2371 * and do not wait its "close notify" shutdown alert.
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2372 * It is acceptable according to the TLS standard.
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2373 */
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2374
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2375 u->peer.connection->ssl->no_wait_shutdown = 1;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2376
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2377 (void) ngx_ssl_shutdown(u->peer.connection);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2378 }
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2379 #endif
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2380
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2381 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2382 "close http upstream connection: %d",
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2383 u->peer.connection->fd);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2384
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2385 ngx_close_connection(u->peer.connection);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2386 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2387
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2388 u->peer.connection = NULL;
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2389
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
2390 if (u->header_sent && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2391 {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2392 rc = 0;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2393 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2394
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2395 if (u->pipe && u->pipe->temp_file) {
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2396 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2397 "http upstream temp fd: %d",
130
82d695e3d662 nginx 0.3.12
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
2398 u->pipe->temp_file->file.fd);
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2399 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2400
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2401 #if 0
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2402 if (u->cache) {
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2403 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2404 "http upstream cache fd: %d",
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2405 u->cache->ctx.file.fd);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2406 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2407 #endif
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2408
64
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
2409 if (rc == NGX_DECLINED) {
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
2410 return;
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
2411 }
5db440287648 nginx 0.1.32
Igor Sysoev <http://sysoev.ru>
parents: 60
diff changeset
2412
32
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2413 r->connection->log->action = "sending to client";
da8c190bdaba nginx 0.1.16
Igor Sysoev <http://sysoev.ru>
parents: 30
diff changeset
2414
314
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2415 if (rc == 0) {
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2416 if (r == r->main) {
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2417 if (!r->post_action) {
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2418 rc = ngx_http_send_special(r, NGX_HTTP_LAST);
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2419 }
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2420
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2421 } else {
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2422 if (r->out) {
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2423 rc = NGX_AGAIN;
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2424 }
d5ec0be9c835 nginx 0.6.1
Igor Sysoev <http://sysoev.ru>
parents: 310
diff changeset
2425 }
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2426 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2427
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2428 ngx_http_finalize_request(r, rc);
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2429 }
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2430
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2431
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2432 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2433 ngx_http_upstream_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
2434 ngx_uint_t offset)
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2435 {
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2436 ngx_table_elt_t **ph;
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2437
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2438 ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2439
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2440 if (*ph == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2441 *ph = h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2442 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2443
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2444 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2445 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2446
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2447
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2448 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2449 ngx_http_upstream_process_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2450 ngx_table_elt_t *h, ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2451 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2452 ngx_array_t *pa;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2453 ngx_table_elt_t **ph;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2454
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2455 pa = (ngx_array_t *) ((char *) &r->upstream->headers_in + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2456
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2457 if (pa->elts == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2458 if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2459 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2460 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2461 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2462 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2463
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2464 ph = ngx_array_push(pa);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2465 if (ph == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2466 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2467 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2468
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2469 *ph = h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2470
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2471 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2472 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2473
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2474
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2475 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2476 ngx_http_upstream_ignore_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
2477 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2478 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2479 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2480 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2481
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2482
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2483 static ngx_int_t
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2484 ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2485 ngx_uint_t offset)
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 122
diff changeset
2486 {
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2487 ngx_int_t n;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2488
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2489 r->upstream->headers_in.x_accel_limit_rate = h;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2490
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2491 n = ngx_atoi(h->value.data, h->value.len);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2492
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2493 if (n != NGX_ERROR) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2494 r->limit_rate = (size_t) n;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2495 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2496
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2497 return NGX_OK;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2498 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2499
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2500
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents: 74
diff changeset
2501 static ngx_int_t
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2502 ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h,
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2503 ngx_uint_t offset)
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2504 {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2505 u_char c0, c1, c2;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2506
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2507 if (r->upstream->conf->change_buffering) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2508
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2509 if (h->value.len == 2) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2510 c0 = ngx_tolower(h->value.data[0]);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2511 c1 = ngx_tolower(h->value.data[1]);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2512
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2513 if (c0 == 'n' && c1 == 'o') {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2514 r->upstream->buffering = 0;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2515 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2516
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2517 } else if (h->value.len == 3) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2518 c0 = ngx_tolower(h->value.data[0]);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2519 c1 = ngx_tolower(h->value.data[1]);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2520 c2 = ngx_tolower(h->value.data[2]);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2521
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2522 if (c0 == 'y' && c1 == 'e' && c2 == 's') {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2523 r->upstream->buffering = 1;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2524 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2525 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2526 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2527
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2528 return NGX_OK;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2529 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2530
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2531
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
2532 static ngx_int_t
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2533 ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h,
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2534 ngx_uint_t offset)
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2535 {
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2536 r->headers_out.override_charset = &h->value;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2537
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2538 return NGX_OK;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2539 }
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2540
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2541
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2542 static ngx_int_t
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2543 ngx_http_upstream_copy_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
2544 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2545 {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2546 ngx_table_elt_t *ho, **ph;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2547
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2548 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2549 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2550 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2551 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2552
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2553 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2554
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2555 if (offset) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2556 ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2557 *ph = ho;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2558 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2559
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2560 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2561 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2562
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2563
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2564 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2565 ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2566 ngx_table_elt_t *h, ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2567 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2568 ngx_array_t *pa;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2569 ngx_table_elt_t *ho, **ph;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2570
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2571 pa = (ngx_array_t *) ((char *) &r->headers_out + offset);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2572
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2573 if (pa->elts == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2574 if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *)) != NGX_OK)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2575 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2576 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2577 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2578 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2579
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2580 ph = ngx_array_push(pa);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2581 if (ph == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2582 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2583 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2584
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2585 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2586 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2587 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2588 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2589
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2590 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2591 *ph = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2592
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2593 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2594 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2595
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2596
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2597 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2598 ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2599 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2600 {
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2601 u_char *p, *last;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2602
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2603 r->headers_out.content_type_len = h->value.len;
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2604 r->headers_out.content_type = h->value;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2605
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2606 for (p = h->value.data; *p; p++) {
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2607
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2608 if (*p != ';') {
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2609 continue;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2610 }
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2611
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2612 last = p;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2613
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2614 while (*++p == ' ') { /* void */ }
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2615
372
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
2616 if (*p == '\0') {
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
2617 return NGX_OK;
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
2618 }
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
2619
286
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 284
diff changeset
2620 if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) {
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2621 continue;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2622 }
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2623
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2624 p += 8;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2625
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2626 r->headers_out.content_type_len = last - h->value.data;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2627
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2628 r->headers_out.charset.len = h->value.data + h->value.len - p;
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2629 r->headers_out.charset.data = p;
292
92402f034b28 nginx 0.5.16
Igor Sysoev <http://sysoev.ru>
parents: 286
diff changeset
2630
92402f034b28 nginx 0.5.16
Igor Sysoev <http://sysoev.ru>
parents: 286
diff changeset
2631 return NGX_OK;
206
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2632 }
3866d57d9cfd nginx 0.3.50
Igor Sysoev <http://sysoev.ru>
parents: 202
diff changeset
2633
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2634 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2635 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2636
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2637
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2638 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2639 ngx_http_upstream_copy_content_length(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2640 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2641 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2642 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2643
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2644 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2645 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2646 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2647 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2648
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2649 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2650
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2651 r->headers_out.content_length = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2652 r->headers_out.content_length_n = ngx_atoof(h->value.data, h->value.len);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2653
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2654 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2655 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2656
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2657
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2658 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2659 ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2660 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2661 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2662 ngx_int_t rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2663 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2664
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2665 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2666 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2667 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2668 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2669
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2670 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2671
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2672 if (r->upstream->rewrite_redirect) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2673 rc = r->upstream->rewrite_redirect(r, ho, 0);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2674
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2675 if (rc == NGX_DECLINED) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2676 return NGX_OK;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2677 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2678
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2679 if (rc == NGX_OK) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2680 r->headers_out.location = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2681
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2682 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2683 "rewritten location: \"%V\"", &ho->value);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2684 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2685
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2686 return rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2687 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2688
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2689 if (ho->value.data[0] != '/') {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2690 r->headers_out.location = ho;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2691 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2692
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2693 /*
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2694 * we do not set r->headers_out.location here to avoid the handling
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2695 * the local redirects without a host name by ngx_http_header_filter()
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2696 */
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2697
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2698 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2699 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2700
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2701
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2702 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2703 ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2704 ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2705 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2706 u_char *p;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2707 ngx_int_t rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2708 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2709
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2710 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2711 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2712 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2713 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2714
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2715 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2716
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2717 if (r->upstream->rewrite_redirect) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2718
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
2719 p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1);
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2720
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2721 if (p) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2722 rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2723
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2724 } else {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2725 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2726 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2727
78
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2728 if (rc == NGX_DECLINED) {
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2729 return NGX_OK;
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2730 }
9db7e0b5b27f nginx 0.1.39
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
2731
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2732 if (rc == NGX_OK) {
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2733 r->headers_out.refresh = ho;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2734
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2735 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2736 "rewritten refresh: \"%V\"", &ho->value);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2737 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2738
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2739 return rc;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2740 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2741
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2742 r->headers_out.refresh = ho;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 346
diff changeset
2743
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2744 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2745 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2746
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2747
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2748 #if (NGX_HTTP_GZIP)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2749
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2750 static ngx_int_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2751 ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2752 ngx_table_elt_t *h, ngx_uint_t offset)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2753 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2754 ngx_table_elt_t *ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2755
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2756 ho = ngx_list_push(&r->headers_out.headers);
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2757 if (ho == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2758 return NGX_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2759 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2760
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2761 *ho = *h;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2762
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2763 r->headers_out.content_encoding = ho;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2764
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2765 return NGX_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2766 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2767
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2768 #endif
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2769
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2770
36
a39d1b793287 nginx 0.1.18
Igor Sysoev <http://sysoev.ru>
parents: 34
diff changeset
2771 static ngx_int_t
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2772 ngx_http_upstream_add_variables(ngx_conf_t *cf)
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2773 {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
2774 ngx_http_variable_t *var, *v;
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2775
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2776 for (v = ngx_http_upstream_vars; v->name.len; v++) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2777 var = ngx_http_add_variable(cf, &v->name, v->flags);
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2778 if (var == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2779 return NGX_ERROR;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2780 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2781
186
54aabf2b0bc6 nginx 0.3.40
Igor Sysoev <http://sysoev.ru>
parents: 178
diff changeset
2782 var->get_handler = v->get_handler;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2783 var->data = v->data;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2784 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2785
28
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2786 return NGX_OK;
7ca9bdc82b3f nginx 0.1.14
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2787 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2788
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
2789
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2790 static ngx_int_t
298
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2791 ngx_http_upstream_addr_variable(ngx_http_request_t *r,
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2792 ngx_http_variable_value_t *v, uintptr_t data)
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2793 {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2794 u_char *p;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2795 size_t len;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2796 ngx_uint_t i;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2797 ngx_http_upstream_state_t *state;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2798
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2799 v->valid = 1;
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
2800 v->no_cacheable = 0;
298
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2801 v->not_found = 0;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2802
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2803 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2804 v->not_found = 1;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2805 return NGX_OK;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2806 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2807
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2808 len = 0;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2809 state = r->upstream_states->elts;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2810
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2811 for (i = 0; i < r->upstream_states->nelts; i++) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2812 if (state[i].peer) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2813 len += state[i].peer->len + 2;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2814
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2815 } else {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2816 len += 3;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2817 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2818 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2819
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 372
diff changeset
2820 p = ngx_pnalloc(r->pool, len);
298
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2821 if (p == NULL) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2822 return NGX_ERROR;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2823 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2824
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2825 v->data = p;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2826
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2827 i = 0;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2828
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2829 for ( ;; ) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2830 if (state[i].peer) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2831 p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len);
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2832 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2833
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2834 if (++i == r->upstream_states->nelts) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2835 break;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2836 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2837
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2838 if (state[i].peer) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2839 *p++ = ',';
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2840 *p++ = ' ';
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2841
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2842 } else {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2843 *p++ = ' ';
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2844 *p++ = ':';
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2845 *p++ = ' ';
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2846
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2847 if (++i == r->upstream_states->nelts) {
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2848 break;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2849 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2850
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2851 continue;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2852 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2853 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2854
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2855 v->len = p - v->data;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2856
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2857 return NGX_OK;
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2858 }
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2859
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2860
30862655219e nginx 0.5.19
Igor Sysoev <http://sysoev.ru>
parents: 296
diff changeset
2861 static ngx_int_t
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2862 ngx_http_upstream_status_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2863 ngx_http_variable_value_t *v, uintptr_t data)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2864 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2865 u_char *p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2866 size_t len;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2867 ngx_uint_t i;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2868 ngx_http_upstream_state_t *state;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2869
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2870 v->valid = 1;
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
2871 v->no_cacheable = 0;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2872 v->not_found = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2873
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2874 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2875 v->not_found = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2876 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2877 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2878
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2879 len = r->upstream_states->nelts * (3 + 2);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2880
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 372
diff changeset
2881 p = ngx_pnalloc(r->pool, len);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2882 if (p == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2883 return NGX_ERROR;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2884 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2885
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2886 v->data = p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2887
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2888 i = 0;
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2889 state = r->upstream_states->elts;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2890
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2891 for ( ;; ) {
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2892 if (state[i].status) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2893 p = ngx_sprintf(p, "%ui", state[i].status);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2894
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2895 } else {
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2896 *p++ = '-';
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2897 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2898
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2899 if (++i == r->upstream_states->nelts) {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2900 break;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2901 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2902
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2903 if (state[i].peer) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2904 *p++ = ',';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2905 *p++ = ' ';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2906
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2907 } else {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2908 *p++ = ' ';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2909 *p++ = ':';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2910 *p++ = ' ';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2911
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2912 if (++i == r->upstream_states->nelts) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2913 break;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2914 }
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2915
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2916 continue;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2917 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2918 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2919
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2920 v->len = p - v->data;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2921
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2922 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2923 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2924
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2925
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2926 static ngx_int_t
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2927 ngx_http_upstream_response_time_variable(ngx_http_request_t *r,
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2928 ngx_http_variable_value_t *v, uintptr_t data)
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2929 {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2930 u_char *p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2931 size_t len;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2932 ngx_uint_t i;
262
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
2933 ngx_msec_int_t ms;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2934 ngx_http_upstream_state_t *state;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2935
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2936 v->valid = 1;
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
2937 v->no_cacheable = 0;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2938 v->not_found = 0;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2939
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2940 if (r->upstream_states == NULL || r->upstream_states->nelts == 0) {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2941 v->not_found = 1;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2942 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2943 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2944
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2945 len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2946
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 372
diff changeset
2947 p = ngx_pnalloc(r->pool, len);
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2948 if (p == NULL) {
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2949 return NGX_ERROR;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2950 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2951
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2952 v->data = p;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2953
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2954 i = 0;
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2955 state = r->upstream_states->elts;
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2956
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2957 for ( ;; ) {
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2958 if (state[i].status) {
346
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
2959 ms = (ngx_msec_int_t)
05693816539c nginx 0.6.17
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
2960 (state[i].response_sec * 1000 + state[i].response_msec);
262
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
2961 ms = (ms >= 0) ? ms : 0;
e0b1d0a6c629 nginx 0.5.1
Igor Sysoev <http://sysoev.ru>
parents: 260
diff changeset
2962 p = ngx_sprintf(p, "%d.%03d", ms / 1000, ms % 1000);
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2963
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2964 } else {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2965 *p++ = '-';
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2966 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2967
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2968 if (++i == r->upstream_states->nelts) {
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2969 break;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2970 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2971
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2972 if (state[i].peer) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2973 *p++ = ',';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2974 *p++ = ' ';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2975
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2976 } else {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2977 *p++ = ' ';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2978 *p++ = ':';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2979 *p++ = ' ';
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2980
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2981 if (++i == r->upstream_states->nelts) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2982 break;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2983 }
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2984
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2985 continue;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2986 }
122
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2987 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2988
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2989 v->len = p - v->data;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2990
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2991 return NGX_OK;
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2992 }
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2993
d25a1d6034f1 nginx 0.3.8
Igor Sysoev <http://sysoev.ru>
parents: 118
diff changeset
2994
296
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2995 ngx_int_t
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2996 ngx_http_upstream_header_variable(ngx_http_request_t *r,
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2997 ngx_http_variable_value_t *v, uintptr_t data)
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2998 {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
2999 if (r->upstream == NULL) {
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3000 v->not_found = 1;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3001 return NGX_OK;
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3002 }
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3003
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3004 return ngx_http_variable_unknown_header(v, (ngx_str_t *) data,
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3005 &r->upstream->headers_in.headers.part,
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3006 sizeof("upstream_http_") - 1);
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3007 }
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3008
2ceaee987f37 nginx 0.5.18
Igor Sysoev <http://sysoev.ru>
parents: 294
diff changeset
3009
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3010 static char *
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3011 ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3012 {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3013 char *rv;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3014 void *mconf;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3015 ngx_str_t *value;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3016 ngx_url_t u;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3017 ngx_uint_t m;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3018 ngx_conf_t pcf;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3019 ngx_http_module_t *module;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3020 ngx_http_conf_ctx_t *ctx, *http_ctx;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3021 ngx_http_upstream_srv_conf_t *uscf;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3022
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3023 ngx_memzero(&u, sizeof(ngx_url_t));
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3024
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3025 value = cf->args->elts;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3026 u.host = value[1];
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3027 u.no_resolve = 1;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3028
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3029 uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3030 |NGX_HTTP_UPSTREAM_WEIGHT
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3031 |NGX_HTTP_UPSTREAM_MAX_FAILS
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3032 |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3033 |NGX_HTTP_UPSTREAM_DOWN
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3034 |NGX_HTTP_UPSTREAM_BACKUP);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3035 if (uscf == NULL) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3036 return NGX_CONF_ERROR;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3037 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3038
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3039
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3040 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3041 if (ctx == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3042 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3043 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3044
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3045 http_ctx = cf->ctx;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3046 ctx->main_conf = http_ctx->main_conf;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3047
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3048 /* the upstream{}'s srv_conf */
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3049
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3050 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3051 if (ctx->srv_conf == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3052 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3053 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3054
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3055 ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3056
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3057 uscf->srv_conf = ctx->srv_conf;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3058
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3059
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3060 /* the upstream{}'s loc_conf */
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3061
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3062 ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3063 if (ctx->loc_conf == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3064 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3065 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3066
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3067 for (m = 0; ngx_modules[m]; m++) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3068 if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3069 continue;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3070 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3071
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3072 module = ngx_modules[m]->ctx;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3073
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3074 if (module->create_srv_conf) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3075 mconf = module->create_srv_conf(cf);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3076 if (mconf == NULL) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3077 return NGX_CONF_ERROR;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3078 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3079
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3080 ctx->srv_conf[ngx_modules[m]->ctx_index] = mconf;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3081 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3082
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3083 if (module->create_loc_conf) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3084 mconf = module->create_loc_conf(cf);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3085 if (mconf == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3086 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3087 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3088
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3089 ctx->loc_conf[ngx_modules[m]->ctx_index] = mconf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3090 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3091 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3092
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3093
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3094 /* parse inside upstream{} */
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3095
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3096 pcf = *cf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3097 cf->ctx = ctx;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3098 cf->cmd_type = NGX_HTTP_UPS_CONF;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3099
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3100 rv = ngx_conf_parse(cf, NULL);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3101
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3102 *cf = pcf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3103
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3104 if (rv != NGX_CONF_OK) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3105 return rv;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3106 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3107
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3108 if (uscf->servers == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3109 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3110 "no servers are inside upstream");
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3111 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3112 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3113
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3114 return rv;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3115 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3116
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3117
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3118 static char *
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3119 ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3120 {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3121 ngx_http_upstream_srv_conf_t *uscf = conf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3122
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3123 time_t fail_timeout;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3124 ngx_str_t *value, s;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3125 ngx_url_t u;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3126 ngx_int_t weight, max_fails;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3127 ngx_uint_t i;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3128 ngx_http_upstream_server_t *us;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3129
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3130 if (uscf->servers == NULL) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3131 uscf->servers = ngx_array_create(cf->pool, 4,
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3132 sizeof(ngx_http_upstream_server_t));
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3133 if (uscf->servers == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3134 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3135 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3136 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3137
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3138 us = ngx_array_push(uscf->servers);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3139 if (us == NULL) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3140 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3141 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3142
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3143 ngx_memzero(us, sizeof(ngx_http_upstream_server_t));
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3144
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3145 value = cf->args->elts;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3146
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3147 ngx_memzero(&u, sizeof(ngx_url_t));
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3148
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3149 u.url = value[1];
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3150 u.default_port = 80;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3151
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
3152 if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3153 if (u.err) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3154 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3155 "%s in upstream \"%V\"", u.err, &u.url);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3156 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3157
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3158 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3159 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3160
212
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3161 weight = 1;
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3162 max_fails = 1;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3163 fail_timeout = 10;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3164
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3165 for (i = 2; i < cf->args->nelts; i++) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3166
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3167 if (ngx_strncmp(value[i].data, "weight=", 7) == 0) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3168
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3169 if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3170 goto invalid;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3171 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3172
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3173 weight = ngx_atoi(&value[i].data[7], value[i].len - 7);
212
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3174
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3175 if (weight == NGX_ERROR || weight == 0) {
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3176 goto invalid;
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3177 }
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3178
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3179 continue;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3180 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3181
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3182 if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3183
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3184 if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3185 goto invalid;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3186 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3187
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3188 max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3189
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3190 if (max_fails == NGX_ERROR) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3191 goto invalid;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3192 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3193
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3194 continue;
212
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3195 }
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3196
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3197 if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3198
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3199 if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3200 goto invalid;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3201 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3202
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3203 s.len = value[i].len - 13;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3204 s.data = &value[i].data[13];
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3205
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3206 fail_timeout = ngx_parse_time(&s, 1);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3207
372
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 370
diff changeset
3208 if (fail_timeout == NGX_ERROR) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3209 goto invalid;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3210 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3211
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3212 continue;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3213 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3214
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3215 if (ngx_strncmp(value[i].data, "backup", 6) == 0) {
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3216
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3217 if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) {
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3218 goto invalid;
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3219 }
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3220
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3221 us->backup = 1;
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3222
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3223 continue;
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3224 }
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 324
diff changeset
3225
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3226 if (ngx_strncmp(value[i].data, "down", 4) == 0) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3227
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3228 if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3229 goto invalid;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3230 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3231
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3232 us->down = 1;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3233
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3234 continue;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3235 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3236
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3237 goto invalid;
212
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3238 }
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3239
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3240 us->addrs = u.addrs;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3241 us->naddrs = u.naddrs;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3242 us->weight = weight;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3243 us->max_fails = max_fails;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3244 us->fail_timeout = fail_timeout;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3245
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3246 return NGX_CONF_OK;
212
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3247
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3248 invalid:
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3249
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3250 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3251 "invalid parameter \"%V\"", &value[i]);
212
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3252
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3253 return NGX_CONF_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3254 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3255
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3256
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3257 ngx_http_upstream_srv_conf_t *
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3258 ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags)
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3259 {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3260 ngx_uint_t i;
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3261 ngx_http_upstream_server_t *us;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3262 ngx_http_upstream_srv_conf_t *uscf, **uscfp;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3263 ngx_http_upstream_main_conf_t *umcf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3264
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3265 if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3266
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
3267 if (ngx_parse_url(cf->pool, u) != NGX_OK) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3268 if (u->err) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3269 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3270 "%s in upstream \"%V\"", u->err, &u->url);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3271 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3272
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3273 return NULL;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3274 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3275 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3276
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3277 umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3278
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3279 uscfp = umcf->upstreams.elts;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3280
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3281 for (i = 0; i < umcf->upstreams.nelts; i++) {
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3282
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3283 if (uscfp[i]->host.len != u->host.len
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3284 || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len)
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3285 != 0)
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3286 {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3287 continue;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3288 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3289
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3290 if ((flags & NGX_HTTP_UPSTREAM_CREATE)
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3291 && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE))
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3292 {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3293 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3294 "duplicate upstream \"%V\"", &u->host);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3295 return NULL;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3296 }
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3297
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3298 if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && u->port) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3299 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3300 "upstream \"%V\" may not have port %d",
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3301 &u->host, u->port);
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3302 return NULL;
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3303 }
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3304
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3305 if ((flags & NGX_HTTP_UPSTREAM_CREATE) && uscfp[i]->port) {
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3306 ngx_log_error(NGX_LOG_WARN, cf->log, 0,
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3307 "upstream \"%V\" may not have port %d in %s:%ui",
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3308 &u->host, uscfp[i]->port,
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
3309 uscfp[i]->file_name, uscfp[i]->line);
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3310 return NULL;
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3311 }
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3312
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3313 if (uscfp[i]->port != u->port) {
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3314 continue;
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3315 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3316
324
f7cd062ee035 nginx 0.6.6
Igor Sysoev <http://sysoev.ru>
parents: 320
diff changeset
3317 if (uscfp[i]->default_port && u->default_port
f7cd062ee035 nginx 0.6.6
Igor Sysoev <http://sysoev.ru>
parents: 320
diff changeset
3318 && uscfp[i]->default_port != u->default_port)
f7cd062ee035 nginx 0.6.6
Igor Sysoev <http://sysoev.ru>
parents: 320
diff changeset
3319 {
f7cd062ee035 nginx 0.6.6
Igor Sysoev <http://sysoev.ru>
parents: 320
diff changeset
3320 continue;
f7cd062ee035 nginx 0.6.6
Igor Sysoev <http://sysoev.ru>
parents: 320
diff changeset
3321 }
f7cd062ee035 nginx 0.6.6
Igor Sysoev <http://sysoev.ru>
parents: 320
diff changeset
3322
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3323 return uscfp[i];
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3324 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3325
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3326 uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t));
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3327 if (uscf == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3328 return NULL;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3329 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3330
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3331 uscf->flags = flags;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3332 uscf->host = u->host;
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
3333 uscf->file_name = cf->conf_file->file.name.data;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3334 uscf->line = cf->conf_file->line;
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3335 uscf->port = u->port;
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 264
diff changeset
3336 uscf->default_port = u->default_port;
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3337
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3338 if (u->naddrs == 1) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3339 uscf->servers = ngx_array_create(cf->pool, 1,
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3340 sizeof(ngx_http_upstream_server_t));
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3341 if (uscf->servers == NULL) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3342 return NGX_CONF_ERROR;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3343 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3344
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3345 us = ngx_array_push(uscf->servers);
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3346 if (us == NULL) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3347 return NGX_CONF_ERROR;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3348 }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3349
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3350 ngx_memzero(us, sizeof(ngx_http_upstream_server_t));
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3351
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3352 us->addrs = u->addrs;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3353 us->naddrs = u->naddrs;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3354 }
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3355
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3356 uscfp = ngx_array_push(&umcf->upstreams);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3357 if (uscfp == NULL) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3358 return NULL;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3359 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3360
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3361 *uscfp = uscf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3362
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3363 return uscf;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3364 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3365
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3366
356
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3367 ngx_int_t
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3368 ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf,
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3369 ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev,
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3370 ngx_str_t *default_hide_headers, ngx_hash_init_t *hash)
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3371 {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3372 ngx_str_t *h;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3373 ngx_uint_t i, j;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3374 ngx_array_t hide_headers;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3375 ngx_hash_key_t *hk;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3376
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3377 if (conf->hide_headers == NGX_CONF_UNSET_PTR
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3378 && conf->pass_headers == NGX_CONF_UNSET_PTR)
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3379 {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3380 conf->hide_headers_hash = prev->hide_headers_hash;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3381
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3382 if (conf->hide_headers_hash.buckets) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3383 return NGX_OK;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3384 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3385
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3386 conf->hide_headers = prev->hide_headers;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3387 conf->pass_headers = prev->pass_headers;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3388
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3389 } else {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3390 if (conf->hide_headers == NGX_CONF_UNSET_PTR) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3391 conf->hide_headers = prev->hide_headers;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3392 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3393
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3394 if (conf->pass_headers == NGX_CONF_UNSET_PTR) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3395 conf->pass_headers = prev->pass_headers;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3396 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3397 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3398
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3399 if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t))
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3400 != NGX_OK)
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3401 {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3402 return NGX_ERROR;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3403 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3404
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3405 for (h = default_hide_headers; h->len; h++) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3406 hk = ngx_array_push(&hide_headers);
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3407 if (hk == NULL) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3408 return NGX_ERROR;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3409 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3410
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3411 hk->key = *h;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3412 hk->key_hash = ngx_hash_key_lc(h->data, h->len);
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3413 hk->value = (void *) 1;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3414 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3415
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3416 if (conf->hide_headers != NGX_CONF_UNSET_PTR) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3417
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3418 h = conf->hide_headers->elts;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3419
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3420 for (i = 0; i < conf->hide_headers->nelts; i++) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3421
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3422 hk = hide_headers.elts;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3423
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3424 for (j = 0; j < hide_headers.nelts; j++) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3425 if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3426 goto exist;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3427 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3428 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3429
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3430 hk = ngx_array_push(&hide_headers);
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3431 if (hk == NULL) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3432 return NGX_ERROR;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3433 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3434
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3435 hk->key = h[i];
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3436 hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len);
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3437 hk->value = (void *) 1;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3438
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3439 exist:
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3440
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3441 continue;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3442 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3443 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3444
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3445 if (conf->pass_headers != NGX_CONF_UNSET_PTR) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3446
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3447 h = conf->pass_headers->elts;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3448 hk = hide_headers.elts;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3449
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3450 for (i = 0; i < conf->pass_headers->nelts; i++) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3451 for (j = 0; j < hide_headers.nelts; j++) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3452
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3453 if (hk[j].key.data == NULL) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3454 continue;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3455 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3456
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3457 if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) {
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3458 hk[j].key.data = NULL;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3459 break;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3460 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3461 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3462 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3463 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3464
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3465 hash->hash = &conf->hide_headers_hash;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3466 hash->key = ngx_hash_key_lc;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3467 hash->pool = cf->pool;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3468 hash->temp_pool = NULL;
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3469
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3470 return ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts);
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3471 }
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3472
b743d290eb3b nginx 0.6.22
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
3473
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3474 static void *
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3475 ngx_http_upstream_create_main_conf(ngx_conf_t *cf)
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3476 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3477 ngx_http_upstream_main_conf_t *umcf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3478
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3479 umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3480 if (umcf == NULL) {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3481 return NULL;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3482 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3483
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3484 if (ngx_array_init(&umcf->upstreams, cf->pool, 4,
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3485 sizeof(ngx_http_upstream_srv_conf_t *))
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3486 != NGX_OK)
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3487 {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3488 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3489 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3490
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3491 return umcf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3492 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3493
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3494
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3495 static char *
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3496 ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3497 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3498 ngx_http_upstream_main_conf_t *umcf = conf;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3499
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3500 ngx_uint_t i;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3501 ngx_array_t headers_in;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3502 ngx_hash_key_t *hk;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3503 ngx_hash_init_t hash;
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3504 ngx_http_upstream_init_pt init;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3505 ngx_http_upstream_header_t *header;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3506 ngx_http_upstream_srv_conf_t **uscfp;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3507
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3508 uscfp = umcf->upstreams.elts;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3509
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3510 for (i = 0; i < umcf->upstreams.nelts; i++) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3511
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3512 init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream:
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3513 ngx_http_upstream_init_round_robin;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3514
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3515 if (init(cf, uscfp[i]) != NGX_OK) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3516 return NGX_CONF_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3517 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 198
diff changeset
3518 }
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3519
212
56688ed172c8 nginx 0.3.53
Igor Sysoev <http://sysoev.ru>
parents: 208
diff changeset
3520
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3521 /* upstream_headers_in_hash */
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 258
diff changeset
3522
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3523 if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t))
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3524 != NGX_OK)
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3525 {
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3526 return NGX_CONF_ERROR;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3527 }
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3528
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3529 for (header = ngx_http_upstream_headers_in; header->name.len; header++) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3530 hk = ngx_array_push(&headers_in);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3531 if (hk == NULL) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3532 return NGX_CONF_ERROR;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3533 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3534
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3535 hk->key = header->name;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3536 hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3537 hk->value = header;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3538 }
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3539
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3540 hash.hash = &umcf->headers_in_hash;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3541 hash.key = ngx_hash_key_lc;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3542 hash.max_size = 512;
244
500a3242dff6 nginx 0.4.7
Igor Sysoev <http://sysoev.ru>
parents: 230
diff changeset
3543 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
198
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3544 hash.name = "upstream_headers_in_hash";
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3545 hash.pool = cf->pool;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3546 hash.temp_pool = NULL;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3547
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3548 if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3549 return NGX_CONF_ERROR;
e6da4931e0e0 nginx 0.3.46
Igor Sysoev <http://sysoev.ru>
parents: 190
diff changeset
3550 }
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3551
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3552 return NGX_CONF_OK;
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 56
diff changeset
3553 }