Mercurial > hg > nginx-quic
annotate src/http/modules/ngx_http_scgi_module.c @ 4458:2d4ff8bd5649
Limit conn: returned to the old behavior of using the first actual limit on
the way.
It was unintentionally changed in r4272, so that it could only limit the first
location where the processing of the request has reached PREACCESS phase.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Fri, 10 Feb 2012 10:48:58 +0000 |
parents | d620f497c50f |
children | 14411ee4d89f |
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; | |
437 | |
4157
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
438 u->buffering = scf->upstream.buffering; |
3637 | 439 |
440 u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t)); | |
441 if (u->pipe == NULL) { | |
442 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
443 } | |
444 | |
445 u->pipe->input_filter = ngx_event_pipe_copy_input_filter; | |
446 u->pipe->input_ctx = r; | |
447 | |
448 rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); | |
449 | |
450 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { | |
451 return rc; | |
452 } | |
453 | |
454 return NGX_DONE; | |
455 } | |
456 | |
457 | |
458 static ngx_int_t | |
459 ngx_http_scgi_eval(ngx_http_request_t *r, ngx_http_scgi_loc_conf_t * scf) | |
460 { | |
461 ngx_url_t url; | |
462 ngx_http_upstream_t *u; | |
463 | |
464 ngx_memzero(&url, sizeof(ngx_url_t)); | |
465 | |
466 if (ngx_http_script_run(r, &url.url, scf->scgi_lengths->elts, 0, | |
467 scf->scgi_values->elts) | |
468 == NULL) | |
469 { | |
470 return NGX_ERROR; | |
471 } | |
472 | |
473 url.no_resolve = 1; | |
474 | |
475 if (ngx_parse_url(r->pool, &url) != NGX_OK) { | |
476 if (url.err) { | |
477 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
478 "%s in upstream \"%V\"", url.err, &url.url); | |
479 } | |
480 | |
481 return NGX_ERROR; | |
482 } | |
483 | |
484 u = r->upstream; | |
485 | |
486 u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); | |
487 if (u->resolved == NULL) { | |
488 return NGX_ERROR; | |
489 } | |
490 | |
491 if (url.addrs && url.addrs[0].sockaddr) { | |
492 u->resolved->sockaddr = url.addrs[0].sockaddr; | |
493 u->resolved->socklen = url.addrs[0].socklen; | |
494 u->resolved->naddrs = 1; | |
495 u->resolved->host = url.addrs[0].name; | |
496 | |
497 } else { | |
498 u->resolved->host = url.host; | |
499 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
|
500 u->resolved->no_port = url.no_port; |
3637 | 501 } |
502 | |
503 return NGX_OK; | |
504 } | |
505 | |
506 | |
507 #if (NGX_HTTP_CACHE) | |
508 | |
509 static ngx_int_t | |
510 ngx_http_scgi_create_key(ngx_http_request_t *r) | |
511 { | |
512 ngx_str_t *key; | |
513 ngx_http_scgi_loc_conf_t *scf; | |
514 | |
515 key = ngx_array_push(&r->cache->keys); | |
516 if (key == NULL) { | |
517 return NGX_ERROR; | |
518 } | |
519 | |
520 scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); | |
521 | |
522 if (ngx_http_complex_value(r, &scf->cache_key, key) != NGX_OK) { | |
523 return NGX_ERROR; | |
524 } | |
525 | |
526 return NGX_OK; | |
527 } | |
528 | |
529 #endif | |
530 | |
531 | |
532 static ngx_int_t | |
533 ngx_http_scgi_create_request(ngx_http_request_t *r) | |
534 { | |
535 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
|
536 size_t len, key_len, val_len, allocated; |
3637 | 537 ngx_buf_t *b; |
538 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
|
539 ngx_uint_t i, n, hash, skip_empty, header_params; |
3637 | 540 ngx_chain_t *cl, *body; |
541 ngx_list_part_t *part; | |
542 ngx_table_elt_t *header, **ignored; | |
543 ngx_http_script_code_pt code; | |
544 ngx_http_script_engine_t e, le; | |
545 ngx_http_scgi_loc_conf_t *scf; | |
546 ngx_http_script_len_code_pt lcode; | |
547 static ngx_str_t zero = ngx_string("0"); | |
548 | |
549 content_length = r->headers_in.content_length ? | |
550 &r->headers_in.content_length->value : &zero; | |
551 | |
552 len = sizeof("CONTENT_LENGTH") + content_length->len + 1; | |
553 | |
554 header_params = 0; | |
555 ignored = NULL; | |
556 | |
557 scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); | |
558 | |
559 if (scf->params_len) { | |
560 ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); | |
561 | |
562 ngx_http_script_flush_no_cacheable_variables(r, scf->flushes); | |
563 le.flushed = 1; | |
564 | |
565 le.ip = scf->params_len->elts; | |
566 le.request = r; | |
567 | |
568 while (*(uintptr_t *) le.ip) { | |
569 | |
570 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
|
571 key_len = lcode(&le); |
3637 | 572 |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
573 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
|
574 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
|
575 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
576 for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { |
3637 | 577 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
578 } | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
579 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
|
580 |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
581 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
|
582 continue; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
583 } |
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 len += key_len + val_len + 1; |
3637 | 586 } |
587 } | |
588 | |
589 if (scf->upstream.pass_request_headers) { | |
590 | |
591 allocated = 0; | |
592 lowcase_key = NULL; | |
593 | |
594 if (scf->header_params) { | |
4015
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
595 n = 0; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
596 part = &r->headers_in.headers.part; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
597 |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
598 while (part) { |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
599 n += part->nelts; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
600 part = part->next; |
e0a435f5f504
Fix ignored headers handling in fastcgi/scgi/uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3976
diff
changeset
|
601 } |
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 ignored = ngx_palloc(r->pool, n * sizeof(void *)); |
3637 | 604 if (ignored == NULL) { |
605 return NGX_ERROR; | |
606 } | |
607 } | |
608 | |
609 part = &r->headers_in.headers.part; | |
610 header = part->elts; | |
611 | |
612 for (i = 0; /* void */; i++) { | |
613 | |
614 if (i >= part->nelts) { | |
615 if (part->next == NULL) { | |
616 break; | |
617 } | |
618 | |
619 part = part->next; | |
620 header = part->elts; | |
621 i = 0; | |
622 } | |
623 | |
624 if (scf->header_params) { | |
625 if (allocated < header[i].key.len) { | |
626 allocated = header[i].key.len + 16; | |
627 lowcase_key = ngx_pnalloc(r->pool, allocated); | |
628 if (lowcase_key == NULL) { | |
629 return NGX_ERROR; | |
630 } | |
631 } | |
632 | |
633 hash = 0; | |
634 | |
635 for (n = 0; n < header[i].key.len; n++) { | |
636 ch = header[i].key.data[n]; | |
637 | |
638 if (ch >= 'A' && ch <= 'Z') { | |
639 ch |= 0x20; | |
640 | |
641 } else if (ch == '-') { | |
642 ch = '_'; | |
643 } | |
644 | |
645 hash = ngx_hash(hash, ch); | |
646 lowcase_key[n] = ch; | |
647 } | |
648 | |
649 if (ngx_hash_find(&scf->headers_hash, hash, lowcase_key, n)) { | |
650 ignored[header_params++] = &header[i]; | |
651 continue; | |
652 } | |
653 } | |
654 | |
655 len += sizeof("HTTP_") - 1 + header[i].key.len + 1 | |
656 + header[i].value.len + 1; | |
657 } | |
658 } | |
659 | |
660 /* netstring: "length:" + packet + "," */ | |
661 | |
662 b = ngx_create_temp_buf(r->pool, NGX_SIZE_T_LEN + 1 + len + 1); | |
663 if (b == NULL) { | |
664 return NGX_ERROR; | |
665 } | |
666 | |
667 cl = ngx_alloc_chain_link(r->pool); | |
668 if (cl == NULL) { | |
669 return NGX_ERROR; | |
670 } | |
671 | |
672 cl->buf = b; | |
673 | |
674 b->last = ngx_snprintf(b->last, | |
675 NGX_SIZE_T_LEN + 1 + sizeof("CONTENT_LENGTH") | |
676 + NGX_OFF_T_LEN + 1, | |
677 "%ui:CONTENT_LENGTH%Z%V%Z", | |
678 len, content_length); | |
679 | |
680 if (scf->params_len) { | |
681 ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); | |
682 | |
683 e.ip = scf->params->elts; | |
684 e.pos = b->last; | |
685 e.request = r; | |
686 e.flushed = 1; | |
687 | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
688 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
|
689 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
690 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
|
691 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
692 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
|
693 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
|
694 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
695 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
|
696 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
|
697 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
698 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
|
699 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
|
700 } |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
701 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
|
702 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
703 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
|
704 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
|
705 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
706 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
|
707 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
|
708 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
|
709 } |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
710 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
|
711 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
712 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
|
713 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
714 continue; |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
715 } |
3637 | 716 |
717 #if (NGX_DEBUG) | |
718 key = e.pos; | |
719 #endif | |
720 code = *(ngx_http_script_code_pt *) e.ip; | |
721 code((ngx_http_script_engine_t *) & e); | |
722 | |
723 #if (NGX_DEBUG) | |
724 val = e.pos; | |
725 #endif | |
726 while (*(uintptr_t *) e.ip) { | |
727 code = *(ngx_http_script_code_pt *) e.ip; | |
728 code((ngx_http_script_engine_t *) &e); | |
729 } | |
730 *e.pos++ = '\0'; | |
731 e.ip += sizeof(uintptr_t); | |
732 | |
733 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
734 "scgi param: \"%s: %s\"", key, val); | |
735 } | |
736 | |
737 b->last = e.pos; | |
738 } | |
739 | |
740 if (scf->upstream.pass_request_headers) { | |
741 | |
742 part = &r->headers_in.headers.part; | |
743 header = part->elts; | |
744 | |
745 for (i = 0; /* void */; i++) { | |
746 | |
747 if (i >= part->nelts) { | |
748 if (part->next == NULL) { | |
749 break; | |
750 } | |
751 | |
752 part = part->next; | |
753 header = part->elts; | |
754 i = 0; | |
755 } | |
756 | |
757 for (n = 0; n < header_params; n++) { | |
758 if (&header[i] == ignored[n]) { | |
759 goto next; | |
760 } | |
761 } | |
762 | |
763 key = b->last; | |
764 b->last = ngx_cpymem(key, "HTTP_", sizeof("HTTP_") - 1); | |
765 | |
766 for (n = 0; n < header[i].key.len; n++) { | |
767 ch = header[i].key.data[n]; | |
768 | |
769 if (ch >= 'a' && ch <= 'z') { | |
770 ch &= ~0x20; | |
771 | |
772 } else if (ch == '-') { | |
773 ch = '_'; | |
774 } | |
775 | |
776 *b->last++ = ch; | |
777 } | |
778 | |
779 *b->last++ = (u_char) 0; | |
780 | |
781 val = b->last; | |
782 b->last = ngx_copy(val, header[i].value.data, header[i].value.len); | |
783 *b->last++ = (u_char) 0; | |
784 | |
785 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
786 "scgi param: \"%s: %s\"", key, val); | |
787 | |
788 next: | |
789 | |
790 continue; | |
791 } | |
792 } | |
793 | |
794 *b->last++ = (u_char) ','; | |
795 | |
796 if (scf->upstream.pass_request_body) { | |
797 body = r->upstream->request_bufs; | |
798 r->upstream->request_bufs = cl; | |
799 | |
800 while (body) { | |
801 b = ngx_alloc_buf(r->pool); | |
802 if (b == NULL) { | |
803 return NGX_ERROR; | |
804 } | |
805 | |
806 ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); | |
807 | |
808 cl->next = ngx_alloc_chain_link(r->pool); | |
809 if (cl->next == NULL) { | |
810 return NGX_ERROR; | |
811 } | |
812 | |
813 cl = cl->next; | |
814 cl->buf = b; | |
815 | |
816 body = body->next; | |
817 } | |
818 | |
819 } else { | |
820 r->upstream->request_bufs = cl; | |
821 } | |
822 | |
823 cl->next = NULL; | |
824 | |
825 return NGX_OK; | |
826 } | |
827 | |
828 | |
829 static ngx_int_t | |
830 ngx_http_scgi_reinit_request(ngx_http_request_t *r) | |
831 { | |
832 ngx_http_status_t *status; | |
833 | |
834 status = ngx_http_get_module_ctx(r, ngx_http_scgi_module); | |
835 | |
836 if (status == NULL) { | |
837 return NGX_OK; | |
838 } | |
839 | |
840 status->code = 0; | |
841 status->count = 0; | |
842 status->start = NULL; | |
843 status->end = NULL; | |
844 | |
845 r->upstream->process_header = ngx_http_scgi_process_status_line; | |
846 | |
847 return NGX_OK; | |
848 } | |
849 | |
850 | |
851 static ngx_int_t | |
852 ngx_http_scgi_process_status_line(ngx_http_request_t *r) | |
853 { | |
854 size_t len; | |
855 ngx_int_t rc; | |
856 ngx_http_status_t *status; | |
857 ngx_http_upstream_t *u; | |
858 | |
859 status = ngx_http_get_module_ctx(r, ngx_http_scgi_module); | |
860 | |
861 if (status == NULL) { | |
862 return NGX_ERROR; | |
863 } | |
864 | |
865 u = r->upstream; | |
866 | |
867 rc = ngx_http_parse_status_line(r, &u->buffer, status); | |
868 | |
869 if (rc == NGX_AGAIN) { | |
870 return rc; | |
871 } | |
872 | |
873 if (rc == NGX_ERROR) { | |
874 u->process_header = ngx_http_scgi_process_header; | |
875 return ngx_http_scgi_process_header(r); | |
876 } | |
877 | |
878 if (u->state) { | |
879 u->state->status = status->code; | |
880 } | |
881 | |
882 u->headers_in.status_n = status->code; | |
883 | |
884 len = status->end - status->start; | |
885 u->headers_in.status_line.len = len; | |
886 | |
887 u->headers_in.status_line.data = ngx_pnalloc(r->pool, len); | |
888 if (u->headers_in.status_line.data == NULL) { | |
889 return NGX_ERROR; | |
890 } | |
891 | |
892 ngx_memcpy(u->headers_in.status_line.data, status->start, len); | |
893 | |
894 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
895 "http scgi status %ui \"%V\"", | |
896 u->headers_in.status_n, &u->headers_in.status_line); | |
897 | |
898 u->process_header = ngx_http_scgi_process_header; | |
899 | |
900 return ngx_http_scgi_process_header(r); | |
901 } | |
902 | |
903 | |
904 static ngx_int_t | |
905 ngx_http_scgi_process_header(ngx_http_request_t *r) | |
906 { | |
907 ngx_str_t *status_line; | |
908 ngx_int_t rc, status; | |
909 ngx_table_elt_t *h; | |
910 ngx_http_upstream_t *u; | |
911 ngx_http_upstream_header_t *hh; | |
912 ngx_http_upstream_main_conf_t *umcf; | |
913 | |
914 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); | |
915 | |
916 for ( ;; ) { | |
917 | |
918 rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1); | |
919 | |
920 if (rc == NGX_OK) { | |
921 | |
922 /* a header line has been parsed successfully */ | |
923 | |
924 h = ngx_list_push(&r->upstream->headers_in.headers); | |
925 if (h == NULL) { | |
926 return NGX_ERROR; | |
927 } | |
928 | |
929 h->hash = r->header_hash; | |
930 | |
931 h->key.len = r->header_name_end - r->header_name_start; | |
932 h->value.len = r->header_end - r->header_start; | |
933 | |
934 h->key.data = ngx_pnalloc(r->pool, | |
935 h->key.len + 1 + h->value.len + 1 | |
936 + h->key.len); | |
937 if (h->key.data == NULL) { | |
938 return NGX_ERROR; | |
939 } | |
940 | |
941 h->value.data = h->key.data + h->key.len + 1; | |
942 h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1; | |
943 | |
944 ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1); | |
945 ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1); | |
946 | |
947 if (h->key.len == r->lowcase_index) { | |
948 ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); | |
949 | |
950 } else { | |
951 ngx_strlow(h->lowcase_key, h->key.data, h->key.len); | |
952 } | |
953 | |
954 hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, | |
955 h->lowcase_key, h->key.len); | |
956 | |
957 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { | |
958 return NGX_ERROR; | |
959 } | |
960 | |
961 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
962 "http scgi header: \"%V: %V\"", &h->key, &h->value); | |
963 | |
964 continue; | |
965 } | |
966 | |
967 if (rc == NGX_HTTP_PARSE_HEADER_DONE) { | |
968 | |
969 /* a whole header has been parsed successfully */ | |
970 | |
971 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
972 "http scgi header done"); | |
973 | |
4371
16ebad9447ee
Fixed incorrect use of r->http_version in scgi module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4331
diff
changeset
|
974 u = r->upstream; |
16ebad9447ee
Fixed incorrect use of r->http_version in scgi module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4331
diff
changeset
|
975 |
16ebad9447ee
Fixed incorrect use of r->http_version in scgi module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4331
diff
changeset
|
976 if (u->headers_in.status_n) { |
3637 | 977 return NGX_OK; |
978 } | |
979 | |
980 if (u->headers_in.status) { | |
981 status_line = &u->headers_in.status->value; | |
982 | |
983 status = ngx_atoi(status_line->data, 3); | |
984 if (status == NGX_ERROR) { | |
985 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
986 "upstream sent invalid status \"%V\"", | |
987 status_line); | |
988 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
989 } | |
990 | |
991 u->headers_in.status_n = status; | |
992 u->headers_in.status_line = *status_line; | |
993 | |
994 } else if (u->headers_in.location) { | |
995 u->headers_in.status_n = 302; | |
996 ngx_str_set(&u->headers_in.status_line, | |
997 "302 Moved Temporarily"); | |
998 | |
999 } else { | |
1000 u->headers_in.status_n = 200; | |
1001 ngx_str_set(&u->headers_in.status_line, "200 OK"); | |
1002 } | |
1003 | |
1004 if (u->state) { | |
1005 u->state->status = u->headers_in.status_n; | |
1006 } | |
1007 | |
1008 return NGX_OK; | |
1009 } | |
1010 | |
1011 if (rc == NGX_AGAIN) { | |
1012 return NGX_AGAIN; | |
1013 } | |
1014 | |
1015 /* there was error while a header line parsing */ | |
1016 | |
1017 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
1018 "upstream sent invalid header"); | |
1019 | |
1020 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
1021 } | |
1022 } | |
1023 | |
1024 | |
1025 static void | |
1026 ngx_http_scgi_abort_request(ngx_http_request_t *r) | |
1027 { | |
1028 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1029 "abort http scgi request"); | |
1030 | |
1031 return; | |
1032 } | |
1033 | |
1034 | |
1035 static void | |
1036 ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
1037 { | |
1038 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1039 "finalize http scgi request"); | |
1040 | |
1041 return; | |
1042 } | |
1043 | |
1044 | |
1045 static void * | |
1046 ngx_http_scgi_create_loc_conf(ngx_conf_t *cf) | |
1047 { | |
1048 ngx_http_scgi_loc_conf_t *conf; | |
1049 | |
1050 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_loc_conf_t)); | |
1051 if (conf == NULL) { | |
1052 return NULL; | |
1053 } | |
1054 | |
1055 conf->upstream.store = NGX_CONF_UNSET; | |
1056 conf->upstream.store_access = NGX_CONF_UNSET_UINT; | |
1057 conf->upstream.buffering = NGX_CONF_UNSET; | |
1058 conf->upstream.ignore_client_abort = NGX_CONF_UNSET; | |
1059 | |
1060 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; | |
1061 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; | |
1062 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; | |
1063 | |
1064 conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE; | |
1065 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; | |
1066 | |
1067 conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE; | |
1068 conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE; | |
1069 conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE; | |
1070 | |
1071 conf->upstream.pass_request_headers = NGX_CONF_UNSET; | |
1072 conf->upstream.pass_request_body = NGX_CONF_UNSET; | |
1073 | |
1074 #if (NGX_HTTP_CACHE) | |
1075 conf->upstream.cache = NGX_CONF_UNSET_PTR; | |
1076 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
|
1077 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
|
1078 conf->upstream.no_cache = NGX_CONF_UNSET_PTR; |
3637 | 1079 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
|
1080 conf->upstream.cache_lock = NGX_CONF_UNSET; |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1081 conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC; |
3637 | 1082 #endif |
1083 | |
1084 conf->upstream.hide_headers = NGX_CONF_UNSET_PTR; | |
1085 conf->upstream.pass_headers = NGX_CONF_UNSET_PTR; | |
1086 | |
1087 conf->upstream.intercept_errors = NGX_CONF_UNSET; | |
1088 | |
1089 /* "scgi_cyclic_temp_file" is disabled */ | |
1090 conf->upstream.cyclic_temp_file = 0; | |
1091 | |
4157
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
1092 conf->upstream.change_buffering = 1; |
9d59a8eda373
Added uwsgi_buffering and scgi_buffering directives.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4015
diff
changeset
|
1093 |
3976
215fe9223419
update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents:
3879
diff
changeset
|
1094 ngx_str_set(&conf->upstream.module, "scgi"); |
215fe9223419
update r3945 with more descriptive error message
Igor Sysoev <igor@sysoev.ru>
parents:
3879
diff
changeset
|
1095 |
3637 | 1096 return conf; |
1097 } | |
1098 | |
1099 | |
1100 static char * | |
1101 ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) | |
1102 { | |
1103 ngx_http_scgi_loc_conf_t *prev = parent; | |
1104 ngx_http_scgi_loc_conf_t *conf = child; | |
1105 | |
1106 size_t size; | |
1107 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
|
1108 ngx_http_core_loc_conf_t *clcf; |
3637 | 1109 |
1110 if (conf->upstream.store != 0) { | |
1111 ngx_conf_merge_value(conf->upstream.store, prev->upstream.store, 0); | |
1112 | |
1113 if (conf->upstream.store_lengths == NULL) { | |
1114 conf->upstream.store_lengths = prev->upstream.store_lengths; | |
1115 conf->upstream.store_values = prev->upstream.store_values; | |
1116 } | |
1117 } | |
1118 | |
1119 ngx_conf_merge_uint_value(conf->upstream.store_access, | |
1120 prev->upstream.store_access, 0600); | |
1121 | |
1122 ngx_conf_merge_value(conf->upstream.buffering, | |
1123 prev->upstream.buffering, 1); | |
1124 | |
1125 ngx_conf_merge_value(conf->upstream.ignore_client_abort, | |
1126 prev->upstream.ignore_client_abort, 0); | |
1127 | |
1128 ngx_conf_merge_msec_value(conf->upstream.connect_timeout, | |
1129 prev->upstream.connect_timeout, 60000); | |
1130 | |
1131 ngx_conf_merge_msec_value(conf->upstream.send_timeout, | |
1132 prev->upstream.send_timeout, 60000); | |
1133 | |
1134 ngx_conf_merge_msec_value(conf->upstream.read_timeout, | |
1135 prev->upstream.read_timeout, 60000); | |
1136 | |
1137 ngx_conf_merge_size_value(conf->upstream.send_lowat, | |
1138 prev->upstream.send_lowat, 0); | |
1139 | |
1140 ngx_conf_merge_size_value(conf->upstream.buffer_size, | |
1141 prev->upstream.buffer_size, | |
1142 (size_t) ngx_pagesize); | |
1143 | |
1144 | |
1145 ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs, | |
1146 8, ngx_pagesize); | |
1147 | |
1148 if (conf->upstream.bufs.num < 2) { | |
1149 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1150 "there must be at least 2 \"scgi_buffers\""); | |
1151 return NGX_CONF_ERROR; | |
1152 } | |
1153 | |
1154 | |
1155 size = conf->upstream.buffer_size; | |
1156 if (size < conf->upstream.bufs.size) { | |
1157 size = conf->upstream.bufs.size; | |
1158 } | |
1159 | |
1160 | |
1161 ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf, | |
1162 prev->upstream.busy_buffers_size_conf, | |
1163 NGX_CONF_UNSET_SIZE); | |
1164 | |
1165 if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) { | |
1166 conf->upstream.busy_buffers_size = 2 * size; | |
1167 } else { | |
1168 conf->upstream.busy_buffers_size = | |
1169 conf->upstream.busy_buffers_size_conf; | |
1170 } | |
1171 | |
1172 if (conf->upstream.busy_buffers_size < size) { | |
1173 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1174 "\"scgi_busy_buffers_size\" must be equal or bigger " | |
1175 "than maximum of the value of \"scgi_buffer_size\" and " | |
1176 "one of the \"scgi_buffers\""); | |
1177 | |
1178 return NGX_CONF_ERROR; | |
1179 } | |
1180 | |
1181 if (conf->upstream.busy_buffers_size | |
1182 > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size) | |
1183 { | |
1184 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1185 "\"scgi_busy_buffers_size\" must be less than " | |
1186 "the size of all \"scgi_buffers\" minus one buffer"); | |
1187 | |
1188 return NGX_CONF_ERROR; | |
1189 } | |
1190 | |
1191 | |
1192 ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf, | |
1193 prev->upstream.temp_file_write_size_conf, | |
1194 NGX_CONF_UNSET_SIZE); | |
1195 | |
1196 if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) { | |
1197 conf->upstream.temp_file_write_size = 2 * size; | |
1198 } else { | |
1199 conf->upstream.temp_file_write_size = | |
1200 conf->upstream.temp_file_write_size_conf; | |
1201 } | |
1202 | |
1203 if (conf->upstream.temp_file_write_size < size) { | |
1204 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1205 "\"scgi_temp_file_write_size\" must be equal or bigger than " | |
1206 "maximum of the value of \"scgi_buffer_size\" and " | |
1207 "one of the \"scgi_buffers\""); | |
1208 | |
1209 return NGX_CONF_ERROR; | |
1210 } | |
1211 | |
1212 | |
1213 ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf, | |
1214 prev->upstream.max_temp_file_size_conf, | |
1215 NGX_CONF_UNSET_SIZE); | |
1216 | |
1217 if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) { | |
1218 conf->upstream.max_temp_file_size = 1024 * 1024 * 1024; | |
1219 } else { | |
1220 conf->upstream.max_temp_file_size = | |
1221 conf->upstream.max_temp_file_size_conf; | |
1222 } | |
1223 | |
1224 if (conf->upstream.max_temp_file_size != 0 | |
1225 && conf->upstream.max_temp_file_size < size) { | |
1226 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1227 "\"scgi_max_temp_file_size\" must be equal to zero to disable " | |
1228 "the temporary files usage or must be equal or bigger than " | |
1229 "maximum of the value of \"scgi_buffer_size\" and " | |
1230 "one of the \"scgi_buffers\""); | |
1231 | |
1232 return NGX_CONF_ERROR; | |
1233 } | |
1234 | |
1235 | |
1236 ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers, | |
1237 prev->upstream.ignore_headers, | |
1238 NGX_CONF_BITMASK_SET); | |
1239 | |
1240 | |
1241 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, | |
1242 prev->upstream.next_upstream, | |
1243 (NGX_CONF_BITMASK_SET | |
1244 |NGX_HTTP_UPSTREAM_FT_ERROR | |
1245 |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); | |
1246 | |
1247 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { | |
1248 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET | |
1249 |NGX_HTTP_UPSTREAM_FT_OFF; | |
1250 } | |
1251 | |
1252 if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path, | |
1253 prev->upstream.temp_path, | |
1254 &ngx_http_scgi_temp_path) | |
1255 != NGX_OK) | |
1256 { | |
1257 return NGX_CONF_ERROR; | |
1258 } | |
1259 | |
1260 #if (NGX_HTTP_CACHE) | |
1261 | |
1262 ngx_conf_merge_ptr_value(conf->upstream.cache, | |
1263 prev->upstream.cache, NULL); | |
1264 | |
1265 if (conf->upstream.cache && conf->upstream.cache->data == NULL) { | |
1266 ngx_shm_zone_t *shm_zone; | |
1267 | |
1268 shm_zone = conf->upstream.cache; | |
1269 | |
1270 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
1271 "\"scgi_cache\" zone \"%V\" is unknown", | |
1272 &shm_zone->shm.name); | |
1273 | |
1274 return NGX_CONF_ERROR; | |
1275 } | |
1276 | |
1277 ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, | |
1278 prev->upstream.cache_min_uses, 1); | |
1279 | |
1280 ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, | |
1281 prev->upstream.cache_use_stale, | |
1282 (NGX_CONF_BITMASK_SET | |
1283 |NGX_HTTP_UPSTREAM_FT_OFF)); | |
1284 | |
1285 if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) { | |
1286 conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET | |
1287 |NGX_HTTP_UPSTREAM_FT_OFF; | |
1288 } | |
1289 | |
4401
d45742815c90
Fixed proxy_cache_use_stale in "no live upstreams" case.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4386
diff
changeset
|
1290 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
|
1291 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
|
1292 } |
d45742815c90
Fixed proxy_cache_use_stale in "no live upstreams" case.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4386
diff
changeset
|
1293 |
3637 | 1294 if (conf->upstream.cache_methods == 0) { |
1295 conf->upstream.cache_methods = prev->upstream.cache_methods; | |
1296 } | |
1297 | |
1298 conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD; | |
1299 | |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3693
diff
changeset
|
1300 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
|
1301 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
|
1302 |
3637 | 1303 ngx_conf_merge_ptr_value(conf->upstream.no_cache, |
1304 prev->upstream.no_cache, NULL); | |
1305 | |
1306 ngx_conf_merge_ptr_value(conf->upstream.cache_valid, | |
1307 prev->upstream.cache_valid, NULL); | |
1308 | |
1309 if (conf->cache_key.value.data == NULL) { | |
1310 conf->cache_key = prev->cache_key; | |
1311 } | |
1312 | |
4386
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1313 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
|
1314 prev->upstream.cache_lock, 0); |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1315 |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1316 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
|
1317 prev->upstream.cache_lock_timeout, 5000); |
92deb73393f7
Cache lock support for fastcgi, scgi, uwsgi.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4373
diff
changeset
|
1318 |
3637 | 1319 #endif |
1320 | |
1321 ngx_conf_merge_value(conf->upstream.pass_request_headers, | |
1322 prev->upstream.pass_request_headers, 1); | |
1323 ngx_conf_merge_value(conf->upstream.pass_request_body, | |
1324 prev->upstream.pass_request_body, 1); | |
1325 | |
1326 ngx_conf_merge_value(conf->upstream.intercept_errors, | |
1327 prev->upstream.intercept_errors, 0); | |
1328 | |
1329 hash.max_size = 512; | |
1330 hash.bucket_size = ngx_align(64, ngx_cacheline_size); | |
1331 hash.name = "scgi_hide_headers_hash"; | |
1332 | |
1333 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
|
1334 &prev->upstream, ngx_http_scgi_hide_headers, &hash) |
3637 | 1335 != NGX_OK) |
1336 { | |
1337 return NGX_CONF_ERROR; | |
1338 } | |
1339 | |
1340 if (conf->upstream.upstream == NULL) { | |
1341 conf->upstream.upstream = prev->upstream.upstream; | |
1342 } | |
1343 | |
1344 if (conf->scgi_lengths == NULL) { | |
1345 conf->scgi_lengths = prev->scgi_lengths; | |
1346 conf->scgi_values = prev->scgi_values; | |
1347 } | |
1348 | |
3731
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1349 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
|
1350 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
|
1351 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
|
1352 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
|
1353 } |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1354 } |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
1355 |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1356 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
|
1357 return NGX_CONF_ERROR; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1358 } |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1359 |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1360 return NGX_CONF_OK; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1361 } |
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 static ngx_int_t |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1365 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
|
1366 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
|
1367 { |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1368 u_char *p; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1369 size_t size; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1370 uintptr_t *code; |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1371 ngx_uint_t i, nsrc; |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1372 ngx_array_t headers_names; |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1373 #if (NGX_HTTP_CACHE) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1374 ngx_array_t params_merged; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1375 #endif |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1376 ngx_hash_key_t *hk; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1377 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
|
1378 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
|
1379 ngx_http_script_compile_t sc; |
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1380 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
|
1381 |
3637 | 1382 if (conf->params_source == NULL) { |
1383 conf->params_source = prev->params_source; | |
1384 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1385 if (prev->headers_hash.buckets |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1386 #if (NGX_HTTP_CACHE) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1387 && ((conf->upstream.cache == NULL) == (prev->upstream.cache == NULL)) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1388 #endif |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1389 ) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1390 { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1391 conf->flushes = prev->flushes; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1392 conf->params_len = prev->params_len; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1393 conf->params = prev->params; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1394 conf->headers_hash = prev->headers_hash; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1395 conf->header_params = prev->header_params; |
3637 | 1396 |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1397 return NGX_OK; |
3637 | 1398 } |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1399 } |
3637 | 1400 |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1401 if (conf->params_source == NULL |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1402 #if (NGX_HTTP_CACHE) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1403 && (conf->upstream.cache == NULL) |
3637 | 1404 #endif |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1405 ) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1406 { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1407 conf->headers_hash.buckets = (void *) 1; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1408 return NGX_OK; |
3637 | 1409 } |
1410 | |
1411 conf->params_len = ngx_array_create(cf->pool, 64, 1); | |
1412 if (conf->params_len == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1413 return NGX_ERROR; |
3637 | 1414 } |
1415 | |
1416 conf->params = ngx_array_create(cf->pool, 512, 1); | |
1417 if (conf->params == 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 if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) | |
1422 != NGX_OK) | |
1423 { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1424 return NGX_ERROR; |
3637 | 1425 } |
1426 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1427 if (conf->params_source) { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1428 src = conf->params_source->elts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1429 nsrc = conf->params_source->nelts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1430 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1431 } else { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1432 src = NULL; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1433 nsrc = 0; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1434 } |
3637 | 1435 |
1436 #if (NGX_HTTP_CACHE) | |
1437 | |
1438 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
|
1439 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
|
1440 ngx_http_upstream_param_t *s; |
3637 | 1441 |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1442 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
|
1443 sizeof(ngx_http_upstream_param_t)) |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1444 != NGX_OK) |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1445 { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1446 return NGX_ERROR; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1447 } |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1448 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1449 for (i = 0; i < nsrc; i++) { |
3637 | 1450 |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1451 s = ngx_array_push(¶ms_merged); |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1452 if (s == NULL) { |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1453 return NGX_ERROR; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1454 } |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1455 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1456 *s = src[i]; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1457 } |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1458 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1459 h = ngx_http_scgi_cache_headers; |
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 while (h->key.len) { |
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 src = params_merged.elts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1464 nsrc = params_merged.nelts; |
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 for (i = 0; i < nsrc; i++) { |
3637 | 1467 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { |
1468 goto next; | |
1469 } | |
1470 } | |
1471 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1472 s = ngx_array_push(¶ms_merged); |
3637 | 1473 if (s == NULL) { |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1474 return NGX_ERROR; |
3637 | 1475 } |
1476 | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1477 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
|
1478 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
|
1479 s->skip_empty = 0; |
3637 | 1480 |
1481 next: | |
1482 | |
1483 h++; | |
1484 } | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1485 |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1486 src = params_merged.elts; |
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1487 nsrc = params_merged.nelts; |
3637 | 1488 } |
1489 | |
1490 #endif | |
1491 | |
4278
f57229cba7ad
Fixed fastcgi/scgi/uwsgi_param inheritance.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4277
diff
changeset
|
1492 for (i = 0; i < nsrc; i++) { |
3637 | 1493 |
1494 if (src[i].key.len > sizeof("HTTP_") - 1 | |
1495 && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0) | |
1496 { | |
1497 hk = ngx_array_push(&headers_names); | |
1498 if (hk == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1499 return NGX_ERROR; |
3637 | 1500 } |
1501 | |
1502 hk->key.len = src[i].key.len - 5; | |
1503 hk->key.data = src[i].key.data + 5; | |
1504 hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len); | |
1505 hk->value = (void *) 1; | |
1506 | |
1507 if (src[i].value.len == 0) { | |
1508 continue; | |
1509 } | |
1510 } | |
1511 | |
1512 copy = ngx_array_push_n(conf->params_len, | |
1513 sizeof(ngx_http_script_copy_code_t)); | |
1514 if (copy == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1515 return NGX_ERROR; |
3637 | 1516 } |
1517 | |
1518 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; | |
1519 copy->len = src[i].key.len + 1; | |
1520 | |
4331
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1521 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
|
1522 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
|
1523 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
|
1524 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
|
1525 } |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1526 |
059260de158d
SCGI: added "if_not_empty" flag support to the "scgi_param" directive.
Valentin Bartenev <vbart@nginx.com>
parents:
4294
diff
changeset
|
1527 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
|
1528 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
|
1529 |
3637 | 1530 |
1531 size = (sizeof(ngx_http_script_copy_code_t) | |
1532 + src[i].key.len + 1 + sizeof(uintptr_t) - 1) | |
1533 & ~(sizeof(uintptr_t) - 1); | |
1534 | |
1535 copy = ngx_array_push_n(conf->params, size); | |
1536 if (copy == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1537 return NGX_ERROR; |
3637 | 1538 } |
1539 | |
1540 copy->code = ngx_http_script_copy_code; | |
1541 copy->len = src[i].key.len + 1; | |
1542 | |
1543 p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t); | |
1544 (void) ngx_cpystrn(p, src[i].key.data, src[i].key.len + 1); | |
1545 | |
1546 | |
1547 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); | |
1548 | |
1549 sc.cf = cf; | |
1550 sc.source = &src[i].value; | |
1551 sc.flushes = &conf->flushes; | |
1552 sc.lengths = &conf->params_len; | |
1553 sc.values = &conf->params; | |
1554 | |
1555 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
|
1556 return NGX_ERROR; |
3637 | 1557 } |
1558 | |
1559 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | |
1560 if (code == NULL) { | |
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 = (uintptr_t) NULL; | |
1565 | |
1566 | |
1567 code = ngx_array_push_n(conf->params, sizeof(uintptr_t)); | |
1568 if (code == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1569 return NGX_ERROR; |
3637 | 1570 } |
1571 | |
1572 *code = (uintptr_t) NULL; | |
1573 } | |
1574 | |
1575 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | |
1576 if (code == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1577 return NGX_ERROR; |
3637 | 1578 } |
1579 | |
1580 *code = (uintptr_t) NULL; | |
1581 | |
1582 code = ngx_array_push_n(conf->params, sizeof(uintptr_t)); | |
1583 if (code == NULL) { | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1584 return NGX_ERROR; |
3637 | 1585 } |
1586 | |
1587 *code = (uintptr_t) NULL; | |
1588 | |
1589 conf->header_params = headers_names.nelts; | |
1590 | |
1591 hash.hash = &conf->headers_hash; | |
1592 hash.key = ngx_hash_key_lc; | |
1593 hash.max_size = 512; | |
1594 hash.bucket_size = 64; | |
1595 hash.name = "scgi_params_hash"; | |
1596 hash.pool = cf->pool; | |
1597 hash.temp_pool = NULL; | |
1598 | |
4277
e4b8255e44c3
Separate functions to merge fastcgi/scgi/uwsgi params.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4157
diff
changeset
|
1599 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); |
3637 | 1600 } |
1601 | |
1602 | |
1603 static char * | |
1604 ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1605 { | |
1606 ngx_http_scgi_loc_conf_t *scf = conf; | |
1607 | |
1608 ngx_url_t u; | |
1609 ngx_str_t *value, *url; | |
1610 ngx_uint_t n; | |
1611 ngx_http_core_loc_conf_t *clcf; | |
1612 ngx_http_script_compile_t sc; | |
1613 | |
1614 if (scf->upstream.upstream || scf->scgi_lengths) { | |
1615 return "is duplicate"; | |
1616 } | |
1617 | |
1618 clcf = ngx_http_conf_get_module_loc_conf (cf, ngx_http_core_module); | |
1619 clcf->handler = ngx_http_scgi_handler; | |
1620 | |
1621 value = cf->args->elts; | |
1622 | |
1623 url = &value[1]; | |
1624 | |
1625 n = ngx_http_script_variables_count(url); | |
1626 | |
1627 if (n) { | |
1628 | |
1629 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); | |
1630 | |
1631 sc.cf = cf; | |
1632 sc.source = url; | |
1633 sc.lengths = &scf->scgi_lengths; | |
1634 sc.values = &scf->scgi_values; | |
1635 sc.variables = n; | |
1636 sc.complete_lengths = 1; | |
1637 sc.complete_values = 1; | |
1638 | |
1639 if (ngx_http_script_compile(&sc) != NGX_OK) { | |
1640 return NGX_CONF_ERROR; | |
1641 } | |
1642 | |
1643 return NGX_CONF_OK; | |
1644 } | |
1645 | |
1646 ngx_memzero(&u, sizeof(ngx_url_t)); | |
1647 | |
1648 u.url = value[1]; | |
1649 u.no_resolve = 1; | |
1650 | |
1651 scf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); | |
1652 if (scf->upstream.upstream == NULL) { | |
1653 return NGX_CONF_ERROR; | |
1654 } | |
1655 | |
1656 if (clcf->name.data[clcf->name.len - 1] == '/') { | |
1657 clcf->auto_redirect = 1; | |
1658 } | |
1659 | |
1660 return NGX_CONF_OK; | |
1661 } | |
1662 | |
1663 | |
1664 static char * | |
1665 ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1666 { | |
1667 ngx_http_scgi_loc_conf_t *scf = conf; | |
1668 | |
1669 ngx_str_t *value; | |
1670 ngx_http_script_compile_t sc; | |
1671 | |
1672 if (scf->upstream.store != NGX_CONF_UNSET || scf->upstream.store_lengths) { | |
1673 return "is duplicate"; | |
1674 } | |
1675 | |
1676 value = cf->args->elts; | |
1677 | |
1678 if (ngx_strcmp(value[1].data, "off") == 0) { | |
1679 scf->upstream.store = 0; | |
1680 return NGX_CONF_OK; | |
1681 } | |
1682 | |
1683 #if (NGX_HTTP_CACHE) | |
1684 | |
1685 if (scf->upstream.cache != NGX_CONF_UNSET_PTR | |
1686 && scf->upstream.cache != NULL) | |
1687 { | |
1688 return "is incompatible with \"scgi_cache\""; | |
1689 } | |
1690 | |
1691 #endif | |
1692 | |
1693 if (ngx_strcmp(value[1].data, "on") == 0) { | |
1694 scf->upstream.store = 1; | |
1695 return NGX_CONF_OK; | |
1696 } | |
1697 | |
1698 /* include the terminating '\0' into script */ | |
1699 value[1].len++; | |
1700 | |
1701 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); | |
1702 | |
1703 sc.cf = cf; | |
1704 sc.source = &value[1]; | |
1705 sc.lengths = &scf->upstream.store_lengths; | |
1706 sc.values = &scf->upstream.store_values; | |
1707 sc.variables = ngx_http_script_variables_count(&value[1]);; | |
1708 sc.complete_lengths = 1; | |
1709 sc.complete_values = 1; | |
1710 | |
1711 if (ngx_http_script_compile(&sc) != NGX_OK) { | |
1712 return NGX_CONF_ERROR; | |
1713 } | |
1714 | |
1715 return NGX_CONF_OK; | |
1716 } | |
1717 | |
1718 | |
1719 #if (NGX_HTTP_CACHE) | |
1720 | |
1721 static char * | |
1722 ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1723 { | |
1724 ngx_http_scgi_loc_conf_t *scf = conf; | |
1725 | |
1726 ngx_str_t *value; | |
1727 | |
1728 value = cf->args->elts; | |
1729 | |
1730 if (scf->upstream.cache != NGX_CONF_UNSET_PTR) { | |
1731 return "is duplicate"; | |
1732 } | |
1733 | |
1734 if (ngx_strcmp(value[1].data, "off") == 0) { | |
1735 scf->upstream.cache = NULL; | |
1736 return NGX_CONF_OK; | |
1737 } | |
1738 | |
1739 if (scf->upstream.store > 0 || scf->upstream.store_lengths) { | |
1740 return "is incompatible with \"scgi_store\""; | |
1741 } | |
1742 | |
1743 scf->upstream.cache = ngx_shared_memory_add(cf, &value[1], 0, | |
1744 &ngx_http_scgi_module); | |
1745 if (scf->upstream.cache == NULL) { | |
1746 return NGX_CONF_ERROR; | |
1747 } | |
1748 | |
1749 return NGX_CONF_OK; | |
1750 } | |
1751 | |
1752 | |
1753 static char * | |
1754 ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
1755 { | |
1756 ngx_http_scgi_loc_conf_t *scf = conf; | |
1757 | |
1758 ngx_str_t *value; | |
1759 ngx_http_compile_complex_value_t ccv; | |
1760 | |
1761 value = cf->args->elts; | |
1762 | |
1763 if (scf->cache_key.value.len) { | |
1764 return "is duplicate"; | |
1765 } | |
1766 | |
1767 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); | |
1768 | |
1769 ccv.cf = cf; | |
1770 ccv.value = &value[1]; | |
1771 ccv.complex_value = &scf->cache_key; | |
1772 | |
1773 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { | |
1774 return NGX_CONF_ERROR; | |
1775 } | |
1776 | |
1777 return NGX_CONF_OK; | |
1778 } | |
1779 | |
1780 #endif |