Mercurial > hg > nginx
annotate src/http/modules/ngx_http_scgi_module.c @ 4662:979e0f5b196d stable-1.2
Merge of r4616: r->state fix.
Added r->state reset on fastcgi/scgi/uwsgi request start.
Failing to do so results in problems if 400 or 414 requests are
redirected to fastcgi/scgi/uwsgi upstream, as well as after invalid
headers got from upstream. This was already fixed for proxy in r3478,
but fastcgi (the only affected protocol at that time) was missed.
Reported by Matthieu Tourne.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 04 Jun 2012 10:54:48 +0000 |
parents | 834049edae24 |
children | 5a44d638cd27 05beaa2d87b3 |
rev | line source |
---|---|
3637 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
3637 | 5 * Copyright (C) Manlio Perillo (manlio.perillo@gmail.com) |
6 */ | |
7 | |
8 | |
9 #include <ngx_config.h> | |
10 #include <ngx_core.h> | |
11 #include <ngx_http.h> | |
12 | |
13 | |
14 typedef struct { | |
15 ngx_http_upstream_conf_t upstream; | |
16 | |
17 ngx_array_t *flushes; | |
18 ngx_array_t *params_len; | |
19 ngx_array_t *params; | |
20 ngx_array_t *params_source; | |
21 | |
22 ngx_hash_t headers_hash; | |
23 ngx_uint_t header_params; | |
24 | |
25 ngx_array_t *scgi_lengths; | |
26 ngx_array_t *scgi_values; | |
27 | |
28 #if (NGX_HTTP_CACHE) | |
29 ngx_http_complex_value_t cache_key; | |
30 #endif | |
31 } ngx_http_scgi_loc_conf_t; | |
32 | |
33 | |
34 static ngx_int_t ngx_http_scgi_eval(ngx_http_request_t *r, | |
35 ngx_http_scgi_loc_conf_t *scf); | |
36 static ngx_int_t ngx_http_scgi_create_request(ngx_http_request_t *r); | |
37 static ngx_int_t ngx_http_scgi_reinit_request(ngx_http_request_t *r); | |
38 static ngx_int_t ngx_http_scgi_process_status_line(ngx_http_request_t *r); | |
39 static ngx_int_t ngx_http_scgi_process_header(ngx_http_request_t *r); | |
40 static void ngx_http_scgi_abort_request(ngx_http_request_t *r); | |
41 static void ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc); | |
42 | |
43 static void *ngx_http_scgi_create_loc_conf(ngx_conf_t *cf); | |
44 static char *ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, | |
45 void *child); | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
46 static ngx_int_t ngx_http_scgi_merge_params(ngx_conf_t *cf, |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
47 ngx_http_scgi_loc_conf_t *conf, ngx_http_scgi_loc_conf_t *prev); |
3637 | 48 |
49 static char *ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | |
50 static char *ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd, | |
51 void *conf); | |
52 | |
53 #if (NGX_HTTP_CACHE) | |
54 static ngx_int_t ngx_http_scgi_create_key(ngx_http_request_t *r); | |
55 static char *ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, | |
56 void *conf); | |
57 static char *ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, | |
58 void *conf); | |
59 #endif | |
60 | |
61 | |
62 static ngx_conf_bitmask_t ngx_http_scgi_next_upstream_masks[] = { | |
63 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, | |
64 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, | |
65 { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, | |
66 { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 }, | |
67 { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 }, | |
68 { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, | |
69 { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING }, | |
70 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, | |
71 { ngx_null_string, 0 } | |
72 }; | |
73 | |
74 | |
75 ngx_module_t ngx_http_scgi_module; | |
76 | |
77 | |
78 static ngx_command_t ngx_http_scgi_commands[] = { | |
79 | |
80 { ngx_string("scgi_pass"), | |
81 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, | |
82 ngx_http_scgi_pass, | |
83 NGX_HTTP_LOC_CONF_OFFSET, | |
84 0, | |
85 NULL }, | |
86 | |
87 { ngx_string("scgi_store"), | |
88 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
89 ngx_http_scgi_store, | |
90 NGX_HTTP_LOC_CONF_OFFSET, | |
91 0, | |
92 NULL }, | |
93 | |
94 { ngx_string("scgi_store_access"), | |
95 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, | |
96 ngx_conf_set_access_slot, | |
97 NGX_HTTP_LOC_CONF_OFFSET, | |
98 offsetof(ngx_http_scgi_loc_conf_t, upstream.store_access), | |
99 NULL }, | |
100 | |
4157
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
101 { ngx_string("scgi_buffering"), |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
102 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
103 ngx_conf_set_flag_slot, |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
104 NGX_HTTP_LOC_CONF_OFFSET, |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
105 offsetof(ngx_http_scgi_loc_conf_t, upstream.buffering), |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
106 NULL }, |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
107 |
3637 | 108 { ngx_string("scgi_ignore_client_abort"), |
109 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
110 ngx_conf_set_flag_slot, | |
111 NGX_HTTP_LOC_CONF_OFFSET, | |
112 offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_client_abort), | |
113 NULL }, | |
114 | |
115 { ngx_string("scgi_bind"), | |
116 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
117 ngx_http_upstream_bind_set_slot, | |
118 NGX_HTTP_LOC_CONF_OFFSET, | |
119 offsetof(ngx_http_scgi_loc_conf_t, upstream.local), | |
120 NULL }, | |
121 | |
122 { ngx_string("scgi_connect_timeout"), | |
123 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
124 ngx_conf_set_msec_slot, | |
125 NGX_HTTP_LOC_CONF_OFFSET, | |
126 offsetof(ngx_http_scgi_loc_conf_t, upstream.connect_timeout), | |
127 NULL }, | |
128 | |
129 { ngx_string("scgi_send_timeout"), | |
130 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
131 ngx_conf_set_msec_slot, | |
132 NGX_HTTP_LOC_CONF_OFFSET, | |
133 offsetof(ngx_http_scgi_loc_conf_t, upstream.send_timeout), | |
134 NULL }, | |
135 | |
136 { ngx_string("scgi_buffer_size"), | |
137 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
138 ngx_conf_set_size_slot, | |
139 NGX_HTTP_LOC_CONF_OFFSET, | |
140 offsetof(ngx_http_scgi_loc_conf_t, upstream.buffer_size), | |
141 NULL }, | |
142 | |
143 { ngx_string("scgi_pass_request_headers"), | |
144 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
145 ngx_conf_set_flag_slot, | |
146 NGX_HTTP_LOC_CONF_OFFSET, | |
147 offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_headers), | |
148 NULL }, | |
149 | |
150 { ngx_string("scgi_pass_request_body"), | |
151 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
152 ngx_conf_set_flag_slot, | |
153 NGX_HTTP_LOC_CONF_OFFSET, | |
154 offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_body), | |
155 NULL }, | |
156 | |
157 { ngx_string("scgi_intercept_errors"), | |
158 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
159 ngx_conf_set_flag_slot, | |
160 NGX_HTTP_LOC_CONF_OFFSET, | |
161 offsetof(ngx_http_scgi_loc_conf_t, upstream.intercept_errors), | |
162 NULL }, | |
163 | |
164 { ngx_string("scgi_read_timeout"), | |
165 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
166 ngx_conf_set_msec_slot, | |
167 NGX_HTTP_LOC_CONF_OFFSET, | |
168 offsetof(ngx_http_scgi_loc_conf_t, upstream.read_timeout), | |
169 NULL }, | |
170 | |
171 { ngx_string("scgi_buffers"), | |
172 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, | |
173 ngx_conf_set_bufs_slot, | |
174 NGX_HTTP_LOC_CONF_OFFSET, | |
175 offsetof(ngx_http_scgi_loc_conf_t, upstream.bufs), | |
176 NULL }, | |
177 | |
178 { ngx_string("scgi_busy_buffers_size"), | |
179 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
180 ngx_conf_set_size_slot, | |
181 NGX_HTTP_LOC_CONF_OFFSET, | |
182 offsetof(ngx_http_scgi_loc_conf_t, upstream.busy_buffers_size_conf), | |
183 NULL }, | |
184 | |
185 #if (NGX_HTTP_CACHE) | |
186 | |
187 { ngx_string("scgi_cache"), | |
3729 | 188 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
3637 | 189 ngx_http_scgi_cache, |
190 NGX_HTTP_LOC_CONF_OFFSET, | |
191 0, | |
192 NULL }, | |
193 | |
194 { ngx_string("scgi_cache_key"), | |
3729 | 195 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
3637 | 196 ngx_http_scgi_cache_key, |
197 NGX_HTTP_LOC_CONF_OFFSET, | |
198 0, | |
199 NULL }, | |
200 | |
201 { ngx_string("scgi_cache_path"), | |
202 NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE, | |
203 ngx_http_file_cache_set_slot, | |
204 0, | |
205 0, | |
206 &ngx_http_scgi_module }, | |
207 | |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
208 { ngx_string("scgi_cache_bypass"), |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
209 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
210 ngx_http_set_predicate_slot, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
211 NGX_HTTP_LOC_CONF_OFFSET, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
212 offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_bypass), |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
213 NULL }, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
214 |
3637 | 215 { ngx_string("scgi_no_cache"), |
216 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
3692
045ea40cbfe8
use ngx_http_test_predicates(), ngx_http_set_predicate_slot()
Igor Sysoev <igor@sysoev.ru>
parents:
3670
diff
changeset
|
217 ngx_http_set_predicate_slot, |
3637 | 218 NGX_HTTP_LOC_CONF_OFFSET, |
219 offsetof(ngx_http_scgi_loc_conf_t, upstream.no_cache), | |
220 NULL }, | |
221 | |
222 { ngx_string("scgi_cache_valid"), | |
223 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
224 ngx_http_file_cache_valid_set_slot, | |
225 NGX_HTTP_LOC_CONF_OFFSET, | |
226 offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_valid), | |
227 NULL }, | |
228 | |
229 { ngx_string("scgi_cache_min_uses"), | |
230 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
231 ngx_conf_set_num_slot, | |
232 NGX_HTTP_LOC_CONF_OFFSET, | |
233 offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_min_uses), | |
234 NULL }, | |
235 | |
236 { ngx_string("scgi_cache_use_stale"), | |
237 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
238 ngx_conf_set_bitmask_slot, | |
239 NGX_HTTP_LOC_CONF_OFFSET, | |
240 offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_use_stale), | |
241 &ngx_http_scgi_next_upstream_masks }, | |
242 | |
243 { ngx_string("scgi_cache_methods"), | |
244 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
245 ngx_conf_set_bitmask_slot, | |
246 NGX_HTTP_LOC_CONF_OFFSET, | |
247 offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_methods), | |
248 &ngx_http_upstream_cache_method_mask }, | |
249 | |
4386
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
250 { ngx_string("scgi_cache_lock"), |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
251 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
252 ngx_conf_set_flag_slot, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
253 NGX_HTTP_LOC_CONF_OFFSET, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
254 offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock), |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
255 NULL }, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
256 |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
257 { ngx_string("scgi_cache_lock_timeout"), |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
258 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
259 ngx_conf_set_msec_slot, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
260 NGX_HTTP_LOC_CONF_OFFSET, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
261 offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_timeout), |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
262 NULL }, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
263 |
3637 | 264 #endif |
265 | |
266 { ngx_string("scgi_temp_path"), | |
267 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234, | |
268 ngx_conf_set_path_slot, | |
269 NGX_HTTP_LOC_CONF_OFFSET, | |
270 offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_path), | |
271 NULL }, | |
272 | |
273 { ngx_string("scgi_max_temp_file_size"), | |
274 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
275 ngx_conf_set_size_slot, | |
276 NGX_HTTP_LOC_CONF_OFFSET, | |
277 offsetof(ngx_http_scgi_loc_conf_t, upstream.max_temp_file_size_conf), | |
278 NULL }, | |
279 | |
280 { ngx_string("scgi_temp_file_write_size"), | |
281 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
282 ngx_conf_set_size_slot, | |
283 NGX_HTTP_LOC_CONF_OFFSET, | |
284 offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_file_write_size_conf), | |
285 NULL }, | |
286 | |
287 { ngx_string("scgi_next_upstream"), | |
288 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
289 ngx_conf_set_bitmask_slot, | |
290 NGX_HTTP_LOC_CONF_OFFSET, | |
291 offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream), | |
292 &ngx_http_scgi_next_upstream_masks }, | |
293 | |
294 { ngx_string("scgi_param"), | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
295 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23, |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
296 ngx_http_upstream_param_set_slot, |
3637 | 297 NGX_HTTP_LOC_CONF_OFFSET, |
298 offsetof(ngx_http_scgi_loc_conf_t, params_source), | |
299 NULL }, | |
300 | |
301 { ngx_string("scgi_pass_header"), | |
3729 | 302 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
3637 | 303 ngx_conf_set_str_array_slot, |
304 NGX_HTTP_LOC_CONF_OFFSET, | |
305 offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_headers), | |
306 NULL }, | |
307 | |
308 { ngx_string("scgi_hide_header"), | |
3729 | 309 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
3637 | 310 ngx_conf_set_str_array_slot, |
311 NGX_HTTP_LOC_CONF_OFFSET, | |
312 offsetof(ngx_http_scgi_loc_conf_t, upstream.hide_headers), | |
313 NULL }, | |
314 | |
315 { ngx_string("scgi_ignore_headers"), | |
316 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
317 ngx_conf_set_bitmask_slot, | |
318 NGX_HTTP_LOC_CONF_OFFSET, | |
319 offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_headers), | |
3667
12bd9e26fadb
use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents:
3637
diff
changeset
|
320 &ngx_http_upstream_ignore_headers_masks }, |
3637 | 321 |
322 ngx_null_command | |
323 }; | |
324 | |
325 | |
326 static ngx_http_module_t ngx_http_scgi_module_ctx = { | |
327 NULL, /* preconfiguration */ | |
328 NULL, /* postconfiguration */ | |
329 | |
330 NULL, /* create main configuration */ | |
331 NULL, /* init main configuration */ | |
332 | |
333 NULL, /* create server configuration */ | |
334 NULL, /* merge server configuration */ | |
335 | |
336 ngx_http_scgi_create_loc_conf, /* create location configuration */ | |
337 ngx_http_scgi_merge_loc_conf /* merge location configuration */ | |
338 }; | |
339 | |
340 | |
341 ngx_module_t ngx_http_scgi_module = { | |
342 NGX_MODULE_V1, | |
343 &ngx_http_scgi_module_ctx, /* module context */ | |
344 ngx_http_scgi_commands, /* module directives */ | |
345 NGX_HTTP_MODULE, /* module type */ | |
346 NULL, /* init master */ | |
347 NULL, /* init module */ | |
348 NULL, /* init process */ | |
349 NULL, /* init thread */ | |
350 NULL, /* exit thread */ | |
351 NULL, /* exit process */ | |
352 NULL, /* exit master */ | |
353 NGX_MODULE_V1_PADDING | |
354 }; | |
355 | |
356 | |
357 static ngx_str_t ngx_http_scgi_hide_headers[] = { | |
358 ngx_string("Status"), | |
359 ngx_string("X-Accel-Expires"), | |
360 ngx_string("X-Accel-Redirect"), | |
361 ngx_string("X-Accel-Limit-Rate"), | |
362 ngx_string("X-Accel-Buffering"), | |
363 ngx_string("X-Accel-Charset"), | |
364 ngx_null_string | |
365 }; | |
366 | |
367 | |
368 #if (NGX_HTTP_CACHE) | |
369 | |
370 static ngx_keyval_t ngx_http_scgi_cache_headers[] = { | |
371 { ngx_string("HTTP_IF_MODIFIED_SINCE"), ngx_string("") }, | |
372 { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") }, | |
373 { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("") }, | |
374 { ngx_string("HTTP_IF_MATCH"), ngx_string("") }, | |
375 { ngx_string("HTTP_RANGE"), ngx_string("") }, | |
376 { ngx_string("HTTP_IF_RANGE"), ngx_string("") }, | |
377 { ngx_null_string, ngx_null_string } | |
378 }; | |
379 | |
380 #endif | |
381 | |
382 | |
383 static ngx_path_init_t ngx_http_scgi_temp_path = { | |
384 ngx_string(NGX_HTTP_SCGI_TEMP_PATH), { 1, 2, 0 } | |
385 }; | |
386 | |
387 | |
388 static ngx_int_t | |
389 ngx_http_scgi_handler(ngx_http_request_t *r) | |
390 { | |
391 ngx_int_t rc; | |
392 ngx_http_status_t *status; | |
393 ngx_http_upstream_t *u; | |
394 ngx_http_scgi_loc_conf_t *scf; | |
395 | |
396 if (r->subrequest_in_memory) { | |
397 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, | |
398 "ngx_http_scgi_module does not support " | |
399 "subrequests in memory"); | |
400 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
401 } | |
402 | |
403 if (ngx_http_upstream_create(r) != NGX_OK) { | |
404 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
405 } | |
406 | |
407 status = ngx_pcalloc(r->pool, sizeof(ngx_http_status_t)); | |
408 if (status == NULL) { | |
409 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
410 } | |
411 | |
412 ngx_http_set_ctx(r, status, ngx_http_scgi_module); | |
413 | |
414 scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); | |
415 | |
416 if (scf->scgi_lengths) { | |
417 if (ngx_http_scgi_eval(r, scf) != NGX_OK) { | |
418 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
419 } | |
420 } | |
421 | |
422 u = r->upstream; | |
423 | |
424 ngx_str_set(&u->schema, "scgi://"); | |
425 u->output.tag = (ngx_buf_tag_t) &ngx_http_scgi_module; | |
426 | |
427 u->conf = &scf->upstream; | |
428 | |
429 #if (NGX_HTTP_CACHE) | |
430 u->create_key = ngx_http_scgi_create_key; | |
431 #endif | |
432 u->create_request = ngx_http_scgi_create_request; | |
433 u->reinit_request = ngx_http_scgi_reinit_request; | |
434 u->process_header = ngx_http_scgi_process_status_line; | |
435 u->abort_request = ngx_http_scgi_abort_request; | |
436 u->finalize_request = ngx_http_scgi_finalize_request; | |
4662
979e0f5b196d
Merge of r4616: r->state fix.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
437 r->state = 0; |
3637 | 438 |
4157
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
439 u->buffering = scf->upstream.buffering; |
3637 | 440 |
441 u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t)); | |
442 if (u->pipe == NULL) { | |
443 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
444 } | |
445 | |
446 u->pipe->input_filter = ngx_event_pipe_copy_input_filter; | |
447 u->pipe->input_ctx = r; | |
448 | |
449 rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); | |
450 | |
451 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { | |
452 return rc; | |
453 } | |
454 | |
455 return NGX_DONE; | |
456 } | |
457 | |
458 | |
459 static ngx_int_t | |
460 ngx_http_scgi_eval(ngx_http_request_t *r, ngx_http_scgi_loc_conf_t * scf) | |
461 { | |
462 ngx_url_t url; | |
463 ngx_http_upstream_t *u; | |
464 | |
465 ngx_memzero(&url, sizeof(ngx_url_t)); | |
466 | |
467 if (ngx_http_script_run(r, &url.url, scf->scgi_lengths->elts, 0, | |
468 scf->scgi_values->elts) | |
469 == NULL) | |
470 { | |
471 return NGX_ERROR; | |
472 } | |
473 | |
474 url.no_resolve = 1; | |
475 | |
476 if (ngx_parse_url(r->pool, &url) != NGX_OK) { | |
477 if (url.err) { | |
478 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
479 "%s in upstream \"%V\"", url.err, &url.url); | |
480 } | |
481 | |
482 return NGX_ERROR; | |
483 } | |
484 | |
485 u = r->upstream; | |
486 | |
487 u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); | |
488 if (u->resolved == NULL) { | |
489 return NGX_ERROR; | |
490 } | |
491 | |
492 if (url.addrs && url.addrs[0].sockaddr) { | |
493 u->resolved->sockaddr = url.addrs[0].sockaddr; | |
494 u->resolved->socklen = url.addrs[0].socklen; | |
495 u->resolved->naddrs = 1; | |
496 u->resolved->host = url.addrs[0].name; | |
497 | |
498 } else { | |
499 u->resolved->host = url.host; | |
500 u->resolved->port = url.port; | |
3879
502a6b0acf3f
fix case when a host in fastcgi_pass, scgi_pass, and uwsgi_pass
Igor Sysoev <igor@sysoev.ru>
parents:
3731
diff
changeset
|
501 u->resolved->no_port = url.no_port; |
3637 | 502 } |
503 | |
504 return NGX_OK; | |
505 } | |
506 | |
507 | |
508 #if (NGX_HTTP_CACHE) | |
509 | |
510 static ngx_int_t | |
511 ngx_http_scgi_create_key(ngx_http_request_t *r) | |
512 { | |
513 ngx_str_t *key; | |
514 ngx_http_scgi_loc_conf_t *scf; | |
515 | |
516 key = ngx_array_push(&r->cache->keys); | |
517 if (key == NULL) { | |
518 return NGX_ERROR; | |
519 } | |
520 | |
521 scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); | |
522 | |
523 if (ngx_http_complex_value(r, &scf->cache_key, key) != NGX_OK) { | |
524 return NGX_ERROR; | |
525 } | |
526 | |
527 return NGX_OK; | |
528 } | |
529 | |
530 #endif | |
531 | |
532 | |
533 static ngx_int_t | |
534 ngx_http_scgi_create_request(ngx_http_request_t *r) | |
535 { | |
536 u_char ch, *key, *val, *lowcase_key; | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
537 size_t len, key_len, val_len, allocated; |
3637 | 538 ngx_buf_t *b; |
539 ngx_str_t *content_length; | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
540 ngx_uint_t i, n, hash, skip_empty, header_params; |
3637 | 541 ngx_chain_t *cl, *body; |
542 ngx_list_part_t *part; | |
543 ngx_table_elt_t *header, **ignored; | |
544 ngx_http_script_code_pt code; | |
545 ngx_http_script_engine_t e, le; | |
546 ngx_http_scgi_loc_conf_t *scf; | |
547 ngx_http_script_len_code_pt lcode; | |
548 static ngx_str_t zero = ngx_string("0"); | |
549 | |
550 content_length = r->headers_in.content_length ? | |
551 &r->headers_in.content_length->value : &zero; | |
552 | |
553 len = sizeof("CONTENT_LENGTH") + content_length->len + 1; | |
554 | |
555 header_params = 0; | |
556 ignored = NULL; | |
557 | |
558 scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); | |
559 | |
560 if (scf->params_len) { | |
561 ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); | |
562 | |
563 ngx_http_script_flush_no_cacheable_variables(r, scf->flushes); | |
564 le.flushed = 1; | |
565 | |
566 le.ip = scf->params_len->elts; | |
567 le.request = r; | |
568 | |
569 while (*(uintptr_t *) le.ip) { | |
570 | |
571 lcode = *(ngx_http_script_len_code_pt *) le.ip; | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
572 key_len = lcode(&le); |
3637 | 573 |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
574 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
575 skip_empty = lcode(&le); |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
576 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
577 for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { |
3637 | 578 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
579 } | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
580 le.ip += sizeof(uintptr_t); |
4294
56cb2255735a
Fixed incorrect counting the length of headers in a SCGI request.
Valentin Bartenev <vbart@nginx.com>
parents:
4278
diff
changeset
|
581 |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
582 if (skip_empty && val_len == 0) { |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
583 continue; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
584 } |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
585 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
586 len += key_len + val_len + 1; |
3637 | 587 } |
588 } | |
589 | |
590 if (scf->upstream.pass_request_headers) { | |
591 | |
592 allocated = 0; | |
593 lowcase_key = NULL; | |
594 | |
595 if (scf->header_params) { | |
4015
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
596 n = 0; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
597 part = &r->headers_in.headers.part; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
598 |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
599 while (part) { |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
600 n += part->nelts; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
601 part = part->next; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
602 } |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
603 |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
604 ignored = ngx_palloc(r->pool, n * sizeof(void *)); |
3637 | 605 if (ignored == NULL) { |
606 return NGX_ERROR; | |
607 } | |
608 } | |
609 | |
610 part = &r->headers_in.headers.part; | |
611 header = part->elts; | |
612 | |
613 for (i = 0; /* void */; i++) { | |
614 | |
615 if (i >= part->nelts) { | |
616 if (part->next == NULL) { | |
617 break; | |
618 } | |
619 | |
620 part = part->next; | |
621 header = part->elts; | |
622 i = 0; | |
623 } | |
624 | |
625 if (scf->header_params) { | |
626 if (allocated < header[i].key.len) { | |
627 allocated = header[i].key.len + 16; | |
628 lowcase_key = ngx_pnalloc(r->pool, allocated); | |
629 if (lowcase_key == NULL) { | |
630 return NGX_ERROR; | |
631 } | |
632 } | |
633 | |
634 hash = 0; | |
635 | |
636 for (n = 0; n < header[i].key.len; n++) { | |
637 ch = header[i].key.data[n]; | |
638 | |
639 if (ch >= 'A' && ch <= 'Z') { | |
640 ch |= 0x20; | |
641 | |
642 } else if (ch == '-') { | |
643 ch = '_'; | |
644 } | |
645 | |
646 hash = ngx_hash(hash, ch); | |
647 lowcase_key[n] = ch; | |
648 } | |
649 | |
650 if (ngx_hash_find(&scf->headers_hash, hash, lowcase_key, n)) { | |
651 ignored[header_params++] = &header[i]; | |
652 continue; | |
653 } | |
654 } | |
655 | |
656 len += sizeof("HTTP_") - 1 + header[i].key.len + 1 | |
657 + header[i].value.len + 1; | |
658 } | |
659 } | |
660 | |
661 /* netstring: "length:" + packet + "," */ | |
662 | |
663 b = ngx_create_temp_buf(r->pool, NGX_SIZE_T_LEN + 1 + len + 1); | |
664 if (b == NULL) { | |
665 return NGX_ERROR; | |
666 } | |
667 | |
668 cl = ngx_alloc_chain_link(r->pool); | |
669 if (cl == NULL) { | |
670 return NGX_ERROR; | |
671 } | |
672 | |
673 cl->buf = b; | |
674 | |
675 b->last = ngx_snprintf(b->last, | |
676 NGX_SIZE_T_LEN + 1 + sizeof("CONTENT_LENGTH") | |
677 + NGX_OFF_T_LEN + 1, | |
678 "%ui:CONTENT_LENGTH%Z%V%Z", | |
679 len, content_length); | |
680 | |
681 if (scf->params_len) { | |
682 ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); | |
683 | |
684 e.ip = scf->params->elts; | |
685 e.pos = b->last; | |
686 e.request = r; | |
687 e.flushed = 1; | |
688 | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
689 le.ip = scf->params_len->elts; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
690 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
691 while (*(uintptr_t *) le.ip) { |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
692 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
693 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
694 lcode(&le); /* key length */ |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
695 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
696 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
697 skip_empty = lcode(&le); |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
698 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
699 for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
700 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
701 } |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
702 le.ip += sizeof(uintptr_t); |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
703 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
704 if (skip_empty && val_len == 0) { |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
705 e.skip = 1; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
706 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
707 while (*(uintptr_t *) e.ip) { |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
708 code = *(ngx_http_script_code_pt *) e.ip; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
709 code((ngx_http_script_engine_t *) &e); |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
710 } |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
711 e.ip += sizeof(uintptr_t); |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
712 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
713 e.skip = 0; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
714 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
715 continue; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
716 } |
3637 | 717 |
718 #if (NGX_DEBUG) | |
719 key = e.pos; | |
720 #endif | |
721 code = *(ngx_http_script_code_pt *) e.ip; | |
722 code((ngx_http_script_engine_t *) & e); | |
723 | |
724 #if (NGX_DEBUG) | |
725 val = e.pos; | |
726 #endif | |
727 while (*(uintptr_t *) e.ip) { | |
728 code = *(ngx_http_script_code_pt *) e.ip; | |
729 code((ngx_http_script_engine_t *) &e); | |
730 } | |
731 *e.pos++ = '\0'; | |
732 e.ip += sizeof(uintptr_t); | |
733 | |
734 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
735 "scgi param: \"%s: %s\"", key, val); | |
736 } | |
737 | |
738 b->last = e.pos; | |
739 } | |
740 | |
741 if (scf->upstream.pass_request_headers) { | |
742 | |
743 part = &r->headers_in.headers.part; | |
744 header = part->elts; | |
745 | |
746 for (i = 0; /* void */; i++) { | |
747 | |
748 if (i >= part->nelts) { | |
749 if (part->next == NULL) { | |
750 break; | |
751 } | |
752 | |
753 part = part->next; | |
754 header = part->elts; | |
755 i = 0; | |
756 } | |
757 | |
758 for (n = 0; n < header_params; n++) { | |
759 if (&header[i] == ignored[n]) { | |
760 goto next; | |
761 } | |
762 } | |
763 | |
764 key = b->last; | |
765 b->last = ngx_cpymem(key, "HTTP_", sizeof("HTTP_") - 1); | |
766 | |
767 for (n = 0; n < header[i].key.len; n++) { | |
768 ch = header[i].key.data[n]; | |
769 | |
770 if (ch >= 'a' && ch <= 'z') { | |
771 ch &= ~0x20; | |
772 | |
773 } else if (ch == '-') { | |
774 ch = '_'; | |
775 } | |
776 | |
777 *b->last++ = ch; | |
778 } | |
779 | |
780 *b->last++ = (u_char) 0; | |
781 | |
782 val = b->last; | |
783 b->last = ngx_copy(val, header[i].value.data, header[i].value.len); | |
784 *b->last++ = (u_char) 0; | |
785 | |
786 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
787 "scgi param: \"%s: %s\"", key, val); | |
788 | |
789 next: | |
790 | |
791 continue; | |
792 } | |
793 } | |
794 | |
795 *b->last++ = (u_char) ','; | |
796 | |
797 if (scf->upstream.pass_request_body) { | |
798 body = r->upstream->request_bufs; | |
799 r->upstream->request_bufs = cl; | |
800 | |
801 while (body) { | |
802 b = ngx_alloc_buf(r->pool); | |
803 if (b == NULL) { | |
804 return NGX_ERROR; | |
805 } | |
806 | |
807 ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); | |
808 | |
809 cl->next = ngx_alloc_chain_link(r->pool); | |
810 if (cl->next == NULL) { | |
811 return NGX_ERROR; | |
812 } | |
813 | |
814 cl = cl->next; | |
815 cl->buf = b; | |
816 | |
817 body = body->next; | |
818 } | |
819 | |
820 } else { | |
821 r->upstream->request_bufs = cl; | |
822 } | |
823 | |
824 cl->next = NULL; | |
825 | |
826 return NGX_OK; | |
827 } | |
828 | |
829 | |
830 static ngx_int_t | |
831 ngx_http_scgi_reinit_request(ngx_http_request_t *r) | |
832 { | |
833 ngx_http_status_t *status; | |
834 | |
835 status = ngx_http_get_module_ctx(r, ngx_http_scgi_module); | |
836 | |
837 if (status == NULL) { | |
838 return NGX_OK; | |
839 } | |
840 | |
841 status->code = 0; | |
842 status->count = 0; | |
843 status->start = NULL; | |
844 status->end = NULL; | |
845 | |
846 r->upstream->process_header = ngx_http_scgi_process_status_line; | |
4662
979e0f5b196d
Merge of r4616: r->state fix.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4593
diff
changeset
|
847 r->state = 0; |
3637 | 848 |
849 return NGX_OK; | |
850 } | |
851 | |
852 | |
853 static ngx_int_t | |
854 ngx_http_scgi_process_status_line(ngx_http_request_t *r) | |
855 { | |
856 size_t len; | |
857 ngx_int_t rc; | |
858 ngx_http_status_t *status; | |
859 ngx_http_upstream_t *u; | |
860 | |
861 status = ngx_http_get_module_ctx(r, ngx_http_scgi_module); | |
862 | |
863 if (status == NULL) { | |
864 return NGX_ERROR; | |
865 } | |
866 | |
867 u = r->upstream; | |
868 | |
869 rc = ngx_http_parse_status_line(r, &u->buffer, status); | |
870 | |
871 if (rc == NGX_AGAIN) { | |
872 return rc; | |
873 } | |
874 | |
875 if (rc == NGX_ERROR) { | |
876 u->process_header = ngx_http_scgi_process_header; | |
877 return ngx_http_scgi_process_header(r); | |
878 } | |
879 | |
880 if (u->state) { | |
881 u->state->status = status->code; | |
882 } | |
883 | |
884 u->headers_in.status_n = status->code; | |
885 | |
886 len = status->end - status->start; | |
887 u->headers_in.status_line.len = len; | |
888 | |
889 u->headers_in.status_line.data = ngx_pnalloc(r->pool, len); | |
890 if (u->headers_in.status_line.data == NULL) { | |
891 return NGX_ERROR; | |
892 } | |
893 | |
894 ngx_memcpy(u->headers_in.status_line.data, status->start, len); | |
895 | |
896 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
897 "http scgi status %ui \"%V\"", | |
898 u->headers_in.status_n, &u->headers_in.status_line); | |
899 | |
900 u->process_header = ngx_http_scgi_process_header; | |
901 | |
902 return ngx_http_scgi_process_header(r); | |
903 } | |
904 | |
905 | |
906 static ngx_int_t | |
907 ngx_http_scgi_process_header(ngx_http_request_t *r) | |
908 { | |
909 ngx_str_t *status_line; | |
910 ngx_int_t rc, status; | |
911 ngx_table_elt_t *h; | |
912 ngx_http_upstream_t *u; | |
913 ngx_http_upstream_header_t *hh; | |
914 ngx_http_upstream_main_conf_t *umcf; | |
915 | |
916 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); | |
917 | |
918 for ( ;; ) { | |
919 | |
920 rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1); | |
921 | |
922 if (rc == NGX_OK) { | |
923 | |
924 /* a header line has been parsed successfully */ | |
925 | |
926 h = ngx_list_push(&r->upstream->headers_in.headers); | |
927 if (h == NULL) { | |
928 return NGX_ERROR; | |
929 } | |
930 | |
931 h->hash = r->header_hash; | |
932 | |
933 h->key.len = r->header_name_end - r->header_name_start; | |
934 h->value.len = r->header_end - r->header_start; | |
935 | |
936 h->key.data = ngx_pnalloc(r->pool, | |
937 h->key.len + 1 + h->value.len + 1 | |
938 + h->key.len); | |
939 if (h->key.data == NULL) { | |
940 return NGX_ERROR; | |
941 } | |
942 | |
943 h->value.data = h->key.data + h->key.len + 1; | |
944 h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1; | |
945 | |
4529
1ebec1d15a25
Fixed incorrect ngx_cpystrn() usage in ngx_http_*_process_header().
Maxim Dounin <mdounin@mdounin.ru>
parents:
4522
diff
changeset
|
946 ngx_memcpy(h->key.data, r->header_name_start, h->key.len); |
1ebec1d15a25
Fixed incorrect ngx_cpystrn() usage in ngx_http_*_process_header().
Maxim Dounin <mdounin@mdounin.ru>
parents:
4522
diff
changeset
|
947 h->key.data[h->key.len] = '\0'; |
1ebec1d15a25
Fixed incorrect ngx_cpystrn() usage in ngx_http_*_process_header().
Maxim Dounin <mdounin@mdounin.ru>
parents:
4522
diff
changeset
|
948 ngx_memcpy(h->value.data, r->header_start, h->value.len); |
1ebec1d15a25
Fixed incorrect ngx_cpystrn() usage in ngx_http_*_process_header().
Maxim Dounin <mdounin@mdounin.ru>
parents:
4522
diff
changeset
|
949 h->value.data[h->value.len] = '\0'; |
3637 | 950 |
951 if (h->key.len == r->lowcase_index) { | |
952 ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); | |
953 | |
954 } else { | |
955 ngx_strlow(h->lowcase_key, h->key.data, h->key.len); | |
956 } | |
957 | |
958 hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, | |
959 h->lowcase_key, h->key.len); | |
960 | |
961 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { | |
962 return NGX_ERROR; | |
963 } | |
964 | |
965 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
966 "http scgi header: \"%V: %V\"", &h->key, &h->value); | |
967 | |
968 continue; | |
969 } | |
970 | |
971 if (rc == NGX_HTTP_PARSE_HEADER_DONE) { | |
972 | |
973 /* a whole header has been parsed successfully */ | |
974 | |
975 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
976 "http scgi header done"); | |
977 | |
4371
16ebad9447ee
Fixed incorrect use of r->http_version in scgi module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4331
diff
changeset
|
978 u = r->upstream; |
16ebad9447ee
Fixed incorrect use of r->http_version in scgi module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4331
diff
changeset
|
979 |
16ebad9447ee
Fixed incorrect use of r->http_version in scgi module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4331
diff
changeset
|
980 if (u->headers_in.status_n) { |
3637 | 981 return NGX_OK; |
982 } | |
983 | |
984 if (u->headers_in.status) { | |
985 status_line = &u->headers_in.status->value; | |
986 | |
987 status = ngx_atoi(status_line->data, 3); | |
988 if (status == NGX_ERROR) { | |
989 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
990 "upstream sent invalid status \"%V\"", | |
991 status_line); | |
992 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
993 } | |
994 | |
995 u->headers_in.status_n = status; | |
996 u->headers_in.status_line = *status_line; | |
997 | |
998 } else if (u->headers_in.location) { | |
999 u->headers_in.status_n = 302; | |
1000 ngx_str_set(&u->headers_in.status_line, | |
1001 "302 Moved Temporarily"); | |
1002 | |
1003 } else { | |
1004 u->headers_in.status_n = 200; | |
1005 ngx_str_set(&u->headers_in.status_line, "200 OK"); | |
1006 } | |
1007 | |
1008 if (u->state) { | |
1009 u->state->status = u->headers_in.status_n; | |
1010 } | |
1011 | |
1012 return NGX_OK; | |
1013 } | |
1014 | |
1015 if (rc == NGX_AGAIN) { | |
1016 return NGX_AGAIN; | |
1017 } | |
1018 | |
1019 /* there was error while a header line parsing */ | |
1020 | |
1021 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
1022 "upstream sent invalid header"); | |
1023 | |
1024 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
1025 } | |
1026 } | |
1027 | |
1028 | |
1029 static void | |
1030 ngx_http_scgi_abort_request(ngx_http_request_t *r) | |
1031 { | |
1032 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1033 "abort http scgi request"); | |
1034 | |
1035 return; | |
1036 } | |
1037 | |
1038 | |
1039 static void | |
1040 ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
1041 { | |
1042 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1043 "finalize http scgi request"); | |
1044 | |
1045 return; | |
1046 } | |
1047 | |
1048 | |
1049 static void * | |
1050 ngx_http_scgi_create_loc_conf(ngx_conf_t *cf) | |
1051 { | |
1052 ngx_http_scgi_loc_conf_t *conf; | |
1053 | |
1054 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_loc_conf_t)); | |
1055 if (conf == NULL) { | |
1056 return NULL; | |
1057 } | |
1058 | |
1059 conf->upstream.store = NGX_CONF_UNSET; | |
1060 conf->upstream.store_access = NGX_CONF_UNSET_UINT; | |
1061 conf->upstream.buffering = NGX_CONF_UNSET; | |
1062 conf->upstream.ignore_client_abort = NGX_CONF_UNSET; | |
1063 | |
1064 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; | |
1065 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; | |
1066 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; | |
1067 | |
1068 conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE; | |
1069 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; | |
1070 | |
1071 conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE; | |
1072 conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE; | |
1073 conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE; | |
1074 | |
1075 conf->upstream.pass_request_headers = NGX_CONF_UNSET; | |
1076 conf->upstream.pass_request_body = NGX_CONF_UNSET; | |
1077 | |
1078 #if (NGX_HTTP_CACHE) | |
1079 conf->upstream.cache = NGX_CONF_UNSET_PTR; | |
1080 conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; | |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
1081 conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; |
3693
e3bcc2f4c418
fix scgi_no_cache and uwsgi_no_cache initialization
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
1082 conf->upstream.no_cache = NGX_CONF_UNSET_PTR; |
3637 | 1083 conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; |
4386
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1084 conf->upstream.cache_lock = NGX_CONF_UNSET; |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1085 conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC; |
3637 | 1086 #endif |
1087 | |
1088 conf->upstream.hide_headers = NGX_CONF_UNSET_PTR; | |
1089 conf->upstream.pass_headers = NGX_CONF_UNSET_PTR; | |
1090 | |
1091 conf->upstream.intercept_errors = NGX_CONF_UNSET; | |
1092 | |
1093 /* "scgi_cyclic_temp_file" is disabled */ | |
1094 conf->upstream.cyclic_temp_file = 0; | |
1095 | |
4157
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
1096 conf->upstream.change_buffering = 1; |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
1097 |
3976
215fe9223419
update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents:
3879
diff
changeset
|
1098 ngx_str_set(&conf->upstream.module, "scgi"); |
215fe9223419
update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents:
3879
diff
changeset
|
1099 |
3637 | 1100 return conf; |
1101 } | |
1102 | |
1103 | |
1104 static char * | |
1105 ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) | |
1106 { | |
1107 ngx_http_scgi_loc_conf_t *prev = parent; | |
1108 ngx_http_scgi_loc_conf_t *conf = child; | |
1109 | |
1110 size_t size; | |
1111 ngx_hash_init_t hash; | |
3731
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1112 ngx_http_core_loc_conf_t *clcf; |
3637 | 1113 |
1114 if (conf->upstream.store != 0) { | |
1115 ngx_conf_merge_value(conf->upstream.store, prev->upstream.store, 0); | |
1116 | |
1117 if (conf->upstream.store_lengths == NULL) { | |
1118 conf->upstream.store_lengths = prev->upstream.store_lengths; | |
1119 conf->upstream.store_values = prev->upstream.store_values; | |
1120 } | |
1121 } | |
1122 | |
1123 ngx_conf_merge_uint_value(conf->upstream.store_access, | |
1124 prev->upstream.store_access, 0600); | |
1125 | |
1126 ngx_conf_merge_value(conf->upstream.buffering, | |
1127 prev->upstream.buffering, 1); | |
1128 | |
1129 ngx_conf_merge_value(conf->upstream.ignore_client_abort, | |
1130 prev->upstream.ignore_client_abort, 0); | |
1131 | |
1132 ngx_conf_merge_msec_value(conf->upstream.connect_timeout, | |
1133 prev->upstream.connect_timeout, 60000); | |
1134 | |
1135 ngx_conf_merge_msec_value(conf->upstream.send_timeout, | |
1136 prev->upstream.send_timeout, 60000); | |
1137 | |
1138 ngx_conf_merge_msec_value(conf->upstream.read_timeout, | |
1139 prev->upstream.read_timeout, 60000); | |
1140 | |
1141 ngx_conf_merge_size_value(conf->upstream.send_lowat, | |
1142 prev->upstream.send_lowat, 0); | |
1143 | |
1144 ngx_conf_merge_size_value(conf->upstream.buffer_size, | |
1145 prev->upstream.buffer_size, | |
1146 (size_t) ngx_pagesize); | |
1147 | |
1148 | |
1149 ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs, | |
1150 8, ngx_pagesize); | |
1151 | |
1152 if (conf->upstream.bufs.num < 2) { | |
1153 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1154 "there must be at least 2 \"scgi_buffers\""); | |
1155 return NGX_CONF_ERROR; | |
1156 } | |
1157 | |
1158 | |
1159 size = conf->upstream.buffer_size; | |
1160 if (size < conf->upstream.bufs.size) { | |
1161 size = conf->upstream.bufs.size; | |
1162 } | |
1163 | |
1164 | |
1165 ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf, | |
1166 prev->upstream.busy_buffers_size_conf, | |
1167 NGX_CONF_UNSET_SIZE); | |
1168 | |
1169 if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) { | |
1170 conf->upstream.busy_buffers_size = 2 * size; | |
1171 } else { | |
1172 conf->upstream.busy_buffers_size = | |
1173 conf->upstream.busy_buffers_size_conf; | |
1174 } | |
1175 | |
1176 if (conf->upstream.busy_buffers_size < size) { | |
1177 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4529
diff
changeset
|
1178 "\"scgi_busy_buffers_size\" must be equal to or greater " |
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4529
diff
changeset
|
1179 "than the maximum of the value of \"scgi_buffer_size\" and " |
3637 | 1180 "one of the \"scgi_buffers\""); |
1181 | |
1182 return NGX_CONF_ERROR; | |
1183 } | |
1184 | |
1185 if (conf->upstream.busy_buffers_size | |
1186 > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size) | |
1187 { | |
1188 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1189 "\"scgi_busy_buffers_size\" must be less than " | |
1190 "the size of all \"scgi_buffers\" minus one buffer"); | |
1191 | |
1192 return NGX_CONF_ERROR; | |
1193 } | |
1194 | |
1195 | |
1196 ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf, | |
1197 prev->upstream.temp_file_write_size_conf, | |
1198 NGX_CONF_UNSET_SIZE); | |
1199 | |
1200 if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) { | |
1201 conf->upstream.temp_file_write_size = 2 * size; | |
1202 } else { | |
1203 conf->upstream.temp_file_write_size = | |
1204 conf->upstream.temp_file_write_size_conf; | |
1205 } | |
1206 | |
1207 if (conf->upstream.temp_file_write_size < size) { | |
1208 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4529
diff
changeset
|
1209 "\"scgi_temp_file_write_size\" must be equal to or greater than " |
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4529
diff
changeset
|
1210 "the maximum of the value of \"scgi_buffer_size\" and " |
3637 | 1211 "one of the \"scgi_buffers\""); |
1212 | |
1213 return NGX_CONF_ERROR; | |
1214 } | |
1215 | |
1216 | |
1217 ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf, | |
1218 prev->upstream.max_temp_file_size_conf, | |
1219 NGX_CONF_UNSET_SIZE); | |
1220 | |
1221 if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) { | |
1222 conf->upstream.max_temp_file_size = 1024 * 1024 * 1024; | |
1223 } else { | |
1224 conf->upstream.max_temp_file_size = | |
1225 conf->upstream.max_temp_file_size_conf; | |
1226 } | |
1227 | |
1228 if (conf->upstream.max_temp_file_size != 0 | |
1229 && conf->upstream.max_temp_file_size < size) { | |
1230 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1231 "\"scgi_max_temp_file_size\" must be equal to zero to disable " | |
4593
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4529
diff
changeset
|
1232 "temporary files usage or must be equal to or greater than " |
834049edae24
Fixed grammar in error messages.
Ruslan Ermilov <ru@nginx.com>
parents:
4529
diff
changeset
|
1233 "the maximum of the value of \"scgi_buffer_size\" and " |
3637 | 1234 "one of the \"scgi_buffers\""); |
1235 | |
1236 return NGX_CONF_ERROR; | |
1237 } | |
1238 | |
1239 | |
1240 ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers, | |
1241 prev->upstream.ignore_headers, | |
1242 NGX_CONF_BITMASK_SET); | |
1243 | |
1244 | |
1245 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, | |
1246 prev->upstream.next_upstream, | |
1247 (NGX_CONF_BITMASK_SET | |
1248 |NGX_HTTP_UPSTREAM_FT_ERROR | |
1249 |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); | |
1250 | |
1251 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { | |
1252 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET | |
1253 |NGX_HTTP_UPSTREAM_FT_OFF; | |
1254 } | |
1255 | |
1256 if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path, | |
1257 prev->upstream.temp_path, | |
1258 &ngx_http_scgi_temp_path) | |
1259 != NGX_OK) | |
1260 { | |
1261 return NGX_CONF_ERROR; | |
1262 } | |
1263 | |
1264 #if (NGX_HTTP_CACHE) | |
1265 | |
1266 ngx_conf_merge_ptr_value(conf->upstream.cache, | |
1267 prev->upstream.cache, NULL); | |
1268 | |
1269 if (conf->upstream.cache && conf->upstream.cache->data == NULL) { | |
1270 ngx_shm_zone_t *shm_zone; | |
1271 | |
1272 shm_zone = conf->upstream.cache; | |
1273 | |
1274 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1275 "\"scgi_cache\" zone \"%V\" is unknown", | |
1276 &shm_zone->shm.name); | |
1277 | |
1278 return NGX_CONF_ERROR; | |
1279 } | |
1280 | |
1281 ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, | |
1282 prev->upstream.cache_min_uses, 1); | |
1283 | |
1284 ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, | |
1285 prev->upstream.cache_use_stale, | |
1286 (NGX_CONF_BITMASK_SET | |
1287 |NGX_HTTP_UPSTREAM_FT_OFF)); | |
1288 | |
1289 if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) { | |
1290 conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET | |
1291 |NGX_HTTP_UPSTREAM_FT_OFF; | |
1292 } | |
1293 | |
4401
d45742815c90
Fixed proxy_cache_use_stale in "no live upstreams" case.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4386
diff
changeset
|
1294 if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) { |
d45742815c90
Fixed proxy_cache_use_stale in "no live upstreams" case.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4386
diff
changeset
|
1295 conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE; |
d45742815c90
Fixed proxy_cache_use_stale in "no live upstreams" case.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4386
diff
changeset
|
1296 } |
d45742815c90
Fixed proxy_cache_use_stale in "no live upstreams" case.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4386
diff
changeset
|
1297 |
3637 | 1298 if (conf->upstream.cache_methods == 0) { |
1299 conf->upstream.cache_methods = prev->upstream.cache_methods; | |
1300 } | |
1301 | |
1302 conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD; | |
1303 | |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
1304 ngx_conf_merge_ptr_value(conf->upstream.cache_bypass, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
1305 prev->upstream.cache_bypass, NULL); |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
1306 |
3637 | 1307 ngx_conf_merge_ptr_value(conf->upstream.no_cache, |
1308 prev->upstream.no_cache, NULL); | |
1309 | |
1310 ngx_conf_merge_ptr_value(conf->upstream.cache_valid, | |
1311 prev->upstream.cache_valid, NULL); | |
1312 | |
1313 if (conf->cache_key.value.data == NULL) { | |
1314 conf->cache_key = prev->cache_key; | |
1315 } | |
1316 | |
4386
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1317 ngx_conf_merge_value(conf->upstream.cache_lock, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1318 prev->upstream.cache_lock, 0); |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1319 |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1320 ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout, |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1321 prev->upstream.cache_lock_timeout, 5000); |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1322 |
3637 | 1323 #endif |
1324 | |
1325 ngx_conf_merge_value(conf->upstream.pass_request_headers, | |
1326 prev->upstream.pass_request_headers, 1); | |
1327 ngx_conf_merge_value(conf->upstream.pass_request_body, | |
1328 prev->upstream.pass_request_body, 1); | |
1329 | |
1330 ngx_conf_merge_value(conf->upstream.intercept_errors, | |
1331 prev->upstream.intercept_errors, 0); | |
1332 | |
1333 hash.max_size = 512; | |
1334 hash.bucket_size = ngx_align(64, ngx_cacheline_size); | |
1335 hash.name = "scgi_hide_headers_hash"; | |
1336 | |
1337 if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream, | |
3670
2728c4e4a9ae
do not use a cache headers set to hide
Igor Sysoev <igor@sysoev.ru>
parents:
3668
diff
changeset
|
1338 &prev->upstream, ngx_http_scgi_hide_headers, &hash) |
3637 | 1339 != NGX_OK) |
1340 { | |
1341 return NGX_CONF_ERROR; | |
1342 } | |
1343 | |
1344 if (conf->upstream.upstream == NULL) { | |
1345 conf->upstream.upstream = prev->upstream.upstream; | |
1346 } | |
1347 | |
1348 if (conf->scgi_lengths == NULL) { | |
1349 conf->scgi_lengths = prev->scgi_lengths; | |
1350 conf->scgi_values = prev->scgi_values; | |
1351 } | |
1352 | |
3731
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1353 if (conf->upstream.upstream || conf->scgi_lengths) { |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1354 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1355 if (clcf->handler == NULL && clcf->lmt_excpt) { |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1356 clcf->handler = ngx_http_scgi_handler; |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1357 } |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1358 } |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1359 |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1360 if (ngx_http_scgi_merge_params(cf, conf, prev) != NGX_OK) { |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1361 return NGX_CONF_ERROR; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1362 } |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1363 |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1364 return NGX_CONF_OK; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1365 } |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1366 |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1367 |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1368 static ngx_int_t |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1369 ngx_http_scgi_merge_params(ngx_conf_t *cf, ngx_http_scgi_loc_conf_t *conf, |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1370 ngx_http_scgi_loc_conf_t *prev) |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1371 { |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1372 u_char *p; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1373 size_t size; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1374 uintptr_t *code; |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1375 ngx_uint_t i, nsrc; |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1376 ngx_array_t headers_names; |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1377 #if (NGX_HTTP_CACHE) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1378 ngx_array_t params_merged; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1379 #endif |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1380 ngx_hash_key_t *hk; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1381 ngx_hash_init_t hash; |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1382 ngx_http_upstream_param_t *src; |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1383 ngx_http_script_compile_t sc; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1384 ngx_http_script_copy_code_t *copy; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1385 |
3637 | 1386 if (conf->params_source == NULL) { |
1387 conf->params_source = prev->params_source; | |
1388 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1389 if (prev->headers_hash.buckets |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1390 #if (NGX_HTTP_CACHE) |
4522 | 1391 && ((conf->upstream.cache == NULL) |
1392 == (prev->upstream.cache == NULL)) | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1393 #endif |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1394 ) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1395 { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1396 conf->flushes = prev->flushes; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1397 conf->params_len = prev->params_len; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1398 conf->params = prev->params; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1399 conf->headers_hash = prev->headers_hash; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1400 conf->header_params = prev->header_params; |
3637 | 1401 |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1402 return NGX_OK; |
3637 | 1403 } |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1404 } |
3637 | 1405 |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1406 if (conf->params_source == NULL |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1407 #if (NGX_HTTP_CACHE) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1408 && (conf->upstream.cache == NULL) |
3637 | 1409 #endif |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1410 ) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1411 { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1412 conf->headers_hash.buckets = (void *) 1; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1413 return NGX_OK; |
3637 | 1414 } |
1415 | |
1416 conf->params_len = ngx_array_create(cf->pool, 64, 1); | |
1417 if (conf->params_len == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1418 return NGX_ERROR; |
3637 | 1419 } |
1420 | |
1421 conf->params = ngx_array_create(cf->pool, 512, 1); | |
1422 if (conf->params == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1423 return NGX_ERROR; |
3637 | 1424 } |
1425 | |
1426 if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) | |
1427 != NGX_OK) | |
1428 { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1429 return NGX_ERROR; |
3637 | 1430 } |
1431 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1432 if (conf->params_source) { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1433 src = conf->params_source->elts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1434 nsrc = conf->params_source->nelts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1435 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1436 } else { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1437 src = NULL; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1438 nsrc = 0; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1439 } |
3637 | 1440 |
1441 #if (NGX_HTTP_CACHE) | |
1442 | |
1443 if (conf->upstream.cache) { | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1444 ngx_keyval_t *h; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1445 ngx_http_upstream_param_t *s; |
3637 | 1446 |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1447 if (ngx_array_init(¶ms_merged, cf->temp_pool, 4, |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1448 sizeof(ngx_http_upstream_param_t)) |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1449 != NGX_OK) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1450 { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1451 return NGX_ERROR; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1452 } |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1453 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1454 for (i = 0; i < nsrc; i++) { |
3637 | 1455 |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1456 s = ngx_array_push(¶ms_merged); |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1457 if (s == NULL) { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1458 return NGX_ERROR; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1459 } |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1460 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1461 *s = src[i]; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1462 } |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1463 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1464 h = ngx_http_scgi_cache_headers; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1465 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1466 while (h->key.len) { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1467 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1468 src = params_merged.elts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1469 nsrc = params_merged.nelts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1470 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1471 for (i = 0; i < nsrc; i++) { |
3637 | 1472 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { |
1473 goto next; | |
1474 } | |
1475 } | |
1476 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1477 s = ngx_array_push(¶ms_merged); |
3637 | 1478 if (s == NULL) { |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1479 return NGX_ERROR; |
3637 | 1480 } |
1481 | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1482 s->key = h->key; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1483 s->value = h->value; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1484 s->skip_empty = 0; |
3637 | 1485 |
1486 next: | |
1487 | |
1488 h++; | |
1489 } | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1490 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1491 src = params_merged.elts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1492 nsrc = params_merged.nelts; |
3637 | 1493 } |
1494 | |
1495 #endif | |
1496 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1497 for (i = 0; i < nsrc; i++) { |
3637 | 1498 |
1499 if (src[i].key.len > sizeof("HTTP_") - 1 | |
1500 && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0) | |
1501 { | |
1502 hk = ngx_array_push(&headers_names); | |
1503 if (hk == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1504 return NGX_ERROR; |
3637 | 1505 } |
1506 | |
1507 hk->key.len = src[i].key.len - 5; | |
1508 hk->key.data = src[i].key.data + 5; | |
1509 hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len); | |
1510 hk->value = (void *) 1; | |
1511 | |
1512 if (src[i].value.len == 0) { | |
1513 continue; | |
1514 } | |
1515 } | |
1516 | |
1517 copy = ngx_array_push_n(conf->params_len, | |
1518 sizeof(ngx_http_script_copy_code_t)); | |
1519 if (copy == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1520 return NGX_ERROR; |
3637 | 1521 } |
1522 | |
1523 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; | |
1524 copy->len = src[i].key.len + 1; | |
1525 | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1526 copy = ngx_array_push_n(conf->params_len, |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1527 sizeof(ngx_http_script_copy_code_t)); |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1528 if (copy == NULL) { |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1529 return NGX_ERROR; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1530 } |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1531 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1532 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1533 copy->len = src[i].skip_empty; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1534 |
3637 | 1535 |
1536 size = (sizeof(ngx_http_script_copy_code_t) | |
1537 + src[i].key.len + 1 + sizeof(uintptr_t) - 1) | |
1538 & ~(sizeof(uintptr_t) - 1); | |
1539 | |
1540 copy = ngx_array_push_n(conf->params, size); | |
1541 if (copy == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1542 return NGX_ERROR; |
3637 | 1543 } |
1544 | |
1545 copy->code = ngx_http_script_copy_code; | |
1546 copy->len = src[i].key.len + 1; | |
1547 | |
1548 p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t); | |
1549 (void) ngx_cpystrn(p, src[i].key.data, src[i].key.len + 1); | |
1550 | |
1551 | |
1552 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); | |
1553 | |
1554 sc.cf = cf; | |
1555 sc.source = &src[i].value; | |
1556 sc.flushes = &conf->flushes; | |
1557 sc.lengths = &conf->params_len; | |
1558 sc.values = &conf->params; | |
1559 | |
1560 if (ngx_http_script_compile(&sc) != NGX_OK) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1561 return NGX_ERROR; |
3637 | 1562 } |
1563 | |
1564 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | |
1565 if (code == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1566 return NGX_ERROR; |
3637 | 1567 } |
1568 | |
1569 *code = (uintptr_t) NULL; | |
1570 | |
1571 | |
1572 code = ngx_array_push_n(conf->params, sizeof(uintptr_t)); | |
1573 if (code == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1574 return NGX_ERROR; |
3637 | 1575 } |
1576 | |
1577 *code = (uintptr_t) NULL; | |
1578 } | |
1579 | |
1580 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | |
1581 if (code == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1582 return NGX_ERROR; |
3637 | 1583 } |
1584 | |
1585 *code = (uintptr_t) NULL; | |
1586 | |
1587 code = ngx_array_push_n(conf->params, sizeof(uintptr_t)); | |
1588 if (code == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1589 return NGX_ERROR; |
3637 | 1590 } |
1591 | |
1592 *code = (uintptr_t) NULL; | |
1593 | |
1594 conf->header_params = headers_names.nelts; | |
1595 | |
1596 hash.hash = &conf->headers_hash; | |
1597 hash.key = ngx_hash_key_lc; | |
1598 hash.max_size = 512; | |
1599 hash.bucket_size = 64; | |
1600 hash.name = "scgi_params_hash"; | |
1601 hash.pool = cf->pool; | |
1602 hash.temp_pool = NULL; | |
1603 | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1604 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); |
3637 | 1605 } |
1606 | |
1607 | |
1608 static char * | |
1609 ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1610 { | |
1611 ngx_http_scgi_loc_conf_t *scf = conf; | |
1612 | |
1613 ngx_url_t u; | |
1614 ngx_str_t *value, *url; | |
1615 ngx_uint_t n; | |
1616 ngx_http_core_loc_conf_t *clcf; | |
1617 ngx_http_script_compile_t sc; | |
1618 | |
1619 if (scf->upstream.upstream || scf->scgi_lengths) { | |
1620 return "is duplicate"; | |
1621 } | |
1622 | |
1623 clcf = ngx_http_conf_get_module_loc_conf (cf, ngx_http_core_module); | |
1624 clcf->handler = ngx_http_scgi_handler; | |
1625 | |
1626 value = cf->args->elts; | |
1627 | |
1628 url = &value[1]; | |
1629 | |
1630 n = ngx_http_script_variables_count(url); | |
1631 | |
1632 if (n) { | |
1633 | |
1634 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); | |
1635 | |
1636 sc.cf = cf; | |
1637 sc.source = url; | |
1638 sc.lengths = &scf->scgi_lengths; | |
1639 sc.values = &scf->scgi_values; | |
1640 sc.variables = n; | |
1641 sc.complete_lengths = 1; | |
1642 sc.complete_values = 1; | |
1643 | |
1644 if (ngx_http_script_compile(&sc) != NGX_OK) { | |
1645 return NGX_CONF_ERROR; | |
1646 } | |
1647 | |
1648 return NGX_CONF_OK; | |
1649 } | |
1650 | |
1651 ngx_memzero(&u, sizeof(ngx_url_t)); | |
1652 | |
1653 u.url = value[1]; | |
1654 u.no_resolve = 1; | |
1655 | |
1656 scf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); | |
1657 if (scf->upstream.upstream == NULL) { | |
1658 return NGX_CONF_ERROR; | |
1659 } | |
1660 | |
1661 if (clcf->name.data[clcf->name.len - 1] == '/') { | |
1662 clcf->auto_redirect = 1; | |
1663 } | |
1664 | |
1665 return NGX_CONF_OK; | |
1666 } | |
1667 | |
1668 | |
1669 static char * | |
1670 ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1671 { | |
1672 ngx_http_scgi_loc_conf_t *scf = conf; | |
1673 | |
1674 ngx_str_t *value; | |
1675 ngx_http_script_compile_t sc; | |
1676 | |
1677 if (scf->upstream.store != NGX_CONF_UNSET || scf->upstream.store_lengths) { | |
1678 return "is duplicate"; | |
1679 } | |
1680 | |
1681 value = cf->args->elts; | |
1682 | |
1683 if (ngx_strcmp(value[1].data, "off") == 0) { | |
1684 scf->upstream.store = 0; | |
1685 return NGX_CONF_OK; | |
1686 } | |
1687 | |
1688 #if (NGX_HTTP_CACHE) | |
1689 | |
1690 if (scf->upstream.cache != NGX_CONF_UNSET_PTR | |
1691 && scf->upstream.cache != NULL) | |
1692 { | |
1693 return "is incompatible with \"scgi_cache\""; | |
1694 } | |
1695 | |
1696 #endif | |
1697 | |
1698 if (ngx_strcmp(value[1].data, "on") == 0) { | |
1699 scf->upstream.store = 1; | |
1700 return NGX_CONF_OK; | |
1701 } | |
1702 | |
1703 /* include the terminating '\0' into script */ | |
1704 value[1].len++; | |
1705 | |
1706 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); | |
1707 | |
1708 sc.cf = cf; | |
1709 sc.source = &value[1]; | |
1710 sc.lengths = &scf->upstream.store_lengths; | |
1711 sc.values = &scf->upstream.store_values; | |
1712 sc.variables = ngx_http_script_variables_count(&value[1]);; | |
1713 sc.complete_lengths = 1; | |
1714 sc.complete_values = 1; | |
1715 | |
1716 if (ngx_http_script_compile(&sc) != NGX_OK) { | |
1717 return NGX_CONF_ERROR; | |
1718 } | |
1719 | |
1720 return NGX_CONF_OK; | |
1721 } | |
1722 | |
1723 | |
1724 #if (NGX_HTTP_CACHE) | |
1725 | |
1726 static char * | |
1727 ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1728 { | |
1729 ngx_http_scgi_loc_conf_t *scf = conf; | |
1730 | |
1731 ngx_str_t *value; | |
1732 | |
1733 value = cf->args->elts; | |
1734 | |
1735 if (scf->upstream.cache != NGX_CONF_UNSET_PTR) { | |
1736 return "is duplicate"; | |
1737 } | |
1738 | |
1739 if (ngx_strcmp(value[1].data, "off") == 0) { | |
1740 scf->upstream.cache = NULL; | |
1741 return NGX_CONF_OK; | |
1742 } | |
1743 | |
1744 if (scf->upstream.store > 0 || scf->upstream.store_lengths) { | |
1745 return "is incompatible with \"scgi_store\""; | |
1746 } | |
1747 | |
1748 scf->upstream.cache = ngx_shared_memory_add(cf, &value[1], 0, | |
1749 &ngx_http_scgi_module); | |
1750 if (scf->upstream.cache == NULL) { | |
1751 return NGX_CONF_ERROR; | |
1752 } | |
1753 | |
1754 return NGX_CONF_OK; | |
1755 } | |
1756 | |
1757 | |
1758 static char * | |
1759 ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1760 { | |
1761 ngx_http_scgi_loc_conf_t *scf = conf; | |
1762 | |
1763 ngx_str_t *value; | |
1764 ngx_http_compile_complex_value_t ccv; | |
1765 | |
1766 value = cf->args->elts; | |
1767 | |
1768 if (scf->cache_key.value.len) { | |
1769 return "is duplicate"; | |
1770 } | |
1771 | |
1772 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); | |
1773 | |
1774 ccv.cf = cf; | |
1775 ccv.value = &value[1]; | |
1776 ccv.complex_value = &scf->cache_key; | |
1777 | |
1778 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { | |
1779 return NGX_CONF_ERROR; | |
1780 } | |
1781 | |
1782 return NGX_CONF_OK; | |
1783 } | |
1784 | |
1785 #endif |