Mercurial > hg > nginx
annotate src/http/modules/ngx_http_fastcgi_module.c @ 4367:9c4acdf9b276 stable-1.0
Merge of r4315:
Allowed add_header for proxied 206 replies.
It was working for nginx's own 206 replies as they are seen as 200 in the
headers filter module (range filter goes later in the headers filter chain),
but not for proxied replies.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 14 Dec 2011 18:06:21 +0000 |
parents | 94b995c7c614 |
children | 2b2d51cdbd97 |
rev | line source |
---|---|
479 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #include <ngx_config.h> | |
8 #include <ngx_core.h> | |
9 #include <ngx_http.h> | |
10 | |
11 | |
12 typedef struct { | |
651 | 13 ngx_http_upstream_conf_t upstream; |
14 | |
15 ngx_str_t index; | |
16 | |
17 ngx_array_t *flushes; | |
18 ngx_array_t *params_len; | |
19 ngx_array_t *params; | |
20 ngx_array_t *params_source; | |
1228 | 21 ngx_array_t *catch_stderr; |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
22 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
23 ngx_array_t *fastcgi_lengths; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
24 ngx_array_t *fastcgi_values; |
2443 | 25 |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
26 ngx_hash_t headers_hash; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
27 ngx_uint_t header_params; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
28 |
2602 | 29 #if (NGX_HTTP_CACHE) |
30 ngx_http_complex_value_t cache_key; | |
31 #endif | |
32 | |
2443 | 33 #if (NGX_PCRE) |
34 ngx_regex_t *split_regex; | |
35 ngx_str_t split_name; | |
36 #endif | |
479 | 37 } ngx_http_fastcgi_loc_conf_t; |
38 | |
39 | |
40 typedef enum { | |
41 ngx_http_fastcgi_st_version = 0, | |
42 ngx_http_fastcgi_st_type, | |
43 ngx_http_fastcgi_st_request_id_hi, | |
44 ngx_http_fastcgi_st_request_id_lo, | |
45 ngx_http_fastcgi_st_content_length_hi, | |
46 ngx_http_fastcgi_st_content_length_lo, | |
47 ngx_http_fastcgi_st_padding_length, | |
48 ngx_http_fastcgi_st_reserved, | |
49 ngx_http_fastcgi_st_data, | |
515 | 50 ngx_http_fastcgi_st_padding |
479 | 51 } ngx_http_fastcgi_state_e; |
52 | |
53 | |
54 typedef struct { | |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
55 u_char *start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
56 u_char *end; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
57 } ngx_http_fastcgi_split_part_t; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
58 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
59 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
60 typedef struct { |
651 | 61 ngx_http_fastcgi_state_e state; |
62 u_char *pos; | |
63 u_char *last; | |
64 ngx_uint_t type; | |
65 size_t length; | |
66 size_t padding; | |
67 | |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
68 unsigned fastcgi_stdout:1; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
69 unsigned large_stderr:1; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
70 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
71 ngx_array_t *split_parts; |
2443 | 72 |
73 ngx_str_t script_name; | |
74 ngx_str_t path_info; | |
479 | 75 } ngx_http_fastcgi_ctx_t; |
76 | |
77 | |
78 #define NGX_HTTP_FASTCGI_RESPONDER 1 | |
79 | |
80 #define NGX_HTTP_FASTCGI_BEGIN_REQUEST 1 | |
81 #define NGX_HTTP_FASTCGI_ABORT_REQUEST 2 | |
82 #define NGX_HTTP_FASTCGI_END_REQUEST 3 | |
83 #define NGX_HTTP_FASTCGI_PARAMS 4 | |
84 #define NGX_HTTP_FASTCGI_STDIN 5 | |
85 #define NGX_HTTP_FASTCGI_STDOUT 6 | |
86 #define NGX_HTTP_FASTCGI_STDERR 7 | |
87 #define NGX_HTTP_FASTCGI_DATA 8 | |
88 | |
89 | |
90 typedef struct { | |
91 u_char version; | |
92 u_char type; | |
93 u_char request_id_hi; | |
94 u_char request_id_lo; | |
95 u_char content_length_hi; | |
96 u_char content_length_lo; | |
97 u_char padding_length; | |
98 u_char reserved; | |
99 } ngx_http_fastcgi_header_t; | |
100 | |
101 | |
102 typedef struct { | |
103 u_char role_hi; | |
104 u_char role_lo; | |
105 u_char flags; | |
106 u_char reserved[5]; | |
107 } ngx_http_fastcgi_begin_request_t; | |
108 | |
109 | |
509 | 110 typedef struct { |
111 u_char version; | |
112 u_char type; | |
113 u_char request_id_hi; | |
114 u_char request_id_lo; | |
115 } ngx_http_fastcgi_header_small_t; | |
116 | |
117 | |
118 typedef struct { | |
119 ngx_http_fastcgi_header_t h0; | |
120 ngx_http_fastcgi_begin_request_t br; | |
121 ngx_http_fastcgi_header_small_t h1; | |
122 } ngx_http_fastcgi_request_start_t; | |
123 | |
124 | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
125 static ngx_int_t ngx_http_fastcgi_eval(ngx_http_request_t *r, |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
126 ngx_http_fastcgi_loc_conf_t *flcf); |
2602 | 127 #if (NGX_HTTP_CACHE) |
128 static ngx_int_t ngx_http_fastcgi_create_key(ngx_http_request_t *r); | |
129 #endif | |
479 | 130 static ngx_int_t ngx_http_fastcgi_create_request(ngx_http_request_t *r); |
131 static ngx_int_t ngx_http_fastcgi_reinit_request(ngx_http_request_t *r); | |
132 static ngx_int_t ngx_http_fastcgi_process_header(ngx_http_request_t *r); | |
133 static ngx_int_t ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, | |
487 | 134 ngx_buf_t *buf); |
479 | 135 static ngx_int_t ngx_http_fastcgi_process_record(ngx_http_request_t *r, |
487 | 136 ngx_http_fastcgi_ctx_t *f); |
479 | 137 static void ngx_http_fastcgi_abort_request(ngx_http_request_t *r); |
138 static void ngx_http_fastcgi_finalize_request(ngx_http_request_t *r, | |
487 | 139 ngx_int_t rc); |
479 | 140 |
509 | 141 static ngx_int_t ngx_http_fastcgi_add_variables(ngx_conf_t *cf); |
142 static void *ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf); | |
143 static char *ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, | |
144 void *parent, void *child); | |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
145 static ngx_int_t ngx_http_fastcgi_merge_params(ngx_conf_t *cf, |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
146 ngx_http_fastcgi_loc_conf_t *conf, ngx_http_fastcgi_loc_conf_t *prev); |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
147 |
573 | 148 static ngx_int_t ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, |
149 ngx_http_variable_value_t *v, uintptr_t data); | |
2443 | 150 static ngx_int_t ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r, |
151 ngx_http_variable_value_t *v, uintptr_t data); | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
152 static ngx_http_fastcgi_ctx_t *ngx_http_fastcgi_split(ngx_http_request_t *r, |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
153 ngx_http_fastcgi_loc_conf_t *flcf); |
509 | 154 |
479 | 155 static char *ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, |
487 | 156 void *conf); |
2443 | 157 static char *ngx_http_fastcgi_split_path_info(ngx_conf_t *cf, |
158 ngx_command_t *cmd, void *conf); | |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
159 static char *ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd, |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
160 void *conf); |
2602 | 161 #if (NGX_HTTP_CACHE) |
162 static char *ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, | |
163 void *conf); | |
164 static char *ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, | |
165 void *conf); | |
166 #endif | |
167 | |
479 | 168 static char *ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post, |
487 | 169 void *data); |
479 | 170 |
171 | |
509 | 172 static ngx_conf_post_t ngx_http_fastcgi_lowat_post = |
173 { ngx_http_fastcgi_lowat_check }; | |
479 | 174 |
175 | |
176 static ngx_conf_bitmask_t ngx_http_fastcgi_next_upstream_masks[] = { | |
177 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, | |
178 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, | |
179 { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, | |
180 { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 }, | |
623 | 181 { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 }, |
479 | 182 { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, |
2927
55ceaef03d34
proxy_cache_use_stale/fastcgi_cache_use_stale updating
Igor Sysoev <igor@sysoev.ru>
parents:
2912
diff
changeset
|
183 { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING }, |
665 | 184 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, |
479 | 185 { ngx_null_string, 0 } |
186 }; | |
187 | |
188 | |
2602 | 189 ngx_module_t ngx_http_fastcgi_module; |
190 | |
191 | |
479 | 192 static ngx_command_t ngx_http_fastcgi_commands[] = { |
193 | |
194 { ngx_string("fastcgi_pass"), | |
629 | 195 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, |
479 | 196 ngx_http_fastcgi_pass, |
197 NGX_HTTP_LOC_CONF_OFFSET, | |
198 0, | |
199 NULL }, | |
200 | |
201 { ngx_string("fastcgi_index"), | |
202 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
203 ngx_conf_set_str_slot, | |
204 NGX_HTTP_LOC_CONF_OFFSET, | |
205 offsetof(ngx_http_fastcgi_loc_conf_t, index), | |
206 NULL }, | |
207 | |
2443 | 208 { ngx_string("fastcgi_split_path_info"), |
209 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
210 ngx_http_fastcgi_split_path_info, | |
211 NGX_HTTP_LOC_CONF_OFFSET, | |
212 0, | |
213 NULL }, | |
214 | |
1291
13a4ce6e7f1e
proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents:
1276
diff
changeset
|
215 { ngx_string("fastcgi_store"), |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
216 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
217 ngx_http_fastcgi_store, |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
218 NGX_HTTP_LOC_CONF_OFFSET, |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
219 0, |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
220 NULL }, |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
221 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
222 { ngx_string("fastcgi_store_access"), |
1291
13a4ce6e7f1e
proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents:
1276
diff
changeset
|
223 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, |
13a4ce6e7f1e
proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents:
1276
diff
changeset
|
224 ngx_conf_set_access_slot, |
13a4ce6e7f1e
proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents:
1276
diff
changeset
|
225 NGX_HTTP_LOC_CONF_OFFSET, |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
226 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.store_access), |
1291
13a4ce6e7f1e
proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents:
1276
diff
changeset
|
227 NULL }, |
13a4ce6e7f1e
proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents:
1276
diff
changeset
|
228 |
629 | 229 { ngx_string("fastcgi_ignore_client_abort"), |
230 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
231 ngx_conf_set_flag_slot, | |
232 NGX_HTTP_LOC_CONF_OFFSET, | |
233 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_client_abort), | |
234 NULL }, | |
235 | |
3271
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3197
diff
changeset
|
236 { ngx_string("fastcgi_bind"), |
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3197
diff
changeset
|
237 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
3399 | 238 ngx_http_upstream_bind_set_slot, |
3271
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3197
diff
changeset
|
239 NGX_HTTP_LOC_CONF_OFFSET, |
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3197
diff
changeset
|
240 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.local), |
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3197
diff
changeset
|
241 NULL }, |
fcd98af88df3
proxy_bind, fastcgi_bind, and memcached_bind
Igor Sysoev <igor@sysoev.ru>
parents:
3197
diff
changeset
|
242 |
479 | 243 { ngx_string("fastcgi_connect_timeout"), |
244 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
245 ngx_conf_set_msec_slot, | |
246 NGX_HTTP_LOC_CONF_OFFSET, | |
247 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.connect_timeout), | |
248 NULL }, | |
249 | |
250 { ngx_string("fastcgi_send_timeout"), | |
251 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
252 ngx_conf_set_msec_slot, | |
253 NGX_HTTP_LOC_CONF_OFFSET, | |
254 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_timeout), | |
255 NULL }, | |
256 | |
257 { ngx_string("fastcgi_send_lowat"), | |
258 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
259 ngx_conf_set_size_slot, | |
260 NGX_HTTP_LOC_CONF_OFFSET, | |
261 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_lowat), | |
262 &ngx_http_fastcgi_lowat_post }, | |
263 | |
581 | 264 { ngx_string("fastcgi_buffer_size"), |
265 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
266 ngx_conf_set_size_slot, | |
267 NGX_HTTP_LOC_CONF_OFFSET, | |
268 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffer_size), | |
269 NULL }, | |
270 | |
509 | 271 { ngx_string("fastcgi_pass_request_headers"), |
272 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
273 ngx_conf_set_flag_slot, | |
274 NGX_HTTP_LOC_CONF_OFFSET, | |
275 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_headers), | |
276 NULL }, | |
277 | |
278 { ngx_string("fastcgi_pass_request_body"), | |
279 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
280 ngx_conf_set_flag_slot, | |
281 NGX_HTTP_LOC_CONF_OFFSET, | |
282 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_body), | |
283 NULL }, | |
284 | |
657 | 285 { ngx_string("fastcgi_intercept_errors"), |
286 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | |
287 ngx_conf_set_flag_slot, | |
288 NGX_HTTP_LOC_CONF_OFFSET, | |
289 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.intercept_errors), | |
290 NULL }, | |
291 | |
479 | 292 { ngx_string("fastcgi_read_timeout"), |
293 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
294 ngx_conf_set_msec_slot, | |
295 NGX_HTTP_LOC_CONF_OFFSET, | |
296 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.read_timeout), | |
297 NULL }, | |
298 | |
299 { ngx_string("fastcgi_buffers"), | |
300 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, | |
301 ngx_conf_set_bufs_slot, | |
302 NGX_HTTP_LOC_CONF_OFFSET, | |
303 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.bufs), | |
304 NULL }, | |
305 | |
306 { ngx_string("fastcgi_busy_buffers_size"), | |
307 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
308 ngx_conf_set_size_slot, | |
309 NGX_HTTP_LOC_CONF_OFFSET, | |
529 | 310 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.busy_buffers_size_conf), |
479 | 311 NULL }, |
312 | |
2602 | 313 #if (NGX_HTTP_CACHE) |
314 | |
315 { ngx_string("fastcgi_cache"), | |
3729 | 316 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
2602 | 317 ngx_http_fastcgi_cache, |
318 NGX_HTTP_LOC_CONF_OFFSET, | |
319 0, | |
320 NULL }, | |
321 | |
322 { ngx_string("fastcgi_cache_key"), | |
3729 | 323 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
2602 | 324 ngx_http_fastcgi_cache_key, |
325 NGX_HTTP_LOC_CONF_OFFSET, | |
326 0, | |
327 NULL }, | |
328 | |
329 { ngx_string("fastcgi_cache_path"), | |
330 NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE, | |
331 ngx_http_file_cache_set_slot, | |
332 0, | |
333 0, | |
334 &ngx_http_fastcgi_module }, | |
335 | |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
336 { ngx_string("fastcgi_cache_bypass"), |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
337 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:
3692
diff
changeset
|
338 ngx_http_set_predicate_slot, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
339 NGX_HTTP_LOC_CONF_OFFSET, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
340 offsetof(ngx_http_fastcgi_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:
3692
diff
changeset
|
341 NULL }, |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
342 |
3526
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
343 { ngx_string("fastcgi_no_cache"), |
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
344 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
|
345 ngx_http_set_predicate_slot, |
3526
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
346 NGX_HTTP_LOC_CONF_OFFSET, |
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
347 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.no_cache), |
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
348 NULL }, |
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
349 |
2602 | 350 { ngx_string("fastcgi_cache_valid"), |
351 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
352 ngx_http_file_cache_valid_set_slot, | |
353 NGX_HTTP_LOC_CONF_OFFSET, | |
354 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_valid), | |
355 NULL }, | |
356 | |
2729 | 357 { ngx_string("fastcgi_cache_min_uses"), |
2602 | 358 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
359 ngx_conf_set_num_slot, | |
360 NGX_HTTP_LOC_CONF_OFFSET, | |
361 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_min_uses), | |
362 NULL }, | |
363 | |
364 { ngx_string("fastcgi_cache_use_stale"), | |
365 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, | |
366 ngx_conf_set_bitmask_slot, | |
367 NGX_HTTP_LOC_CONF_OFFSET, | |
368 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_use_stale), | |
369 &ngx_http_fastcgi_next_upstream_masks }, | |
370 | |
2875
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
371 { ngx_string("fastcgi_cache_methods"), |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
372 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
373 ngx_conf_set_bitmask_slot, |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
374 NGX_HTTP_LOC_CONF_OFFSET, |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
375 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_methods), |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
376 &ngx_http_upstream_cache_method_mask }, |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
377 |
2602 | 378 #endif |
379 | |
479 | 380 { ngx_string("fastcgi_temp_path"), |
381 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234, | |
382 ngx_conf_set_path_slot, | |
383 NGX_HTTP_LOC_CONF_OFFSET, | |
384 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_path), | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
385 NULL }, |
479 | 386 |
387 { ngx_string("fastcgi_max_temp_file_size"), | |
388 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
389 ngx_conf_set_size_slot, | |
390 NGX_HTTP_LOC_CONF_OFFSET, | |
529 | 391 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.max_temp_file_size_conf), |
479 | 392 NULL }, |
393 | |
394 { ngx_string("fastcgi_temp_file_write_size"), | |
395 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
396 ngx_conf_set_size_slot, | |
397 NGX_HTTP_LOC_CONF_OFFSET, | |
529 | 398 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_file_write_size_conf), |
479 | 399 NULL }, |
400 | |
401 { ngx_string("fastcgi_next_upstream"), | |
547 | 402 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, |
479 | 403 ngx_conf_set_bitmask_slot, |
404 NGX_HTTP_LOC_CONF_OFFSET, | |
405 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream), | |
406 &ngx_http_fastcgi_next_upstream_masks }, | |
407 | |
509 | 408 { ngx_string("fastcgi_param"), |
409 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, | |
649 | 410 ngx_conf_set_keyval_slot, |
485 | 411 NGX_HTTP_LOC_CONF_OFFSET, |
509 | 412 offsetof(ngx_http_fastcgi_loc_conf_t, params_source), |
485 | 413 NULL }, |
414 | |
649 | 415 { ngx_string("fastcgi_pass_header"), |
3729 | 416 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
649 | 417 ngx_conf_set_str_array_slot, |
418 NGX_HTTP_LOC_CONF_OFFSET, | |
419 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_headers), | |
420 NULL }, | |
421 | |
422 { ngx_string("fastcgi_hide_header"), | |
3729 | 423 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
649 | 424 ngx_conf_set_str_array_slot, |
425 NGX_HTTP_LOC_CONF_OFFSET, | |
426 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.hide_headers), | |
427 NULL }, | |
428 | |
2786
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
429 { ngx_string("fastcgi_ignore_headers"), |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
430 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
431 ngx_conf_set_bitmask_slot, |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
432 NGX_HTTP_LOC_CONF_OFFSET, |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
433 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_headers), |
3667
12bd9e26fadb
use shared ngx_http_upstream_ignore_headers_masks[]
Igor Sysoev <igor@sysoev.ru>
parents:
3610
diff
changeset
|
434 &ngx_http_upstream_ignore_headers_masks }, |
2786
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
435 |
1228 | 436 { ngx_string("fastcgi_catch_stderr"), |
4357 | 437 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
1228 | 438 ngx_conf_set_str_array_slot, |
439 NGX_HTTP_LOC_CONF_OFFSET, | |
440 offsetof(ngx_http_fastcgi_loc_conf_t, catch_stderr), | |
441 NULL }, | |
442 | |
479 | 443 ngx_null_command |
444 }; | |
445 | |
446 | |
667 | 447 static ngx_http_module_t ngx_http_fastcgi_module_ctx = { |
509 | 448 ngx_http_fastcgi_add_variables, /* preconfiguration */ |
449 NULL, /* postconfiguration */ | |
479 | 450 |
451 NULL, /* create main configuration */ | |
452 NULL, /* init main configuration */ | |
453 | |
454 NULL, /* create server configuration */ | |
455 NULL, /* merge server configuration */ | |
456 | |
457 ngx_http_fastcgi_create_loc_conf, /* create location configuration */ | |
458 ngx_http_fastcgi_merge_loc_conf /* merge location configuration */ | |
459 }; | |
460 | |
461 | |
462 ngx_module_t ngx_http_fastcgi_module = { | |
509 | 463 NGX_MODULE_V1, |
479 | 464 &ngx_http_fastcgi_module_ctx, /* module context */ |
465 ngx_http_fastcgi_commands, /* module directives */ | |
466 NGX_HTTP_MODULE, /* module type */ | |
541 | 467 NULL, /* init master */ |
479 | 468 NULL, /* init module */ |
541 | 469 NULL, /* init process */ |
470 NULL, /* init thread */ | |
471 NULL, /* exit thread */ | |
472 NULL, /* exit process */ | |
473 NULL, /* exit master */ | |
474 NGX_MODULE_V1_PADDING | |
479 | 475 }; |
476 | |
477 | |
1883 | 478 static ngx_http_fastcgi_request_start_t ngx_http_fastcgi_request_start = { |
479 { 1, /* version */ | |
480 NGX_HTTP_FASTCGI_BEGIN_REQUEST, /* type */ | |
481 0, /* request_id_hi */ | |
482 1, /* request_id_lo */ | |
483 0, /* content_length_hi */ | |
484 sizeof(ngx_http_fastcgi_begin_request_t), /* content_length_lo */ | |
485 0, /* padding_length */ | |
486 0 }, /* reserved */ | |
487 | |
488 { 0, /* role_hi */ | |
489 NGX_HTTP_FASTCGI_RESPONDER, /* role_lo */ | |
490 0, /* NGX_HTTP_FASTCGI_KEEP_CONN */ /* flags */ | |
491 { 0, 0, 0, 0, 0 } }, /* reserved[5] */ | |
492 | |
493 { 1, /* version */ | |
494 NGX_HTTP_FASTCGI_PARAMS, /* type */ | |
495 0, /* request_id_hi */ | |
496 1 }, /* request_id_lo */ | |
497 | |
498 }; | |
499 | |
500 | |
2443 | 501 static ngx_http_variable_t ngx_http_fastcgi_vars[] = { |
502 | |
503 { ngx_string("fastcgi_script_name"), NULL, | |
504 ngx_http_fastcgi_script_name_variable, 0, | |
505 NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, | |
506 | |
507 { ngx_string("fastcgi_path_info"), NULL, | |
508 ngx_http_fastcgi_path_info_variable, 0, | |
509 NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, | |
510 | |
511 { ngx_null_string, NULL, NULL, 0, 0, 0 } | |
512 }; | |
1884 | 513 |
514 | |
649 | 515 static ngx_str_t ngx_http_fastcgi_hide_headers[] = { |
516 ngx_string("Status"), | |
517 ngx_string("X-Accel-Expires"), | |
518 ngx_string("X-Accel-Redirect"), | |
519 ngx_string("X-Accel-Limit-Rate"), | |
1886
2819956d1ca0
add X-Accel-Charset to ingored header, fix X-Accel-Buffering
Igor Sysoev <igor@sysoev.ru>
parents:
1884
diff
changeset
|
520 ngx_string("X-Accel-Buffering"), |
2819956d1ca0
add X-Accel-Charset to ingored header, fix X-Accel-Buffering
Igor Sysoev <igor@sysoev.ru>
parents:
1884
diff
changeset
|
521 ngx_string("X-Accel-Charset"), |
649 | 522 ngx_null_string |
523 }; | |
524 | |
525 | |
3197
d5d1ad05d3a6
hide cacheable Set-Cookie and P3P FastCGI response headers
Igor Sysoev <igor@sysoev.ru>
parents:
3025
diff
changeset
|
526 #if (NGX_HTTP_CACHE) |
d5d1ad05d3a6
hide cacheable Set-Cookie and P3P FastCGI response headers
Igor Sysoev <igor@sysoev.ru>
parents:
3025
diff
changeset
|
527 |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
528 static ngx_keyval_t ngx_http_fastcgi_cache_headers[] = { |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
529 { ngx_string("HTTP_IF_MODIFIED_SINCE"), ngx_string("") }, |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
530 { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") }, |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
531 { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("") }, |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
532 { ngx_string("HTTP_IF_MATCH"), ngx_string("") }, |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
533 { ngx_string("HTTP_RANGE"), ngx_string("") }, |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
534 { ngx_string("HTTP_IF_RANGE"), ngx_string("") }, |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
535 { ngx_null_string, ngx_null_string } |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
536 }; |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
537 |
3197
d5d1ad05d3a6
hide cacheable Set-Cookie and P3P FastCGI response headers
Igor Sysoev <igor@sysoev.ru>
parents:
3025
diff
changeset
|
538 #endif |
d5d1ad05d3a6
hide cacheable Set-Cookie and P3P FastCGI response headers
Igor Sysoev <igor@sysoev.ru>
parents:
3025
diff
changeset
|
539 |
d5d1ad05d3a6
hide cacheable Set-Cookie and P3P FastCGI response headers
Igor Sysoev <igor@sysoev.ru>
parents:
3025
diff
changeset
|
540 |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
541 static ngx_path_init_t ngx_http_fastcgi_temp_path = { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
542 ngx_string(NGX_HTTP_FASTCGI_TEMP_PATH), { 1, 2, 0 } |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
543 }; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
544 |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
545 |
487 | 546 static ngx_int_t |
547 ngx_http_fastcgi_handler(ngx_http_request_t *r) | |
479 | 548 { |
549 ngx_int_t rc; | |
550 ngx_http_upstream_t *u; | |
2443 | 551 ngx_http_fastcgi_ctx_t *f; |
479 | 552 ngx_http_fastcgi_loc_conf_t *flcf; |
553 | |
777
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
751
diff
changeset
|
554 if (r->subrequest_in_memory) { |
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
751
diff
changeset
|
555 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, |
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
751
diff
changeset
|
556 "ngx_http_fastcgi_module does not support " |
1635 | 557 "subrequest in memory"); |
777
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
751
diff
changeset
|
558 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
751
diff
changeset
|
559 } |
4ab852b691f5
<!--#include virtual=... set=... -->
Igor Sysoev <igor@sysoev.ru>
parents:
751
diff
changeset
|
560 |
3006
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2989
diff
changeset
|
561 if (ngx_http_upstream_create(r) != NGX_OK) { |
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2989
diff
changeset
|
562 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2989
diff
changeset
|
563 } |
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2989
diff
changeset
|
564 |
2443 | 565 f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t)); |
566 if (f == NULL) { | |
3006
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2989
diff
changeset
|
567 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
2443 | 568 } |
569 | |
570 ngx_http_set_ctx(r, f, ngx_http_fastcgi_module); | |
2395
b1a24d3cf4dd
clear fastcgi ctx for internal redirection via named location
Igor Sysoev <igor@sysoev.ru>
parents:
2391
diff
changeset
|
571 |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
572 flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
573 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
574 if (flcf->fastcgi_lengths) { |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
575 if (ngx_http_fastcgi_eval(r, flcf) != NGX_OK) { |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
576 return NGX_HTTP_INTERNAL_SERVER_ERROR; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
577 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
578 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
579 |
3006
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2989
diff
changeset
|
580 u = r->upstream; |
95972b9e790b
ngx_http_upstream_create() to cleanup the previous upstream after
Igor Sysoev <igor@sysoev.ru>
parents:
2989
diff
changeset
|
581 |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3494
diff
changeset
|
582 ngx_str_set(&u->schema, "fastcgi://"); |
479 | 583 u->output.tag = (ngx_buf_tag_t) &ngx_http_fastcgi_module; |
584 | |
585 u->conf = &flcf->upstream; | |
586 | |
2602 | 587 #if (NGX_HTTP_CACHE) |
588 u->create_key = ngx_http_fastcgi_create_key; | |
589 #endif | |
479 | 590 u->create_request = ngx_http_fastcgi_create_request; |
591 u->reinit_request = ngx_http_fastcgi_reinit_request; | |
592 u->process_header = ngx_http_fastcgi_process_header; | |
593 u->abort_request = ngx_http_fastcgi_abort_request; | |
594 u->finalize_request = ngx_http_fastcgi_finalize_request; | |
595 | |
649 | 596 u->buffering = 1; |
597 | |
581 | 598 u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t)); |
599 if (u->pipe == NULL) { | |
600 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
601 } | |
602 | |
603 u->pipe->input_filter = ngx_http_fastcgi_input_filter; | |
604 u->pipe->input_ctx = r; | |
479 | 605 |
606 rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); | |
607 | |
608 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { | |
609 return rc; | |
610 } | |
611 | |
612 return NGX_DONE; | |
613 } | |
614 | |
615 | |
487 | 616 static ngx_int_t |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
617 ngx_http_fastcgi_eval(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf) |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
618 { |
3610 | 619 ngx_url_t url; |
620 ngx_http_upstream_t *u; | |
621 | |
622 ngx_memzero(&url, sizeof(ngx_url_t)); | |
623 | |
624 if (ngx_http_script_run(r, &url.url, flcf->fastcgi_lengths->elts, 0, | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
625 flcf->fastcgi_values->elts) |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
626 == NULL) |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
627 { |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
628 return NGX_ERROR; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
629 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
630 |
3610 | 631 url.no_resolve = 1; |
632 | |
633 if (ngx_parse_url(r->pool, &url) != NGX_OK) { | |
634 if (url.err) { | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
635 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
3610 | 636 "%s in upstream \"%V\"", url.err, &url.url); |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
637 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
638 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
639 return NGX_ERROR; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
640 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
641 |
3610 | 642 u = r->upstream; |
643 | |
644 u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); | |
645 if (u->resolved == NULL) { | |
646 return NGX_ERROR; | |
647 } | |
648 | |
649 if (url.addrs && url.addrs[0].sockaddr) { | |
650 u->resolved->sockaddr = url.addrs[0].sockaddr; | |
651 u->resolved->socklen = url.addrs[0].socklen; | |
652 u->resolved->naddrs = 1; | |
653 u->resolved->host = url.addrs[0].name; | |
2422
7af1e5fe102c
variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents:
2396
diff
changeset
|
654 |
7af1e5fe102c
variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents:
2396
diff
changeset
|
655 } else { |
3610 | 656 u->resolved->host = url.host; |
657 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:
3850
diff
changeset
|
658 u->resolved->no_port = url.no_port; |
2422
7af1e5fe102c
variable support for unix sockets in fastcgi_pass and proxy_pass
Igor Sysoev <igor@sysoev.ru>
parents:
2396
diff
changeset
|
659 } |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
660 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
661 return NGX_OK; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
662 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
663 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
664 |
2602 | 665 #if (NGX_HTTP_CACHE) |
666 | |
667 static ngx_int_t | |
668 ngx_http_fastcgi_create_key(ngx_http_request_t *r) | |
669 { | |
670 ngx_str_t *key; | |
671 ngx_http_fastcgi_loc_conf_t *flcf; | |
672 | |
673 key = ngx_array_push(&r->cache->keys); | |
674 if (key == NULL) { | |
675 return NGX_ERROR; | |
676 } | |
677 | |
678 flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); | |
679 | |
680 if (ngx_http_complex_value(r, &flcf->cache_key, key) != NGX_OK) { | |
681 return NGX_ERROR; | |
682 } | |
683 | |
684 return NGX_OK; | |
685 } | |
686 | |
687 #endif | |
688 | |
689 | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
690 static ngx_int_t |
487 | 691 ngx_http_fastcgi_create_request(ngx_http_request_t *r) |
479 | 692 { |
509 | 693 off_t file_pos; |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
694 u_char ch, *pos, *lowcase_key; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
695 size_t size, len, key_len, val_len, padding, |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
696 allocated; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
697 ngx_uint_t i, n, next, hash, header_params; |
509 | 698 ngx_buf_t *b; |
699 ngx_chain_t *cl, *body; | |
700 ngx_list_part_t *part; | |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
701 ngx_table_elt_t *header, **ignored; |
509 | 702 ngx_http_script_code_pt code; |
703 ngx_http_script_engine_t e, le; | |
704 ngx_http_fastcgi_header_t *h; | |
705 ngx_http_fastcgi_loc_conf_t *flcf; | |
706 ngx_http_script_len_code_pt lcode; | |
479 | 707 |
509 | 708 len = 0; |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
709 header_params = 0; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
710 ignored = NULL; |
485 | 711 |
479 | 712 flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); |
713 | |
509 | 714 if (flcf->params_len) { |
715 ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); | |
479 | 716 |
1565 | 717 ngx_http_script_flush_no_cacheable_variables(r, flcf->flushes); |
573 | 718 le.flushed = 1; |
719 | |
509 | 720 le.ip = flcf->params_len->elts; |
721 le.request = r; | |
479 | 722 |
509 | 723 while (*(uintptr_t *) le.ip) { |
487 | 724 |
509 | 725 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
726 key_len = lcode(&le); | |
479 | 727 |
509 | 728 for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { |
729 lcode = *(ngx_http_script_len_code_pt *) le.ip; | |
730 } | |
731 le.ip += sizeof(uintptr_t); | |
479 | 732 |
537 | 733 len += 1 + key_len + ((val_len > 127) ? 4 : 1) + val_len; |
485 | 734 } |
735 } | |
736 | |
509 | 737 if (flcf->upstream.pass_request_headers) { |
485 | 738 |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
739 allocated = 0; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
740 lowcase_key = NULL; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
741 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
742 if (flcf->header_params) { |
4050 | 743 n = 0; |
744 part = &r->headers_in.headers.part; | |
745 | |
746 while (part) { | |
747 n += part->nelts; | |
748 part = part->next; | |
749 } | |
750 | |
751 ignored = ngx_palloc(r->pool, n * sizeof(void *)); | |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
752 if (ignored == NULL) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
753 return NGX_ERROR; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
754 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
755 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
756 |
509 | 757 part = &r->headers_in.headers.part; |
758 header = part->elts; | |
759 | |
760 for (i = 0; /* void */; i++) { | |
479 | 761 |
509 | 762 if (i >= part->nelts) { |
763 if (part->next == NULL) { | |
764 break; | |
765 } | |
479 | 766 |
509 | 767 part = part->next; |
768 header = part->elts; | |
769 i = 0; | |
479 | 770 } |
771 | |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
772 if (flcf->header_params) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
773 if (allocated < header[i].key.len) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
774 allocated = header[i].key.len + 16; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
775 lowcase_key = ngx_pnalloc(r->pool, allocated); |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
776 if (lowcase_key == NULL) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
777 return NGX_ERROR; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
778 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
779 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
780 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
781 hash = 0; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
782 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
783 for (n = 0; n < header[i].key.len; n++) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
784 ch = header[i].key.data[n]; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
785 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
786 if (ch >= 'A' && ch <= 'Z') { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
787 ch |= 0x20; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
788 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
789 } else if (ch == '-') { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
790 ch = '_'; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
791 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
792 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
793 hash = ngx_hash(hash, ch); |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
794 lowcase_key[n] = ch; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
795 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
796 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
797 if (ngx_hash_find(&flcf->headers_hash, hash, lowcase_key, n)) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
798 ignored[header_params++] = &header[i]; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
799 continue; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
800 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
801 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
802 n += sizeof("HTTP_") - 1; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
803 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
804 } else { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
805 n = sizeof("HTTP_") - 1 + header[i].key.len; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
806 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
807 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
808 len += ((n > 127) ? 4 : 1) + ((header[i].value.len > 127) ? 4 : 1) |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
809 + n + header[i].value.len; |
479 | 810 } |
811 } | |
812 | |
813 | |
814 if (len > 65535) { | |
815 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, | |
1678 | 816 "fastcgi request record is too big: %uz", len); |
479 | 817 return NGX_ERROR; |
818 } | |
819 | |
820 | |
821 padding = 8 - len % 8; | |
822 padding = (padding == 8) ? 0 : padding; | |
823 | |
824 | |
825 size = sizeof(ngx_http_fastcgi_header_t) | |
826 + sizeof(ngx_http_fastcgi_begin_request_t) | |
827 | |
828 + sizeof(ngx_http_fastcgi_header_t) /* NGX_HTTP_FASTCGI_PARAMS */ | |
829 + len + padding | |
830 + sizeof(ngx_http_fastcgi_header_t) /* NGX_HTTP_FASTCGI_PARAMS */ | |
831 | |
832 + sizeof(ngx_http_fastcgi_header_t); /* NGX_HTTP_FASTCGI_STDIN */ | |
833 | |
834 | |
501 | 835 b = ngx_create_temp_buf(r->pool, size); |
836 if (b == NULL) { | |
479 | 837 return NGX_ERROR; |
838 } | |
839 | |
501 | 840 cl = ngx_alloc_chain_link(r->pool); |
841 if (cl == NULL) { | |
479 | 842 return NGX_ERROR; |
843 } | |
844 | |
845 cl->buf = b; | |
846 | |
509 | 847 ngx_memcpy(b->pos, &ngx_http_fastcgi_request_start, |
848 sizeof(ngx_http_fastcgi_request_start_t)); | |
479 | 849 |
850 h = (ngx_http_fastcgi_header_t *) | |
851 (b->pos + sizeof(ngx_http_fastcgi_header_t) | |
852 + sizeof(ngx_http_fastcgi_begin_request_t)); | |
853 | |
854 h->content_length_hi = (u_char) ((len >> 8) & 0xff); | |
855 h->content_length_lo = (u_char) (len & 0xff); | |
856 h->padding_length = (u_char) padding; | |
857 h->reserved = 0; | |
858 | |
859 b->last = b->pos + sizeof(ngx_http_fastcgi_header_t) | |
860 + sizeof(ngx_http_fastcgi_begin_request_t) | |
861 + sizeof(ngx_http_fastcgi_header_t); | |
862 | |
863 | |
509 | 864 if (flcf->params_len) { |
865 ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); | |
479 | 866 |
509 | 867 e.ip = flcf->params->elts; |
868 e.pos = b->last; | |
869 e.request = r; | |
573 | 870 e.flushed = 1; |
479 | 871 |
509 | 872 le.ip = flcf->params_len->elts; |
479 | 873 |
509 | 874 while (*(uintptr_t *) le.ip) { |
479 | 875 |
509 | 876 lcode = *(ngx_http_script_len_code_pt *) le.ip; |
877 key_len = (u_char) lcode(&le); | |
479 | 878 |
509 | 879 for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { |
880 lcode = *(ngx_http_script_len_code_pt *) le.ip; | |
881 } | |
882 le.ip += sizeof(uintptr_t); | |
479 | 883 |
537 | 884 *e.pos++ = (u_char) key_len; |
479 | 885 |
537 | 886 if (val_len > 127) { |
887 *e.pos++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80); | |
888 *e.pos++ = (u_char) ((val_len >> 16) & 0xff); | |
889 *e.pos++ = (u_char) ((val_len >> 8) & 0xff); | |
890 *e.pos++ = (u_char) (val_len & 0xff); | |
479 | 891 |
537 | 892 } else { |
893 *e.pos++ = (u_char) val_len; | |
509 | 894 } |
479 | 895 |
509 | 896 while (*(uintptr_t *) e.ip) { |
897 code = *(ngx_http_script_code_pt *) e.ip; | |
898 code((ngx_http_script_engine_t *) &e); | |
899 } | |
900 e.ip += sizeof(uintptr_t); | |
1945 | 901 |
902 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
903 "fastcgi param: \"%*s: %*s\"", | |
904 key_len, e.pos - (key_len + val_len), | |
905 val_len, e.pos - val_len); | |
479 | 906 } |
907 | |
509 | 908 b->last = e.pos; |
487 | 909 } |
910 | |
911 | |
509 | 912 if (flcf->upstream.pass_request_headers) { |
479 | 913 |
509 | 914 part = &r->headers_in.headers.part; |
915 header = part->elts; | |
479 | 916 |
509 | 917 for (i = 0; /* void */; i++) { |
491 | 918 |
509 | 919 if (i >= part->nelts) { |
920 if (part->next == NULL) { | |
577 | 921 break; |
509 | 922 } |
577 | 923 |
509 | 924 part = part->next; |
925 header = part->elts; | |
926 i = 0; | |
927 } | |
479 | 928 |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
929 for (n = 0; n < header_params; n++) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
930 if (&header[i] == ignored[n]) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
931 goto next; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
932 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
933 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
934 |
3559
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
935 key_len = sizeof("HTTP_") - 1 + header[i].key.len; |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
936 if (key_len > 127) { |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
937 *b->last++ = (u_char) (((key_len >> 24) & 0x7f) | 0x80); |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
938 *b->last++ = (u_char) ((key_len >> 16) & 0xff); |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
939 *b->last++ = (u_char) ((key_len >> 8) & 0xff); |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
940 *b->last++ = (u_char) (key_len & 0xff); |
577 | 941 |
509 | 942 } else { |
3559
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
943 *b->last++ = (u_char) key_len; |
487 | 944 } |
945 | |
3559
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
946 val_len = header[i].value.len; |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
947 if (val_len > 127) { |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
948 *b->last++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80); |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
949 *b->last++ = (u_char) ((val_len >> 16) & 0xff); |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
950 *b->last++ = (u_char) ((val_len >> 8) & 0xff); |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
951 *b->last++ = (u_char) (val_len & 0xff); |
487 | 952 |
509 | 953 } else { |
3559
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
954 *b->last++ = (u_char) val_len; |
479 | 955 } |
956 | |
509 | 957 b->last = ngx_cpymem(b->last, "HTTP_", sizeof("HTTP_") - 1); |
479 | 958 |
509 | 959 for (n = 0; n < header[i].key.len; n++) { |
960 ch = header[i].key.data[n]; | |
479 | 961 |
509 | 962 if (ch >= 'a' && ch <= 'z') { |
963 ch &= ~0x20; | |
479 | 964 |
509 | 965 } else if (ch == '-') { |
966 ch = '_'; | |
967 } | |
479 | 968 |
509 | 969 *b->last++ = ch; |
479 | 970 } |
971 | |
3559
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
972 b->last = ngx_copy(b->last, header[i].value.data, val_len); |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
973 |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
974 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
975 "fastcgi param: \"%*s: %*s\"", |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
976 key_len, b->last - (key_len + val_len), |
519dcf4cb3de
add client request headers debug logging in fastcgi
Igor Sysoev <igor@sysoev.ru>
parents:
3558
diff
changeset
|
977 val_len, b->last - val_len); |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
978 next: |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
979 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
980 continue; |
479 | 981 } |
982 } | |
983 | |
984 | |
985 if (padding) { | |
986 ngx_memzero(b->last, padding); | |
987 b->last += padding; | |
988 } | |
989 | |
990 | |
991 h = (ngx_http_fastcgi_header_t *) b->last; | |
992 b->last += sizeof(ngx_http_fastcgi_header_t); | |
993 | |
994 h->version = 1; | |
995 h->type = NGX_HTTP_FASTCGI_PARAMS; | |
996 h->request_id_hi = 0; | |
997 h->request_id_lo = 1; | |
998 h->content_length_hi = 0; | |
999 h->content_length_lo = 0; | |
1000 h->padding_length = 0; | |
1001 h->reserved = 0; | |
1002 | |
1003 h = (ngx_http_fastcgi_header_t *) b->last; | |
1004 b->last += sizeof(ngx_http_fastcgi_header_t); | |
1005 | |
509 | 1006 if (flcf->upstream.pass_request_body) { |
1007 body = r->upstream->request_bufs; | |
1008 r->upstream->request_bufs = cl; | |
479 | 1009 |
1010 #if (NGX_SUPPRESS_WARN) | |
509 | 1011 file_pos = 0; |
1012 pos = NULL; | |
479 | 1013 #endif |
1014 | |
509 | 1015 while (body) { |
479 | 1016 |
509 | 1017 if (body->buf->in_file) { |
1018 file_pos = body->buf->file_pos; | |
479 | 1019 |
509 | 1020 } else { |
1021 pos = body->buf->pos; | |
479 | 1022 } |
1023 | |
509 | 1024 next = 0; |
479 | 1025 |
509 | 1026 do { |
1027 b = ngx_alloc_buf(r->pool); | |
1028 if (b == NULL) { | |
1029 return NGX_ERROR; | |
479 | 1030 } |
1031 | |
509 | 1032 ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); |
1033 | |
1034 if (body->buf->in_file) { | |
1035 b->file_pos = file_pos; | |
1036 file_pos += 32 * 1024; | |
479 | 1037 |
1142
e479e0b02e5a
fix "zero size buf" if request body file is multiple of 32K and FastCGI is used
Igor Sysoev <igor@sysoev.ru>
parents:
1125
diff
changeset
|
1038 if (file_pos >= body->buf->file_last) { |
509 | 1039 file_pos = body->buf->file_last; |
1040 next = 1; | |
1041 } | |
1042 | |
1043 b->file_last = file_pos; | |
1044 len = (ngx_uint_t) (file_pos - b->file_pos); | |
1045 | |
1046 } else { | |
1047 b->pos = pos; | |
1048 pos += 32 * 1024; | |
479 | 1049 |
1142
e479e0b02e5a
fix "zero size buf" if request body file is multiple of 32K and FastCGI is used
Igor Sysoev <igor@sysoev.ru>
parents:
1125
diff
changeset
|
1050 if (pos >= body->buf->last) { |
509 | 1051 pos = body->buf->last; |
1052 next = 1; | |
1053 } | |
1054 | |
1055 b->last = pos; | |
1056 len = (ngx_uint_t) (pos - b->pos); | |
1057 } | |
479 | 1058 |
509 | 1059 padding = 8 - len % 8; |
1060 padding = (padding == 8) ? 0 : padding; | |
479 | 1061 |
509 | 1062 h->version = 1; |
1063 h->type = NGX_HTTP_FASTCGI_STDIN; | |
1064 h->request_id_hi = 0; | |
1065 h->request_id_lo = 1; | |
1066 h->content_length_hi = (u_char) ((len >> 8) & 0xff); | |
1067 h->content_length_lo = (u_char) (len & 0xff); | |
1068 h->padding_length = (u_char) padding; | |
1069 h->reserved = 0; | |
479 | 1070 |
509 | 1071 cl->next = ngx_alloc_chain_link(r->pool); |
1072 if (cl->next == NULL) { | |
1073 return NGX_ERROR; | |
1074 } | |
479 | 1075 |
509 | 1076 cl = cl->next; |
1077 cl->buf = b; | |
1078 | |
1079 b = ngx_create_temp_buf(r->pool, | |
1080 sizeof(ngx_http_fastcgi_header_t) | |
1081 + padding); | |
1082 if (b == NULL) { | |
1083 return NGX_ERROR; | |
1084 } | |
479 | 1085 |
509 | 1086 if (padding) { |
1087 ngx_memzero(b->last, padding); | |
1088 b->last += padding; | |
1089 } | |
1090 | |
1091 h = (ngx_http_fastcgi_header_t *) b->last; | |
1092 b->last += sizeof(ngx_http_fastcgi_header_t); | |
479 | 1093 |
509 | 1094 cl->next = ngx_alloc_chain_link(r->pool); |
1095 if (cl->next == NULL) { | |
1096 return NGX_ERROR; | |
1097 } | |
1098 | |
1099 cl = cl->next; | |
1100 cl->buf = b; | |
479 | 1101 |
509 | 1102 } while (!next); |
479 | 1103 |
509 | 1104 body = body->next; |
1105 } | |
479 | 1106 |
509 | 1107 } else { |
1108 r->upstream->request_bufs = cl; | |
479 | 1109 } |
1110 | |
1111 h->version = 1; | |
1112 h->type = NGX_HTTP_FASTCGI_STDIN; | |
1113 h->request_id_hi = 0; | |
1114 h->request_id_lo = 1; | |
1115 h->content_length_hi = 0; | |
1116 h->content_length_lo = 0; | |
1117 h->padding_length = 0; | |
1118 h->reserved = 0; | |
1119 | |
1120 cl->next = NULL; | |
1121 | |
1122 return NGX_OK; | |
1123 } | |
1124 | |
1125 | |
487 | 1126 static ngx_int_t |
1127 ngx_http_fastcgi_reinit_request(ngx_http_request_t *r) | |
479 | 1128 { |
1129 ngx_http_fastcgi_ctx_t *f; | |
1130 | |
1131 f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); | |
1132 | |
1133 if (f == NULL) { | |
1134 return NGX_OK; | |
1135 } | |
1136 | |
1137 f->state = ngx_http_fastcgi_st_version; | |
615 | 1138 f->fastcgi_stdout = 0; |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1139 f->large_stderr = 0; |
479 | 1140 |
1141 return NGX_OK; | |
1142 } | |
1143 | |
1144 | |
507 | 1145 static ngx_int_t |
1146 ngx_http_fastcgi_process_header(ngx_http_request_t *r) | |
479 | 1147 { |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1148 u_char *p, *msg, *start, *last, |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1149 *part_start, *part_end; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1150 size_t size; |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1151 ngx_str_t *status_line, *pattern; |
509 | 1152 ngx_int_t rc, status; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1153 ngx_buf_t buf; |
649 | 1154 ngx_uint_t i; |
509 | 1155 ngx_table_elt_t *h; |
1156 ngx_http_upstream_t *u; | |
1157 ngx_http_fastcgi_ctx_t *f; | |
1158 ngx_http_upstream_header_t *hh; | |
1228 | 1159 ngx_http_fastcgi_loc_conf_t *flcf; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1160 ngx_http_fastcgi_split_part_t *part; |
509 | 1161 ngx_http_upstream_main_conf_t *umcf; |
479 | 1162 |
1163 f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); | |
1164 | |
509 | 1165 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); |
1166 | |
479 | 1167 u = r->upstream; |
1168 | |
1169 for ( ;; ) { | |
1170 | |
1171 if (f->state < ngx_http_fastcgi_st_data) { | |
1172 | |
581 | 1173 f->pos = u->buffer.pos; |
1174 f->last = u->buffer.last; | |
479 | 1175 |
1176 rc = ngx_http_fastcgi_process_record(r, f); | |
1177 | |
581 | 1178 u->buffer.pos = f->pos; |
1179 u->buffer.last = f->last; | |
479 | 1180 |
1181 if (rc == NGX_AGAIN) { | |
1182 return NGX_AGAIN; | |
1183 } | |
1184 | |
1185 if (rc == NGX_ERROR) { | |
1186 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
1187 } | |
1188 | |
491 | 1189 if (f->type != NGX_HTTP_FASTCGI_STDOUT |
1190 && f->type != NGX_HTTP_FASTCGI_STDERR) | |
1191 { | |
479 | 1192 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
1193 "upstream sent unexpected FastCGI record: %d", | |
1194 f->type); | |
1195 | |
1196 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
1197 } | |
1198 | |
491 | 1199 if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) { |
479 | 1200 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
1201 "upstream closed prematurely FastCGI stdout"); | |
1202 | |
1203 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
1204 } | |
1205 } | |
1206 | |
1207 if (f->state == ngx_http_fastcgi_st_padding) { | |
1208 | |
581 | 1209 if (u->buffer.pos + f->padding < u->buffer.last) { |
479 | 1210 f->state = ngx_http_fastcgi_st_version; |
581 | 1211 u->buffer.pos += f->padding; |
479 | 1212 |
1213 continue; | |
1214 } | |
1215 | |
581 | 1216 if (u->buffer.pos + f->padding == u->buffer.last) { |
479 | 1217 f->state = ngx_http_fastcgi_st_version; |
581 | 1218 u->buffer.pos = u->buffer.last; |
479 | 1219 |
1220 return NGX_AGAIN; | |
1221 } | |
1222 | |
581 | 1223 f->padding -= u->buffer.last - u->buffer.pos; |
1224 u->buffer.pos = u->buffer.last; | |
479 | 1225 |
1226 return NGX_AGAIN; | |
1227 } | |
1228 | |
491 | 1229 |
479 | 1230 /* f->state == ngx_http_fastcgi_st_data */ |
1231 | |
491 | 1232 if (f->type == NGX_HTTP_FASTCGI_STDERR) { |
1233 | |
1234 if (f->length) { | |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1235 msg = u->buffer.pos; |
491 | 1236 |
581 | 1237 if (u->buffer.pos + f->length <= u->buffer.last) { |
1238 u->buffer.pos += f->length; | |
491 | 1239 f->length = 0; |
1240 f->state = ngx_http_fastcgi_st_padding; | |
1241 | |
577 | 1242 } else { |
581 | 1243 f->length -= u->buffer.last - u->buffer.pos; |
1244 u->buffer.pos = u->buffer.last; | |
491 | 1245 } |
1246 | |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1247 for (p = u->buffer.pos - 1; msg < p; p--) { |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1248 if (*p != LF && *p != CR && *p != '.' && *p != ' ') { |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1249 break; |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1250 } |
491 | 1251 } |
1252 | |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1253 p++; |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1254 |
491 | 1255 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1256 "FastCGI sent in stderr: \"%*s\"", p - msg, msg); |
491 | 1257 |
1228 | 1258 flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); |
1259 | |
1260 if (flcf->catch_stderr) { | |
1261 pattern = flcf->catch_stderr->elts; | |
1262 | |
1263 for (i = 0; i < flcf->catch_stderr->nelts; i++) { | |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1264 if (ngx_strnstr(msg, (char *) pattern[i].data, |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1265 p - msg) |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1266 != NULL) |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1267 { |
1700
7f3350b18e75
return NGX_HTTP_UPSTREAM_INVALID_HEADER instead of NGX_HTTP_BAD_GATEWAY
Igor Sysoev <igor@sysoev.ru>
parents:
1699
diff
changeset
|
1268 return NGX_HTTP_UPSTREAM_INVALID_HEADER; |
1228 | 1269 } |
1270 } | |
1271 } | |
1272 | |
581 | 1273 if (u->buffer.pos == u->buffer.last) { |
615 | 1274 |
1275 if (!f->fastcgi_stdout) { | |
1276 | |
1277 /* | |
1278 * the special handling the large number | |
1279 * of the PHP warnings to not allocate memory | |
1280 */ | |
1281 | |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1282 #if (NGX_HTTP_CACHE) |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1283 if (r->cache) { |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1284 u->buffer.pos = u->buffer.start |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1285 + r->cache->header_start; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1286 } else { |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1287 u->buffer.pos = u->buffer.start; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1288 } |
3850
ca7b9caa20e5
fix large stderr handling without http cache
Igor Sysoev <igor@sysoev.ru>
parents:
3735
diff
changeset
|
1289 #else |
ca7b9caa20e5
fix large stderr handling without http cache
Igor Sysoev <igor@sysoev.ru>
parents:
3735
diff
changeset
|
1290 u->buffer.pos = u->buffer.start; |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1291 #endif |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1292 u->buffer.last = u->buffer.pos; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1293 f->large_stderr = 1; |
615 | 1294 } |
1295 | |
491 | 1296 return NGX_AGAIN; |
1297 } | |
1298 | |
1299 } else { | |
1300 f->state = ngx_http_fastcgi_st_version; | |
1301 } | |
1302 | |
1303 continue; | |
1304 } | |
1305 | |
1306 | |
1307 /* f->type == NGX_HTTP_FASTCGI_STDOUT */ | |
1308 | |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1309 #if (NGX_HTTP_CACHE) |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1310 |
3469
08a66ba99191
fix segfault if there was non cached large FastCGI stderr output before header,
Igor Sysoev <igor@sysoev.ru>
parents:
3460
diff
changeset
|
1311 if (f->large_stderr && r->cache) { |
3494
67b8a4e0d7e1
fix building without HTTP cache, the bug had been introduced in r3461
Igor Sysoev <igor@sysoev.ru>
parents:
3469
diff
changeset
|
1312 u_char *start; |
67b8a4e0d7e1
fix building without HTTP cache, the bug had been introduced in r3461
Igor Sysoev <igor@sysoev.ru>
parents:
3469
diff
changeset
|
1313 ssize_t len; |
67b8a4e0d7e1
fix building without HTTP cache, the bug had been introduced in r3461
Igor Sysoev <igor@sysoev.ru>
parents:
3469
diff
changeset
|
1314 ngx_http_fastcgi_header_t *fh; |
3460
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1315 |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1316 start = u->buffer.start + r->cache->header_start; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1317 |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1318 len = u->buffer.pos - start - 2 * sizeof(ngx_http_fastcgi_header_t); |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1319 |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1320 /* |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1321 * A tail of large stderr output before HTTP header is placed |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1322 * in a cache file without a FastCGI record header. |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1323 * To workaround it we put a dummy FastCGI record header at the |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1324 * start of the stderr output or update r->cache_header_start, |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1325 * if there is no enough place for the record header. |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1326 */ |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1327 |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1328 if (len >= 0) { |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1329 fh = (ngx_http_fastcgi_header_t *) start; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1330 fh->version = 1; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1331 fh->type = NGX_HTTP_FASTCGI_STDERR; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1332 fh->request_id_hi = 0; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1333 fh->request_id_lo = 1; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1334 fh->content_length_hi = (u_char) ((len >> 8) & 0xff); |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1335 fh->content_length_lo = (u_char) (len & 0xff); |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1336 fh->padding_length = 0; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1337 fh->reserved = 0; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1338 |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1339 } else { |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1340 r->cache->header_start += u->buffer.pos - start |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1341 - sizeof(ngx_http_fastcgi_header_t); |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1342 } |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1343 |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1344 f->large_stderr = 0; |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1345 } |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1346 |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1347 #endif |
bbea0b19b608
fix cached FastCGI response with large stderr output before header
Igor Sysoev <igor@sysoev.ru>
parents:
3399
diff
changeset
|
1348 |
615 | 1349 f->fastcgi_stdout = 1; |
1350 | |
581 | 1351 start = u->buffer.pos; |
479 | 1352 |
581 | 1353 if (u->buffer.pos + f->length < u->buffer.last) { |
479 | 1354 |
1355 /* | |
581 | 1356 * set u->buffer.last to the end of the FastCGI record data |
479 | 1357 * for ngx_http_parse_header_line() |
1358 */ | |
1359 | |
581 | 1360 last = u->buffer.last; |
1361 u->buffer.last = u->buffer.pos + f->length; | |
479 | 1362 |
1363 } else { | |
1364 last = NULL; | |
1365 } | |
1366 | |
1367 for ( ;; ) { | |
1368 | |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1369 part_start = u->buffer.pos; |
3011
5957e869f04d
fix a garbage in a split fastcgi header
Igor Sysoev <igor@sysoev.ru>
parents:
3010
diff
changeset
|
1370 part_end = u->buffer.last; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1371 |
2256 | 1372 rc = ngx_http_parse_header_line(r, &u->buffer, 1); |
479 | 1373 |
1374 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1375 "http fastcgi parser: %d", rc); | |
1376 | |
1377 if (rc == NGX_AGAIN) { | |
1378 break; | |
1379 } | |
1380 | |
1381 if (rc == NGX_OK) { | |
1382 | |
1383 /* a header line has been parsed successfully */ | |
1384 | |
509 | 1385 h = ngx_list_push(&u->headers_in.headers); |
501 | 1386 if (h == NULL) { |
1699
976db8c6fb64
return NGX_ERROR instead of NGX_HTTP_INTERNAL_SERVER_ERROR in u->parse_header()
Igor Sysoev <igor@sysoev.ru>
parents:
1698
diff
changeset
|
1387 return NGX_ERROR; |
479 | 1388 } |
1389 | |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1390 if (f->split_parts && f->split_parts->nelts) { |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1391 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1392 part = f->split_parts->elts; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1393 size = u->buffer.pos - part_start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1394 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1395 for (i = 0; i < f->split_parts->nelts; i++) { |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1396 size += part[i].end - part[i].start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1397 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1398 |
2049 | 1399 p = ngx_pnalloc(r->pool, size); |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1400 if (p == NULL) { |
1699
976db8c6fb64
return NGX_ERROR instead of NGX_HTTP_INTERNAL_SERVER_ERROR in u->parse_header()
Igor Sysoev <igor@sysoev.ru>
parents:
1698
diff
changeset
|
1401 return NGX_ERROR; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1402 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1403 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1404 buf.pos = p; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1405 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1406 for (i = 0; i < f->split_parts->nelts; i++) { |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1407 p = ngx_cpymem(p, part[i].start, |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1408 part[i].end - part[i].start); |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1409 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1410 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1411 p = ngx_cpymem(p, part_start, u->buffer.pos - part_start); |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1412 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1413 buf.last = p; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1414 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1415 f->split_parts->nelts = 0; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1416 |
2256 | 1417 rc = ngx_http_parse_header_line(r, &buf, 1); |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1418 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1419 h->key.len = r->header_name_end - r->header_name_start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1420 h->key.data = r->header_name_start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1421 h->key.data[h->key.len] = '\0'; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1422 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1423 h->value.len = r->header_end - r->header_start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1424 h->value.data = r->header_start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1425 h->value.data[h->value.len] = '\0'; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1426 |
2049 | 1427 h->lowcase_key = ngx_pnalloc(r->pool, h->key.len); |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1428 if (h->lowcase_key == NULL) { |
1699
976db8c6fb64
return NGX_ERROR instead of NGX_HTTP_INTERNAL_SERVER_ERROR in u->parse_header()
Igor Sysoev <igor@sysoev.ru>
parents:
1698
diff
changeset
|
1429 return NGX_ERROR; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1430 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1431 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1432 } else { |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1433 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1434 h->key.len = r->header_name_end - r->header_name_start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1435 h->value.len = r->header_end - r->header_start; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1436 |
2049 | 1437 h->key.data = ngx_pnalloc(r->pool, |
1438 h->key.len + 1 + h->value.len + 1 | |
1439 + h->key.len); | |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1440 if (h->key.data == NULL) { |
1699
976db8c6fb64
return NGX_ERROR instead of NGX_HTTP_INTERNAL_SERVER_ERROR in u->parse_header()
Igor Sysoev <igor@sysoev.ru>
parents:
1698
diff
changeset
|
1441 return NGX_ERROR; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1442 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1443 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1444 h->value.data = h->key.data + h->key.len + 1; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1445 h->lowcase_key = h->key.data + h->key.len + 1 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1446 + h->value.len + 1; |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1447 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1448 ngx_cpystrn(h->key.data, r->header_name_start, |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1449 h->key.len + 1); |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1450 ngx_cpystrn(h->value.data, r->header_start, |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1451 h->value.len + 1); |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1452 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1453 |
509 | 1454 h->hash = r->header_hash; |
1455 | |
649 | 1456 if (h->key.len == r->lowcase_index) { |
1457 ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); | |
1458 | |
1459 } else { | |
2135 | 1460 ngx_strlow(h->lowcase_key, h->key.data, h->key.len); |
479 | 1461 } |
1462 | |
649 | 1463 hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, |
1464 h->lowcase_key, h->key.len); | |
1465 | |
1466 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { | |
1699
976db8c6fb64
return NGX_ERROR instead of NGX_HTTP_INTERNAL_SERVER_ERROR in u->parse_header()
Igor Sysoev <igor@sysoev.ru>
parents:
1698
diff
changeset
|
1467 return NGX_ERROR; |
649 | 1468 } |
1469 | |
479 | 1470 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1471 "http fastcgi header: \"%V: %V\"", | |
1472 &h->key, &h->value); | |
1473 | |
615 | 1474 if (u->buffer.pos < u->buffer.last) { |
1475 continue; | |
1476 } | |
1477 | |
1478 /* the end of the FastCGI record */ | |
1479 | |
1480 break; | |
479 | 1481 } |
1482 | |
1483 if (rc == NGX_HTTP_PARSE_HEADER_DONE) { | |
1484 | |
1485 /* a whole header has been parsed successfully */ | |
1486 | |
1487 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1488 "http fastcgi header done"); | |
1489 | |
509 | 1490 if (u->headers_in.status) { |
1491 status_line = &u->headers_in.status->value; | |
479 | 1492 |
1493 status = ngx_atoi(status_line->data, 3); | |
1494 | |
1495 if (status == NGX_ERROR) { | |
1698
70202cd85645
return NGX_HTTP_UPSTREAM_INVALID_HEADER for invalid status
Igor Sysoev <igor@sysoev.ru>
parents:
1678
diff
changeset
|
1496 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, |
70202cd85645
return NGX_HTTP_UPSTREAM_INVALID_HEADER for invalid status
Igor Sysoev <igor@sysoev.ru>
parents:
1678
diff
changeset
|
1497 "upstream sent invalid status \"%V\"", |
70202cd85645
return NGX_HTTP_UPSTREAM_INVALID_HEADER for invalid status
Igor Sysoev <igor@sysoev.ru>
parents:
1678
diff
changeset
|
1498 status_line); |
70202cd85645
return NGX_HTTP_UPSTREAM_INVALID_HEADER for invalid status
Igor Sysoev <igor@sysoev.ru>
parents:
1678
diff
changeset
|
1499 return NGX_HTTP_UPSTREAM_INVALID_HEADER; |
479 | 1500 } |
1501 | |
529 | 1502 u->headers_in.status_n = status; |
1503 u->headers_in.status_line = *status_line; | |
479 | 1504 |
2140
dce5ddef5af9
if upstream sent a location header without status use 302
Igor Sysoev <igor@sysoev.ru>
parents:
2135
diff
changeset
|
1505 } else if (u->headers_in.location) { |
dce5ddef5af9
if upstream sent a location header without status use 302
Igor Sysoev <igor@sysoev.ru>
parents:
2135
diff
changeset
|
1506 u->headers_in.status_n = 302; |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3494
diff
changeset
|
1507 ngx_str_set(&u->headers_in.status_line, |
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3494
diff
changeset
|
1508 "302 Moved Temporarily"); |
2140
dce5ddef5af9
if upstream sent a location header without status use 302
Igor Sysoev <igor@sysoev.ru>
parents:
2135
diff
changeset
|
1509 |
479 | 1510 } else { |
529 | 1511 u->headers_in.status_n = 200; |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3494
diff
changeset
|
1512 ngx_str_set(&u->headers_in.status_line, "200 OK"); |
479 | 1513 } |
1514 | |
2602 | 1515 if (u->state) { |
1516 u->state->status = u->headers_in.status_n; | |
479 | 1517 } |
1518 | |
1519 break; | |
1520 } | |
1521 | |
1522 /* there was error while a header line parsing */ | |
1523 | |
1524 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
619 | 1525 "upstream sent invalid header"); |
479 | 1526 |
1527 return NGX_HTTP_UPSTREAM_INVALID_HEADER; | |
1528 } | |
1529 | |
1530 if (last) { | |
581 | 1531 u->buffer.last = last; |
479 | 1532 } |
1533 | |
581 | 1534 f->length -= u->buffer.pos - start; |
479 | 1535 |
1536 if (f->length == 0) { | |
1537 if (f->padding) { | |
1538 f->state = ngx_http_fastcgi_st_padding; | |
1539 } else { | |
1540 f->state = ngx_http_fastcgi_st_version; | |
1541 } | |
1542 } | |
1543 | |
615 | 1544 if (rc == NGX_HTTP_PARSE_HEADER_DONE) { |
1545 return NGX_OK; | |
1546 } | |
1547 | |
1274 | 1548 if (rc == NGX_OK) { |
1998
63c60504c0bf
fix error introduced in r1273 and r1275:
Igor Sysoev <igor@sysoev.ru>
parents:
1945
diff
changeset
|
1549 continue; |
615 | 1550 } |
1551 | |
1274 | 1552 /* rc == NGX_AGAIN */ |
1553 | |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1554 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1555 "upstream split a header line in FastCGI records"); |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1556 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1557 if (f->split_parts == NULL) { |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1558 f->split_parts = ngx_array_create(r->pool, 1, |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1559 sizeof(ngx_http_fastcgi_split_part_t)); |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1560 if (f->split_parts == NULL) { |
1699
976db8c6fb64
return NGX_ERROR instead of NGX_HTTP_INTERNAL_SERVER_ERROR in u->parse_header()
Igor Sysoev <igor@sysoev.ru>
parents:
1698
diff
changeset
|
1561 return NGX_ERROR; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1562 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1563 } |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1564 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1565 part = ngx_array_push(f->split_parts); |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1566 |
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1567 part->start = part_start; |
3011
5957e869f04d
fix a garbage in a split fastcgi header
Igor Sysoev <igor@sysoev.ru>
parents:
3010
diff
changeset
|
1568 part->end = part_end; |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1569 |
3010
37400c84396e
continue to parse available fastcgi record after a split header,
Igor Sysoev <igor@sysoev.ru>
parents:
3006
diff
changeset
|
1570 if (u->buffer.pos < u->buffer.last) { |
37400c84396e
continue to parse available fastcgi record after a split header,
Igor Sysoev <igor@sysoev.ru>
parents:
3006
diff
changeset
|
1571 continue; |
37400c84396e
continue to parse available fastcgi record after a split header,
Igor Sysoev <igor@sysoev.ru>
parents:
3006
diff
changeset
|
1572 } |
37400c84396e
continue to parse available fastcgi record after a split header,
Igor Sysoev <igor@sysoev.ru>
parents:
3006
diff
changeset
|
1573 |
1276
1494a23b1ed4
fix headers split in FastCGI records
Igor Sysoev <igor@sysoev.ru>
parents:
1274
diff
changeset
|
1574 return NGX_AGAIN; |
479 | 1575 } |
1576 } | |
1577 | |
1578 | |
487 | 1579 static ngx_int_t |
1580 ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf) | |
479 | 1581 { |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1582 u_char *m, *msg; |
479 | 1583 ngx_int_t rc; |
483 | 1584 ngx_buf_t *b, **prev; |
479 | 1585 ngx_chain_t *cl; |
1586 ngx_http_request_t *r; | |
1587 ngx_http_fastcgi_ctx_t *f; | |
1588 | |
1589 if (buf->pos == buf->last) { | |
1590 return NGX_OK; | |
1591 } | |
1592 | |
1593 r = p->input_ctx; | |
1594 f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); | |
1595 | |
1596 b = NULL; | |
483 | 1597 prev = &buf->shadow; |
479 | 1598 |
1599 f->pos = buf->pos; | |
1600 f->last = buf->last; | |
1601 | |
1602 for ( ;; ) { | |
1603 if (f->state < ngx_http_fastcgi_st_data) { | |
1604 | |
1605 rc = ngx_http_fastcgi_process_record(r, f); | |
1606 | |
1607 if (rc == NGX_AGAIN) { | |
1608 break; | |
1609 } | |
1610 | |
1611 if (rc == NGX_ERROR) { | |
1612 return NGX_ERROR; | |
1613 } | |
1614 | |
1615 if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) { | |
1616 f->state = ngx_http_fastcgi_st_version; | |
1617 p->upstream_done = 1; | |
1618 | |
1619 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0, | |
1620 "http fastcgi closed stdout"); | |
1621 | |
1622 continue; | |
1623 } | |
1624 | |
1625 if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) { | |
1626 f->state = ngx_http_fastcgi_st_version; | |
1627 p->upstream_done = 1; | |
1628 | |
1629 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0, | |
1630 "http fastcgi sent end request"); | |
1631 | |
1632 break; | |
1633 } | |
1634 } | |
1635 | |
1636 | |
1637 if (f->state == ngx_http_fastcgi_st_padding) { | |
1638 | |
1639 if (f->pos + f->padding < f->last) { | |
1640 f->state = ngx_http_fastcgi_st_version; | |
1641 f->pos += f->padding; | |
1642 | |
1643 continue; | |
1644 } | |
1645 | |
1646 if (f->pos + f->padding == f->last) { | |
1647 f->state = ngx_http_fastcgi_st_version; | |
1648 | |
1649 break; | |
1650 } | |
1651 | |
1652 f->padding -= f->last - f->pos; | |
1653 | |
1654 break; | |
1655 } | |
1656 | |
1657 | |
1658 /* f->state == ngx_http_fastcgi_st_data */ | |
1659 | |
1660 if (f->type == NGX_HTTP_FASTCGI_STDERR) { | |
1661 | |
1662 if (f->length) { | |
639 | 1663 |
1664 if (f->pos == f->last) { | |
1665 break; | |
1666 } | |
1667 | |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1668 msg = f->pos; |
479 | 1669 |
1670 if (f->pos + f->length <= f->last) { | |
1671 f->pos += f->length; | |
491 | 1672 f->length = 0; |
1673 f->state = ngx_http_fastcgi_st_padding; | |
479 | 1674 |
577 | 1675 } else { |
479 | 1676 f->length -= f->last - f->pos; |
1677 f->pos = f->last; | |
1678 } | |
1679 | |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1680 for (m = f->pos - 1; msg < m; m--) { |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1681 if (*m != LF && *m != CR && *m != '.' && *m != ' ') { |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1682 break; |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1683 } |
491 | 1684 } |
479 | 1685 |
1686 ngx_log_error(NGX_LOG_ERR, p->log, 0, | |
3025
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1687 "FastCGI sent in stderr: \"%*s\"", |
baff3edcb6e2
refactor fastcgi stderr handling
Igor Sysoev <igor@sysoev.ru>
parents:
3011
diff
changeset
|
1688 m + 1 - msg, msg); |
479 | 1689 |
1690 if (f->pos == f->last) { | |
1691 break; | |
1692 } | |
491 | 1693 |
1694 } else { | |
1695 f->state = ngx_http_fastcgi_st_version; | |
479 | 1696 } |
1697 | |
1698 continue; | |
1699 } | |
1700 | |
1701 | |
1702 /* f->type == NGX_HTTP_FASTCGI_STDOUT */ | |
1703 | |
639 | 1704 if (f->pos == f->last) { |
1705 break; | |
1706 } | |
1707 | |
479 | 1708 if (p->free) { |
4165 | 1709 cl = p->free; |
1710 b = cl->buf; | |
1711 p->free = cl->next; | |
1712 ngx_free_chain(p->pool, cl); | |
479 | 1713 |
1714 } else { | |
501 | 1715 b = ngx_alloc_buf(p->pool); |
1716 if (b == NULL) { | |
479 | 1717 return NGX_ERROR; |
1718 } | |
1719 } | |
1720 | |
1721 ngx_memzero(b, sizeof(ngx_buf_t)); | |
1722 | |
1723 b->pos = f->pos; | |
483 | 1724 b->start = buf->start; |
1725 b->end = buf->end; | |
479 | 1726 b->tag = p->tag; |
1727 b->temporary = 1; | |
1728 b->recycled = 1; | |
483 | 1729 |
1730 *prev = b; | |
1731 prev = &b->shadow; | |
479 | 1732 |
501 | 1733 cl = ngx_alloc_chain_link(p->pool); |
1734 if (cl == NULL) { | |
479 | 1735 return NGX_ERROR; |
1736 } | |
1737 | |
1738 cl->buf = b; | |
1739 cl->next = NULL; | |
1740 | |
501 | 1741 if (p->in) { |
1742 *p->last_in = cl; | |
1743 } else { | |
1744 p->in = cl; | |
1745 } | |
1746 p->last_in = &cl->next; | |
1747 | |
1748 | |
483 | 1749 /* STUB */ b->num = buf->num; |
1750 | |
1030
5a86fcc480c6
add debug logging for FastCGI zero size buf alert
Igor Sysoev <igor@sysoev.ru>
parents:
906
diff
changeset
|
1751 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, |
1037 | 1752 "input buf #%d %p", b->num, b->pos); |
479 | 1753 |
1754 if (f->pos + f->length < f->last) { | |
1755 | |
1756 if (f->padding) { | |
1757 f->state = ngx_http_fastcgi_st_padding; | |
1758 } else { | |
1759 f->state = ngx_http_fastcgi_st_version; | |
1760 } | |
1761 | |
1762 f->pos += f->length; | |
1763 b->last = f->pos; | |
1764 | |
1765 continue; | |
1766 } | |
1767 | |
1768 if (f->pos + f->length == f->last) { | |
1769 | |
1770 if (f->padding) { | |
1771 f->state = ngx_http_fastcgi_st_padding; | |
1772 } else { | |
1773 f->state = ngx_http_fastcgi_st_version; | |
1774 } | |
1775 | |
1776 b->last = f->last; | |
1777 | |
1778 break; | |
1779 } | |
1780 | |
1781 f->length -= f->last - f->pos; | |
1782 | |
1783 b->last = f->last; | |
1784 | |
1785 break; | |
1786 | |
1787 } | |
1788 | |
1789 if (b) { | |
483 | 1790 b->shadow = buf; |
479 | 1791 b->last_shadow = 1; |
483 | 1792 |
1030
5a86fcc480c6
add debug logging for FastCGI zero size buf alert
Igor Sysoev <igor@sysoev.ru>
parents:
906
diff
changeset
|
1793 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, |
1037 | 1794 "input buf %p %z", b->pos, b->last - b->pos); |
1030
5a86fcc480c6
add debug logging for FastCGI zero size buf alert
Igor Sysoev <igor@sysoev.ru>
parents:
906
diff
changeset
|
1795 |
483 | 1796 return NGX_OK; |
1797 } | |
1798 | |
1799 /* there is no data record in the buf, add it to free chain */ | |
1800 | |
1801 if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) { | |
1802 return NGX_ERROR; | |
479 | 1803 } |
1804 | |
1805 return NGX_OK; | |
1806 } | |
1807 | |
1808 | |
487 | 1809 static ngx_int_t |
1810 ngx_http_fastcgi_process_record(ngx_http_request_t *r, | |
1811 ngx_http_fastcgi_ctx_t *f) | |
479 | 1812 { |
1813 u_char ch, *p; | |
1814 ngx_http_fastcgi_state_e state; | |
1815 | |
1816 state = f->state; | |
1817 | |
1818 for (p = f->pos; p < f->last; p++) { | |
1819 | |
1820 ch = *p; | |
1821 | |
1822 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1823 "http fastcgi record byte: %02Xd", ch); | |
1824 | |
1825 switch (state) { | |
1826 | |
1827 case ngx_http_fastcgi_st_version: | |
1828 if (ch != 1) { | |
1829 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
1830 "upstream sent unsupported FastCGI " | |
1831 "protocol version: %d", ch); | |
1832 return NGX_ERROR; | |
1833 } | |
1834 state = ngx_http_fastcgi_st_type; | |
1835 break; | |
1836 | |
1837 case ngx_http_fastcgi_st_type: | |
1838 switch (ch) { | |
1839 case NGX_HTTP_FASTCGI_STDOUT: | |
1840 case NGX_HTTP_FASTCGI_STDERR: | |
1841 case NGX_HTTP_FASTCGI_END_REQUEST: | |
1842 f->type = (ngx_uint_t) ch; | |
1843 break; | |
1844 default: | |
1845 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
1846 "upstream sent invalid FastCGI " | |
1847 "record type: %d", ch); | |
1848 return NGX_ERROR; | |
1849 | |
1850 } | |
1851 state = ngx_http_fastcgi_st_request_id_hi; | |
1852 break; | |
1853 | |
1854 /* we support the single request per connection */ | |
1855 | |
1856 case ngx_http_fastcgi_st_request_id_hi: | |
1857 if (ch != 0) { | |
1858 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
1859 "upstream sent unexpected FastCGI " | |
1860 "request id high byte: %d", ch); | |
1861 return NGX_ERROR; | |
1862 } | |
1863 state = ngx_http_fastcgi_st_request_id_lo; | |
1864 break; | |
1865 | |
1866 case ngx_http_fastcgi_st_request_id_lo: | |
1867 if (ch != 1) { | |
1868 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | |
1869 "upstream sent unexpected FastCGI " | |
1870 "request id low byte: %d", ch); | |
1871 return NGX_ERROR; | |
1872 } | |
1873 state = ngx_http_fastcgi_st_content_length_hi; | |
1874 break; | |
1875 | |
1876 case ngx_http_fastcgi_st_content_length_hi: | |
1877 f->length = ch << 8; | |
1878 state = ngx_http_fastcgi_st_content_length_lo; | |
1879 break; | |
1880 | |
1881 case ngx_http_fastcgi_st_content_length_lo: | |
1882 f->length |= (size_t) ch; | |
1883 state = ngx_http_fastcgi_st_padding_length; | |
1884 break; | |
1885 | |
1886 case ngx_http_fastcgi_st_padding_length: | |
1887 f->padding = (size_t) ch; | |
1888 state = ngx_http_fastcgi_st_reserved; | |
1889 break; | |
1890 | |
1891 case ngx_http_fastcgi_st_reserved: | |
1892 state = ngx_http_fastcgi_st_data; | |
1893 | |
1894 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1895 "http fastcgi record length: %z", f->length); | |
1896 | |
1897 f->pos = p + 1; | |
1898 f->state = state; | |
1899 | |
1900 return NGX_OK; | |
1901 | |
1902 /* suppress warning */ | |
1903 case ngx_http_fastcgi_st_data: | |
1904 case ngx_http_fastcgi_st_padding: | |
1905 break; | |
1906 } | |
1907 } | |
1908 | |
1909 f->state = state; | |
1910 | |
1911 return NGX_AGAIN; | |
1912 } | |
1913 | |
1914 | |
487 | 1915 static void |
1916 ngx_http_fastcgi_abort_request(ngx_http_request_t *r) | |
479 | 1917 { |
1918 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1919 "abort http fastcgi request"); | |
1920 | |
1921 return; | |
1922 } | |
1923 | |
1924 | |
487 | 1925 static void |
1926 ngx_http_fastcgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc) | |
479 | 1927 { |
1928 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | |
1929 "finalize http fastcgi request"); | |
1930 | |
1931 return; | |
1932 } | |
1933 | |
1934 | |
509 | 1935 static ngx_int_t |
1936 ngx_http_fastcgi_add_variables(ngx_conf_t *cf) | |
479 | 1937 { |
2443 | 1938 ngx_http_variable_t *var, *v; |
1939 | |
1940 for (v = ngx_http_fastcgi_vars; v->name.len; v++) { | |
1941 var = ngx_http_add_variable(cf, &v->name, v->flags); | |
1942 if (var == NULL) { | |
1943 return NGX_ERROR; | |
1944 } | |
1945 | |
1946 var->get_handler = v->get_handler; | |
1947 var->data = v->data; | |
479 | 1948 } |
1949 | |
509 | 1950 return NGX_OK; |
479 | 1951 } |
1952 | |
1953 | |
487 | 1954 static void * |
1955 ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf) | |
479 | 1956 { |
1957 ngx_http_fastcgi_loc_conf_t *conf; | |
1958 | |
501 | 1959 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_loc_conf_t)); |
1960 if (conf == NULL) { | |
2912
c7d57b539248
return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents:
2895
diff
changeset
|
1961 return NULL; |
479 | 1962 } |
1963 | |
1964 /* | |
1965 * set by ngx_pcalloc(): | |
1966 * | |
1967 * conf->upstream.bufs.num = 0; | |
2786
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
1968 * conf->upstream.ignore_headers = 0; |
479 | 1969 * conf->upstream.next_upstream = 0; |
2875
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
1970 * conf->upstream.cache_use_stale = 0; |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
1971 * conf->upstream.cache_methods = 0; |
479 | 1972 * conf->upstream.temp_path = NULL; |
649 | 1973 * conf->upstream.hide_headers_hash = { NULL, 0 }; |
509 | 1974 * conf->upstream.uri = { 0, NULL }; |
1975 * conf->upstream.location = NULL; | |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
1976 * conf->upstream.store_lengths = NULL; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
1977 * conf->upstream.store_values = NULL; |
509 | 1978 * |
3516
dd1570b6f237
ngx_str_set() and ngx_str_null()
Igor Sysoev <igor@sysoev.ru>
parents:
3494
diff
changeset
|
1979 * conf->index.len = { 0, NULL }; |
479 | 1980 */ |
1981 | |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
1982 conf->upstream.store = NGX_CONF_UNSET; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
1983 conf->upstream.store_access = NGX_CONF_UNSET_UINT; |
581 | 1984 conf->upstream.buffering = NGX_CONF_UNSET; |
629 | 1985 conf->upstream.ignore_client_abort = NGX_CONF_UNSET; |
581 | 1986 |
479 | 1987 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; |
1988 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; | |
507 | 1989 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; |
1990 | |
479 | 1991 conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE; |
581 | 1992 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; |
529 | 1993 |
1994 conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE; | |
577 | 1995 conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE; |
529 | 1996 conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE; |
509 | 1997 |
1998 conf->upstream.pass_request_headers = NGX_CONF_UNSET; | |
1999 conf->upstream.pass_request_body = NGX_CONF_UNSET; | |
2000 | |
2602 | 2001 #if (NGX_HTTP_CACHE) |
2002 conf->upstream.cache = NGX_CONF_UNSET_PTR; | |
2003 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:
3692
diff
changeset
|
2004 conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; |
3526
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
2005 conf->upstream.no_cache = NGX_CONF_UNSET_PTR; |
2602 | 2006 conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; |
2007 #endif | |
2008 | |
1701
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2009 conf->upstream.hide_headers = NGX_CONF_UNSET_PTR; |
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2010 conf->upstream.pass_headers = NGX_CONF_UNSET_PTR; |
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2011 |
657 | 2012 conf->upstream.intercept_errors = NGX_CONF_UNSET; |
479 | 2013 |
2014 /* "fastcgi_cyclic_temp_file" is disabled */ | |
2015 conf->upstream.cyclic_temp_file = 0; | |
2016 | |
1452
cd586e963db0
change ngx_conf_merge_ptr_value() and update fastcgi_catch_stderr
Igor Sysoev <igor@sysoev.ru>
parents:
1295
diff
changeset
|
2017 conf->catch_stderr = NGX_CONF_UNSET_PTR; |
cd586e963db0
change ngx_conf_merge_ptr_value() and update fastcgi_catch_stderr
Igor Sysoev <igor@sysoev.ru>
parents:
1295
diff
changeset
|
2018 |
4045
2d062c031fff
Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents:
3879
diff
changeset
|
2019 ngx_str_set(&conf->upstream.module, "fastcgi"); |
2d062c031fff
Merge of r3964, r3977, r3978:
Igor Sysoev <igor@sysoev.ru>
parents:
3879
diff
changeset
|
2020 |
479 | 2021 return conf; |
2022 } | |
2023 | |
2024 | |
487 | 2025 static char * |
2026 ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) | |
479 | 2027 { |
2028 ngx_http_fastcgi_loc_conf_t *prev = parent; | |
2029 ngx_http_fastcgi_loc_conf_t *conf = child; | |
2030 | |
509 | 2031 size_t size; |
649 | 2032 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
|
2033 ngx_http_core_loc_conf_t *clcf; |
479 | 2034 |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2035 if (conf->upstream.store != 0) { |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2036 ngx_conf_merge_value(conf->upstream.store, |
2894 | 2037 prev->upstream.store, 0); |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2038 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2039 if (conf->upstream.store_lengths == NULL) { |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2040 conf->upstream.store_lengths = prev->upstream.store_lengths; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2041 conf->upstream.store_values = prev->upstream.store_values; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2042 } |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2043 } |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2044 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2045 ngx_conf_merge_uint_value(conf->upstream.store_access, |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2046 prev->upstream.store_access, 0600); |
1291
13a4ce6e7f1e
proxy_store and fastcgi_store
Igor Sysoev <igor@sysoev.ru>
parents:
1276
diff
changeset
|
2047 |
581 | 2048 ngx_conf_merge_value(conf->upstream.buffering, |
2049 prev->upstream.buffering, 1); | |
2050 | |
629 | 2051 ngx_conf_merge_value(conf->upstream.ignore_client_abort, |
2052 prev->upstream.ignore_client_abort, 0); | |
2053 | |
479 | 2054 ngx_conf_merge_msec_value(conf->upstream.connect_timeout, |
2055 prev->upstream.connect_timeout, 60000); | |
507 | 2056 |
479 | 2057 ngx_conf_merge_msec_value(conf->upstream.send_timeout, |
2058 prev->upstream.send_timeout, 60000); | |
2059 | |
2060 ngx_conf_merge_msec_value(conf->upstream.read_timeout, | |
2061 prev->upstream.read_timeout, 60000); | |
2062 | |
507 | 2063 ngx_conf_merge_size_value(conf->upstream.send_lowat, |
2064 prev->upstream.send_lowat, 0); | |
479 | 2065 |
581 | 2066 ngx_conf_merge_size_value(conf->upstream.buffer_size, |
2067 prev->upstream.buffer_size, | |
479 | 2068 (size_t) ngx_pagesize); |
2069 | |
507 | 2070 |
479 | 2071 ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs, |
2072 8, ngx_pagesize); | |
2073 | |
2074 if (conf->upstream.bufs.num < 2) { | |
2075 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
2076 "there must be at least 2 \"fastcgi_buffers\""); | |
2077 return NGX_CONF_ERROR; | |
2078 } | |
2079 | |
2080 | |
581 | 2081 size = conf->upstream.buffer_size; |
479 | 2082 if (size < conf->upstream.bufs.size) { |
2083 size = conf->upstream.bufs.size; | |
2084 } | |
2085 | |
2086 | |
529 | 2087 ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf, |
2088 prev->upstream.busy_buffers_size_conf, | |
479 | 2089 NGX_CONF_UNSET_SIZE); |
2090 | |
529 | 2091 if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) { |
479 | 2092 conf->upstream.busy_buffers_size = 2 * size; |
529 | 2093 } else { |
2094 conf->upstream.busy_buffers_size = | |
2095 conf->upstream.busy_buffers_size_conf; | |
2096 } | |
479 | 2097 |
529 | 2098 if (conf->upstream.busy_buffers_size < size) { |
479 | 2099 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
2100 "\"fastcgi_busy_buffers_size\" must be equal or bigger than " | |
1125
2d978e1443ed
use the contemporary directives
Igor Sysoev <igor@sysoev.ru>
parents:
1097
diff
changeset
|
2101 "maximum of the value of \"fastcgi_buffer_size\" and " |
479 | 2102 "one of the \"fastcgi_buffers\""); |
2103 | |
2104 return NGX_CONF_ERROR; | |
529 | 2105 } |
479 | 2106 |
529 | 2107 if (conf->upstream.busy_buffers_size |
2108 > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size) | |
479 | 2109 { |
2110 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
2111 "\"fastcgi_busy_buffers_size\" must be less than " | |
2112 "the size of all \"fastcgi_buffers\" minus one buffer"); | |
2113 | |
2114 return NGX_CONF_ERROR; | |
2115 } | |
2116 | |
2117 | |
529 | 2118 ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf, |
2119 prev->upstream.temp_file_write_size_conf, | |
479 | 2120 NGX_CONF_UNSET_SIZE); |
2121 | |
529 | 2122 if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) { |
479 | 2123 conf->upstream.temp_file_write_size = 2 * size; |
529 | 2124 } else { |
2125 conf->upstream.temp_file_write_size = | |
2126 conf->upstream.temp_file_write_size_conf; | |
2127 } | |
479 | 2128 |
529 | 2129 if (conf->upstream.temp_file_write_size < size) { |
479 | 2130 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
2131 "\"fastcgi_temp_file_write_size\" must be equal or bigger than " | |
1125
2d978e1443ed
use the contemporary directives
Igor Sysoev <igor@sysoev.ru>
parents:
1097
diff
changeset
|
2132 "maximum of the value of \"fastcgi_buffer_size\" and " |
479 | 2133 "one of the \"fastcgi_buffers\""); |
2134 | |
2135 return NGX_CONF_ERROR; | |
2136 } | |
2137 | |
2138 | |
529 | 2139 ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf, |
2140 prev->upstream.max_temp_file_size_conf, | |
479 | 2141 NGX_CONF_UNSET_SIZE); |
2142 | |
529 | 2143 if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) { |
479 | 2144 conf->upstream.max_temp_file_size = 1024 * 1024 * 1024; |
529 | 2145 } else { |
2146 conf->upstream.max_temp_file_size = | |
2147 conf->upstream.max_temp_file_size_conf; | |
2148 } | |
479 | 2149 |
529 | 2150 if (conf->upstream.max_temp_file_size != 0 |
2151 && conf->upstream.max_temp_file_size < size) | |
479 | 2152 { |
2153 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
2154 "\"fastcgi_max_temp_file_size\" must be equal to zero to disable " | |
2155 "the temporary files usage or must be equal or bigger than " | |
1125
2d978e1443ed
use the contemporary directives
Igor Sysoev <igor@sysoev.ru>
parents:
1097
diff
changeset
|
2156 "maximum of the value of \"fastcgi_buffer_size\" and " |
479 | 2157 "one of the \"fastcgi_buffers\""); |
2158 | |
2159 return NGX_CONF_ERROR; | |
2160 } | |
2161 | |
2162 | |
2786
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
2163 ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers, |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
2164 prev->upstream.ignore_headers, |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
2165 NGX_CONF_BITMASK_SET); |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
2166 |
4e002555652d
proxy_ignore_headers and fastcgi_ignore_headers
Igor Sysoev <igor@sysoev.ru>
parents:
2729
diff
changeset
|
2167 |
479 | 2168 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, |
487 | 2169 prev->upstream.next_upstream, |
2170 (NGX_CONF_BITMASK_SET | |
2171 |NGX_HTTP_UPSTREAM_FT_ERROR | |
2172 |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); | |
479 | 2173 |
665 | 2174 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { |
2175 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET | |
2176 |NGX_HTTP_UPSTREAM_FT_OFF; | |
2177 } | |
2178 | |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
2179 if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path, |
479 | 2180 prev->upstream.temp_path, |
2592
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
2181 &ngx_http_fastcgi_temp_path) |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
2182 != NGX_OK) |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
2183 { |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
2184 return NGX_CONF_ERROR; |
3a8a53c0c42f
a prelimiary proxy cache support
Igor Sysoev <igor@sysoev.ru>
parents:
2467
diff
changeset
|
2185 } |
479 | 2186 |
2602 | 2187 #if (NGX_HTTP_CACHE) |
2188 | |
2189 ngx_conf_merge_ptr_value(conf->upstream.cache, | |
2190 prev->upstream.cache, NULL); | |
2191 | |
2192 if (conf->upstream.cache && conf->upstream.cache->data == NULL) { | |
2193 ngx_shm_zone_t *shm_zone; | |
2194 | |
2195 shm_zone = conf->upstream.cache; | |
2196 | |
2197 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
2198 "\"fastcgi_cache\" zone \"%V\" is unknown", | |
2716
d5896f6608e8
move zone name from ngx_shm_zone_t to ngx_shm_t to use Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents:
2661
diff
changeset
|
2199 &shm_zone->shm.name); |
2602 | 2200 |
2201 return NGX_CONF_ERROR; | |
2202 } | |
2203 | |
2204 ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, | |
2205 prev->upstream.cache_min_uses, 1); | |
2206 | |
2207 ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, | |
2208 prev->upstream.cache_use_stale, | |
2209 (NGX_CONF_BITMASK_SET | |
2210 |NGX_HTTP_UPSTREAM_FT_OFF)); | |
2211 | |
2212 if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) { | |
2213 conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET | |
2214 |NGX_HTTP_UPSTREAM_FT_OFF; | |
2215 } | |
2216 | |
2875
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
2217 if (conf->upstream.cache_methods == 0) { |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
2218 conf->upstream.cache_methods = prev->upstream.cache_methods; |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
2219 } |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
2220 |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
2221 conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD; |
6e1941b321b7
proxy_cache_methods and fastcgi_cache_methods
Igor Sysoev <igor@sysoev.ru>
parents:
2786
diff
changeset
|
2222 |
3699
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
2223 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:
3692
diff
changeset
|
2224 prev->upstream.cache_bypass, NULL); |
b0a0686a85bb
proxy_cache_pass, fastcgi_cache_bypass, uwsgi_cache_bypass, scgi_cache_bypass
Igor Sysoev <igor@sysoev.ru>
parents:
3692
diff
changeset
|
2225 |
3526
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
2226 ngx_conf_merge_ptr_value(conf->upstream.no_cache, |
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
2227 prev->upstream.no_cache, NULL); |
62a4fd1e6e2c
proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3523
diff
changeset
|
2228 |
3700
e40453e6931b
add warnings for proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3699
diff
changeset
|
2229 if (conf->upstream.no_cache && conf->upstream.cache_bypass == NULL) { |
e40453e6931b
add warnings for proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3699
diff
changeset
|
2230 ngx_log_error(NGX_LOG_WARN, cf->log, 0, |
e40453e6931b
add warnings for proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3699
diff
changeset
|
2231 "\"fastcgi_no_cache\" functionality has been changed in 0.8.46, " |
e40453e6931b
add warnings for proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3699
diff
changeset
|
2232 "now it should be used together with \"fastcgi_cache_bypass\""); |
e40453e6931b
add warnings for proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3699
diff
changeset
|
2233 } |
e40453e6931b
add warnings for proxy_no_cache and fastcgi_no_cache
Igor Sysoev <igor@sysoev.ru>
parents:
3699
diff
changeset
|
2234 |
2602 | 2235 ngx_conf_merge_ptr_value(conf->upstream.cache_valid, |
2236 prev->upstream.cache_valid, NULL); | |
2237 | |
2661 | 2238 if (conf->cache_key.value.data == NULL) { |
2239 conf->cache_key = prev->cache_key; | |
2240 } | |
2241 | |
2602 | 2242 #endif |
2243 | |
509 | 2244 ngx_conf_merge_value(conf->upstream.pass_request_headers, |
2245 prev->upstream.pass_request_headers, 1); | |
2246 ngx_conf_merge_value(conf->upstream.pass_request_body, | |
2247 prev->upstream.pass_request_body, 1); | |
2248 | |
657 | 2249 ngx_conf_merge_value(conf->upstream.intercept_errors, |
2250 prev->upstream.intercept_errors, 0); | |
509 | 2251 |
1228 | 2252 ngx_conf_merge_ptr_value(conf->catch_stderr, prev->catch_stderr, NULL); |
2253 | |
507 | 2254 |
479 | 2255 ngx_conf_merge_str_value(conf->index, prev->index, ""); |
2256 | |
1701
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2257 hash.max_size = 512; |
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2258 hash.bucket_size = ngx_align(64, ngx_cacheline_size); |
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2259 hash.name = "fastcgi_hide_headers_hash"; |
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2260 |
40d004d95d88
*) now ngx_conf_set_str_array_slot() tests NGX_CONF_UNSET_PTR
Igor Sysoev <igor@sysoev.ru>
parents:
1700
diff
changeset
|
2261 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:
3667
diff
changeset
|
2262 &prev->upstream, ngx_http_fastcgi_hide_headers, &hash) |
649 | 2263 != NGX_OK) |
2264 { | |
2265 return NGX_CONF_ERROR; | |
2266 } | |
2267 | |
884 | 2268 if (conf->upstream.upstream == NULL) { |
2269 conf->upstream.upstream = prev->upstream.upstream; | |
507 | 2270 } |
2271 | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2272 if (conf->fastcgi_lengths == NULL) { |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2273 conf->fastcgi_lengths = prev->fastcgi_lengths; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2274 conf->fastcgi_values = prev->fastcgi_values; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2275 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2276 |
3731
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
2277 if (conf->upstream.upstream || conf->fastcgi_lengths) { |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
2278 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
|
2279 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
|
2280 clcf->handler = ngx_http_fastcgi_handler; |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
2281 } |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
2282 } |
72cc5b789021
inherit proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass inside
Igor Sysoev <igor@sysoev.ru>
parents:
3729
diff
changeset
|
2283 |
2443 | 2284 #if (NGX_PCRE) |
2285 if (conf->split_regex == NULL) { | |
2286 conf->split_regex = prev->split_regex; | |
2287 conf->split_name = prev->split_name; | |
2288 } | |
2289 #endif | |
2290 | |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2291 if (ngx_http_fastcgi_merge_params(cf, conf, prev) != NGX_OK) { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2292 return NGX_CONF_ERROR; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2293 } |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2294 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2295 return NGX_CONF_OK; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2296 } |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2297 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2298 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2299 static ngx_int_t |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2300 ngx_http_fastcgi_merge_params(ngx_conf_t *cf, |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2301 ngx_http_fastcgi_loc_conf_t *conf, ngx_http_fastcgi_loc_conf_t *prev) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2302 { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2303 u_char *p; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2304 size_t size; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2305 uintptr_t *code; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2306 ngx_uint_t i, nsrc; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2307 ngx_array_t headers_names; |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2308 #if (NGX_HTTP_CACHE) |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2309 ngx_array_t params_merged; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2310 #endif |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2311 ngx_keyval_t *src; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2312 ngx_hash_key_t *hk; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2313 ngx_hash_init_t hash; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2314 ngx_http_script_compile_t sc; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2315 ngx_http_script_copy_code_t *copy; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2316 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2317 if (conf->params_source == NULL) { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2318 conf->params_source = prev->params_source; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2319 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2320 if (prev->headers_hash.buckets |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2321 #if (NGX_HTTP_CACHE) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2322 && ((conf->upstream.cache == NULL) == (prev->upstream.cache == NULL)) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2323 #endif |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2324 ) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2325 { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2326 conf->flushes = prev->flushes; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2327 conf->params_len = prev->params_len; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2328 conf->params = prev->params; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2329 conf->headers_hash = prev->headers_hash; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2330 conf->header_params = prev->header_params; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2331 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2332 return NGX_OK; |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2333 } |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2334 } |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2335 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2336 if (conf->params_source == NULL |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2337 #if (NGX_HTTP_CACHE) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2338 && (conf->upstream.cache == NULL) |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2339 #endif |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2340 ) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2341 { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2342 conf->headers_hash.buckets = (void *) 1; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2343 return NGX_OK; |
509 | 2344 } |
2345 | |
2346 conf->params_len = ngx_array_create(cf->pool, 64, 1); | |
2347 if (conf->params_len == NULL) { | |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2348 return NGX_ERROR; |
509 | 2349 } |
573 | 2350 |
509 | 2351 conf->params = ngx_array_create(cf->pool, 512, 1); |
2352 if (conf->params == NULL) { | |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2353 return NGX_ERROR; |
509 | 2354 } |
2355 | |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2356 if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2357 != NGX_OK) |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2358 { |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2359 return NGX_ERROR; |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2360 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2361 |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2362 if (conf->params_source) { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2363 src = conf->params_source->elts; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2364 nsrc = conf->params_source->nelts; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2365 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2366 } else { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2367 src = NULL; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2368 nsrc = 0; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2369 } |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2370 |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2371 #if (NGX_HTTP_CACHE) |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2372 |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2373 if (conf->upstream.cache) { |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2374 ngx_keyval_t *h, *s; |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2375 |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2376 if (ngx_array_init(¶ms_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t)) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2377 != NGX_OK) |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2378 { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2379 return NGX_ERROR; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2380 } |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2381 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2382 for (i = 0; i < nsrc; i++) { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2383 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2384 s = ngx_array_push(¶ms_merged); |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2385 if (s == NULL) { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2386 return NGX_ERROR; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2387 } |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2388 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2389 *s = src[i]; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2390 } |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2391 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2392 h = ngx_http_fastcgi_cache_headers; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2393 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2394 while (h->key.len) { |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2395 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2396 src = params_merged.elts; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2397 nsrc = params_merged.nelts; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2398 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2399 for (i = 0; i < nsrc; i++) { |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2400 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2401 goto next; |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2402 } |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2403 } |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2404 |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2405 s = ngx_array_push(¶ms_merged); |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2406 if (s == NULL) { |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2407 return NGX_ERROR; |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2408 } |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2409 |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2410 *s = *h; |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2411 |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2412 next: |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2413 |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2414 h++; |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2415 } |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2416 |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2417 src = params_merged.elts; |
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2418 nsrc = params_merged.nelts; |
3563
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2419 } |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2420 |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2421 #endif |
90d7227d47bf
do not pass if-... headers for cacheable fastcgi responses
Igor Sysoev <igor@sysoev.ru>
parents:
3562
diff
changeset
|
2422 |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2423 for (i = 0; i < nsrc; i++) { |
509 | 2424 |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2425 if (src[i].key.len > sizeof("HTTP_") - 1 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2426 && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0) |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2427 { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2428 hk = ngx_array_push(&headers_names); |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2429 if (hk == NULL) { |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2430 return NGX_ERROR; |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2431 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2432 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2433 hk->key.len = src[i].key.len - 5; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2434 hk->key.data = src[i].key.data + 5; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2435 hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len); |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2436 hk->value = (void *) 1; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2437 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2438 if (src[i].value.len == 0) { |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2439 continue; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2440 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2441 } |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2442 |
3558
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2443 copy = ngx_array_push_n(conf->params_len, |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2444 sizeof(ngx_http_script_copy_code_t)); |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2445 if (copy == NULL) { |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2446 return NGX_ERROR; |
3558
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2447 } |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2448 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2449 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2450 copy->len = src[i].key.len; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2451 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2452 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2453 size = (sizeof(ngx_http_script_copy_code_t) |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2454 + src[i].key.len + sizeof(uintptr_t) - 1) |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2455 & ~(sizeof(uintptr_t) - 1); |
3558
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2456 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2457 copy = ngx_array_push_n(conf->params, size); |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2458 if (copy == NULL) { |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2459 return NGX_ERROR; |
3558
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2460 } |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2461 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2462 copy->code = ngx_http_script_copy_code; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2463 copy->len = src[i].key.len; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2464 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2465 p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t); |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2466 ngx_memcpy(p, src[i].key.data, src[i].key.len); |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2467 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2468 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2469 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2470 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2471 sc.cf = cf; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2472 sc.source = &src[i].value; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2473 sc.flushes = &conf->flushes; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2474 sc.lengths = &conf->params_len; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2475 sc.values = &conf->params; |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2476 |
83c9a10ec029
remove the special static fastcgi_param values processing,
Igor Sysoev <igor@sysoev.ru>
parents:
3526
diff
changeset
|
2477 if (ngx_http_script_compile(&sc) != NGX_OK) { |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2478 return NGX_ERROR; |
509 | 2479 } |
2480 | |
2481 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | |
2482 if (code == NULL) { | |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2483 return NGX_ERROR; |
509 | 2484 } |
2485 | |
2486 *code = (uintptr_t) NULL; | |
2487 | |
2488 | |
2489 code = ngx_array_push_n(conf->params, sizeof(uintptr_t)); | |
2490 if (code == NULL) { | |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2491 return NGX_ERROR; |
509 | 2492 } |
2493 | |
2494 *code = (uintptr_t) NULL; | |
2495 } | |
2496 | |
2497 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | |
2498 if (code == NULL) { | |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2499 return NGX_ERROR; |
509 | 2500 } |
2501 | |
2502 *code = (uintptr_t) NULL; | |
2503 | |
3560
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2504 conf->header_params = headers_names.nelts; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2505 |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2506 hash.hash = &conf->headers_hash; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2507 hash.key = ngx_hash_key_lc; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2508 hash.max_size = 512; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2509 hash.bucket_size = 64; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2510 hash.name = "fastcgi_params_hash"; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2511 hash.pool = cf->pool; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2512 hash.temp_pool = NULL; |
a36c63c6d26a
allow fastcgi_param to override client headers using HTTP_ parameters
Igor Sysoev <igor@sysoev.ru>
parents:
3559
diff
changeset
|
2513 |
4358
94b995c7c614
Merge of r4275, r4276, r4278, r4279:
Maxim Dounin <mdounin@mdounin.ru>
parents:
4357
diff
changeset
|
2514 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); |
479 | 2515 } |
509 | 2516 |
2517 | |
573 | 2518 static ngx_int_t |
2519 ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, | |
2520 ngx_http_variable_value_t *v, uintptr_t data) | |
509 | 2521 { |
2522 u_char *p; | |
2443 | 2523 ngx_http_fastcgi_ctx_t *f; |
509 | 2524 ngx_http_fastcgi_loc_conf_t *flcf; |
2525 | |
2443 | 2526 flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); |
2527 | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2528 f = ngx_http_fastcgi_split(r, flcf); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2529 |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2530 if (f == NULL) { |
2443 | 2531 return NGX_ERROR; |
2532 } | |
2533 | |
2534 if (f->script_name.len == 0 | |
2535 || f->script_name.data[f->script_name.len - 1] != '/') | |
2536 { | |
2537 v->len = f->script_name.len; | |
1097
df8cdf626c87
fix segfault when $fastcgi_script_name is used in access_log
Igor Sysoev <igor@sysoev.ru>
parents:
1037
diff
changeset
|
2538 v->valid = 1; |
1565 | 2539 v->no_cacheable = 0; |
1097
df8cdf626c87
fix segfault when $fastcgi_script_name is used in access_log
Igor Sysoev <igor@sysoev.ru>
parents:
1037
diff
changeset
|
2540 v->not_found = 0; |
2443 | 2541 v->data = f->script_name.data; |
1097
df8cdf626c87
fix segfault when $fastcgi_script_name is used in access_log
Igor Sysoev <igor@sysoev.ru>
parents:
1037
diff
changeset
|
2542 |
573 | 2543 return NGX_OK; |
509 | 2544 } |
2545 | |
2443 | 2546 v->len = f->script_name.len + flcf->index.len; |
2547 | |
2548 v->data = ngx_pnalloc(r->pool, v->len); | |
2549 if (v->data == NULL) { | |
2550 return NGX_ERROR; | |
2551 } | |
2552 | |
2553 p = ngx_copy(v->data, f->script_name.data, f->script_name.len); | |
2554 ngx_memcpy(p, flcf->index.data, flcf->index.len); | |
2555 | |
573 | 2556 return NGX_OK; |
509 | 2557 } |
2558 | |
2559 | |
2443 | 2560 static ngx_int_t |
2561 ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r, | |
2562 ngx_http_variable_value_t *v, uintptr_t data) | |
2563 { | |
2564 ngx_http_fastcgi_ctx_t *f; | |
2565 ngx_http_fastcgi_loc_conf_t *flcf; | |
2566 | |
2567 flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); | |
2568 | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2569 f = ngx_http_fastcgi_split(r, flcf); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2570 |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2571 if (f == NULL) { |
2443 | 2572 return NGX_ERROR; |
2573 } | |
2574 | |
2575 v->len = f->path_info.len; | |
2576 v->valid = 1; | |
2577 v->no_cacheable = 0; | |
2578 v->not_found = 0; | |
2579 v->data = f->path_info.data; | |
2580 | |
2581 return NGX_OK; | |
2582 } | |
2583 | |
2584 | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2585 static ngx_http_fastcgi_ctx_t * |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2586 ngx_http_fastcgi_split(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf) |
2443 | 2587 { |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2588 ngx_http_fastcgi_ctx_t *f; |
2443 | 2589 #if (NGX_PCRE) |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2590 ngx_int_t n; |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2591 int captures[(1 + 2) * 3]; |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2592 |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2593 f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2594 |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2595 if (f == NULL) { |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2596 f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t)); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2597 if (f == NULL) { |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2598 return NULL; |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2599 } |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2600 |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2601 ngx_http_set_ctx(r, f, ngx_http_fastcgi_module); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2602 } |
2443 | 2603 |
2604 if (f->script_name.len) { | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2605 return f; |
2443 | 2606 } |
2607 | |
2608 if (flcf->split_regex == NULL) { | |
2609 f->script_name = r->uri; | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2610 return f; |
2443 | 2611 } |
2612 | |
2613 n = ngx_regex_exec(flcf->split_regex, &r->uri, captures, (1 + 2) * 3); | |
2614 | |
3325 | 2615 if (n >= 0) { /* match */ |
2616 f->script_name.len = captures[3] - captures[2]; | |
3735
1ba712d077d1
fix fastcgi_split_path_info, if URI was not fully captured
Igor Sysoev <igor@sysoev.ru>
parents:
3731
diff
changeset
|
2617 f->script_name.data = r->uri.data + captures[2]; |
3325 | 2618 |
2619 f->path_info.len = captures[5] - captures[4]; | |
3735
1ba712d077d1
fix fastcgi_split_path_info, if URI was not fully captured
Igor Sysoev <igor@sysoev.ru>
parents:
3731
diff
changeset
|
2620 f->path_info.data = r->uri.data + captures[4]; |
3325 | 2621 |
2622 return f; | |
2623 } | |
2624 | |
2443 | 2625 if (n == NGX_REGEX_NO_MATCHED) { |
2626 f->script_name = r->uri; | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2627 return f; |
2443 | 2628 } |
2629 | |
3325 | 2630 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, |
2631 ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"", | |
2632 n, &r->uri, &flcf->split_name); | |
2633 return NULL; | |
2443 | 2634 |
2635 #else | |
2636 | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2637 f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2638 |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2639 if (f == NULL) { |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2640 f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t)); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2641 if (f == NULL) { |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2642 return NULL; |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2643 } |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2644 |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2645 ngx_http_set_ctx(r, f, ngx_http_fastcgi_module); |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2646 } |
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2647 |
2443 | 2648 f->script_name = r->uri; |
2649 | |
2467
84f2bef92007
fix segfault if $fastcgi_script_name or $fastcgi_path_info were used before
Igor Sysoev <igor@sysoev.ru>
parents:
2443
diff
changeset
|
2650 return f; |
2443 | 2651 |
2652 #endif | |
2653 } | |
2654 | |
2655 | |
509 | 2656 static char * |
2657 ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
2658 { | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2659 ngx_http_fastcgi_loc_conf_t *flcf = conf; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2660 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2661 ngx_url_t u; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2662 ngx_str_t *value, *url; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2663 ngx_uint_t n; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2664 ngx_http_core_loc_conf_t *clcf; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2665 ngx_http_script_compile_t sc; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2666 |
2391
d88e757cc7d8
delete surplus upstream.schema field
Igor Sysoev <igor@sysoev.ru>
parents:
2390
diff
changeset
|
2667 if (flcf->upstream.upstream || flcf->fastcgi_lengths) { |
555 | 2668 return "is duplicate"; |
2669 } | |
2670 | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2671 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); |
2989
dff9764eaca2
do auto redirect for proxy_pass/fastcgi_pass with variables
Igor Sysoev <igor@sysoev.ru>
parents:
2927
diff
changeset
|
2672 |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2673 clcf->handler = ngx_http_fastcgi_handler; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2674 |
2989
dff9764eaca2
do auto redirect for proxy_pass/fastcgi_pass with variables
Igor Sysoev <igor@sysoev.ru>
parents:
2927
diff
changeset
|
2675 if (clcf->name.data[clcf->name.len - 1] == '/') { |
dff9764eaca2
do auto redirect for proxy_pass/fastcgi_pass with variables
Igor Sysoev <igor@sysoev.ru>
parents:
2927
diff
changeset
|
2676 clcf->auto_redirect = 1; |
dff9764eaca2
do auto redirect for proxy_pass/fastcgi_pass with variables
Igor Sysoev <igor@sysoev.ru>
parents:
2927
diff
changeset
|
2677 } |
dff9764eaca2
do auto redirect for proxy_pass/fastcgi_pass with variables
Igor Sysoev <igor@sysoev.ru>
parents:
2927
diff
changeset
|
2678 |
509 | 2679 value = cf->args->elts; |
2680 | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2681 url = &value[1]; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2682 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2683 n = ngx_http_script_variables_count(url); |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2684 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2685 if (n) { |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2686 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2687 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2688 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2689 sc.cf = cf; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2690 sc.source = url; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2691 sc.lengths = &flcf->fastcgi_lengths; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2692 sc.values = &flcf->fastcgi_values; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2693 sc.variables = n; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2694 sc.complete_lengths = 1; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2695 sc.complete_values = 1; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2696 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2697 if (ngx_http_script_compile(&sc) != NGX_OK) { |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2698 return NGX_CONF_ERROR; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2699 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2700 |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2701 return NGX_CONF_OK; |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2702 } |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2703 |
651 | 2704 ngx_memzero(&u, sizeof(ngx_url_t)); |
2705 | |
2706 u.url = value[1]; | |
884 | 2707 u.no_resolve = 1; |
2708 | |
2390
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2709 flcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); |
27ccc4b54fa6
fastcgi_pass variables support
Igor Sysoev <igor@sysoev.ru>
parents:
2256
diff
changeset
|
2710 if (flcf->upstream.upstream == NULL) { |
509 | 2711 return NGX_CONF_ERROR; |
2712 } | |
2713 | |
2714 return NGX_CONF_OK; | |
2715 } | |
2716 | |
2717 | |
2718 static char * | |
2443 | 2719 ngx_http_fastcgi_split_path_info(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
2720 { | |
2721 #if (NGX_PCRE) | |
2722 ngx_http_fastcgi_loc_conf_t *flcf = conf; | |
2723 | |
3325 | 2724 ngx_str_t *value; |
2725 ngx_regex_compile_t rc; | |
2726 u_char errstr[NGX_MAX_CONF_ERRSTR]; | |
2443 | 2727 |
2728 value = cf->args->elts; | |
2729 | |
2730 flcf->split_name = value[1]; | |
2731 | |
3325 | 2732 ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); |
2733 | |
2734 rc.pattern = value[1]; | |
2735 rc.pool = cf->pool; | |
2736 rc.err.len = NGX_MAX_CONF_ERRSTR; | |
2737 rc.err.data = errstr; | |
2738 | |
2739 if (ngx_regex_compile(&rc) != NGX_OK) { | |
2740 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err); | |
2443 | 2741 return NGX_CONF_ERROR; |
2742 } | |
2743 | |
3325 | 2744 if (rc.captures != 2) { |
2443 | 2745 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
2746 "pattern \"%V\" must have 2 captures", &value[1]); | |
2747 return NGX_CONF_ERROR; | |
2748 } | |
2749 | |
3325 | 2750 flcf->split_regex = rc.regex; |
2751 | |
2443 | 2752 return NGX_CONF_OK; |
2753 | |
2754 #else | |
2755 | |
2756 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
2757 "\"%V\" requires PCRE library", &cmd->name); | |
2758 return NGX_CONF_ERROR; | |
2759 | |
2760 #endif | |
2761 } | |
2762 | |
2763 | |
2764 static char * | |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2765 ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2766 { |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2767 ngx_http_fastcgi_loc_conf_t *flcf = conf; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2768 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2769 ngx_str_t *value; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2770 ngx_http_script_compile_t sc; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2771 |
2894 | 2772 if (flcf->upstream.store != NGX_CONF_UNSET |
2773 || flcf->upstream.store_lengths) | |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2774 { |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2775 return "is duplicate"; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2776 } |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2777 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2778 value = cf->args->elts; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2779 |
2895
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2780 if (ngx_strcmp(value[1].data, "off") == 0) { |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2781 flcf->upstream.store = 0; |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2782 return NGX_CONF_OK; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2783 } |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2784 |
2895
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2785 #if (NGX_HTTP_CACHE) |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2786 |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2787 if (flcf->upstream.cache != NGX_CONF_UNSET_PTR |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2788 && flcf->upstream.cache != NULL) |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2789 { |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2790 return "is incompatible with \"fastcgi_cache\""; |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2791 } |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2792 |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2793 #endif |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2794 |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2795 if (ngx_strcmp(value[1].data, "on") == 0) { |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2796 flcf->upstream.store = 1; |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2797 return NGX_CONF_OK; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2798 } |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2799 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2800 /* include the terminating '\0' into script */ |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2801 value[1].len++; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2802 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2803 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2804 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2805 sc.cf = cf; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2806 sc.source = &value[1]; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2807 sc.lengths = &flcf->upstream.store_lengths; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2808 sc.values = &flcf->upstream.store_values; |
1563
022ec9420f80
style fix: remove double semicolons
Igor Sysoev <igor@sysoev.ru>
parents:
1488
diff
changeset
|
2809 sc.variables = ngx_http_script_variables_count(&value[1]); |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2810 sc.complete_lengths = 1; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2811 sc.complete_values = 1; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2812 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2813 if (ngx_http_script_compile(&sc) != NGX_OK) { |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2814 return NGX_CONF_ERROR; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2815 } |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2816 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2817 return NGX_CONF_OK; |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2818 } |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2819 |
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2820 |
2602 | 2821 #if (NGX_HTTP_CACHE) |
2822 | |
2823 static char * | |
2824 ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
2825 { | |
2826 ngx_http_fastcgi_loc_conf_t *flcf = conf; | |
2827 | |
2828 ngx_str_t *value; | |
2829 | |
2830 value = cf->args->elts; | |
2831 | |
2832 if (flcf->upstream.cache != NGX_CONF_UNSET_PTR) { | |
2833 return "is duplicate"; | |
2834 } | |
2835 | |
2836 if (ngx_strcmp(value[1].data, "off") == 0) { | |
2837 flcf->upstream.cache = NULL; | |
2838 return NGX_CONF_OK; | |
2839 } | |
2840 | |
2895
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2841 if (flcf->upstream.store > 0 || flcf->upstream.store_lengths) { |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2842 return "is incompatible with \"fastcgi_store\""; |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2843 } |
d65e58a8d3a4
report about proxy/fastcgi_store and proxy/fastcgi_cache incompatibility
Igor Sysoev <igor@sysoev.ru>
parents:
2894
diff
changeset
|
2844 |
2602 | 2845 flcf->upstream.cache = ngx_shared_memory_add(cf, &value[1], 0, |
2846 &ngx_http_fastcgi_module); | |
2847 if (flcf->upstream.cache == NULL) { | |
2848 return NGX_CONF_ERROR; | |
2849 } | |
2850 | |
2851 return NGX_CONF_OK; | |
2852 } | |
2853 | |
2854 | |
2855 static char * | |
2856 ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | |
2857 { | |
2858 ngx_http_fastcgi_loc_conf_t *flcf = conf; | |
2859 | |
2860 ngx_str_t *value; | |
2861 ngx_http_compile_complex_value_t ccv; | |
2862 | |
2863 value = cf->args->elts; | |
2864 | |
2865 if (flcf->cache_key.value.len) { | |
2866 return "is duplicate"; | |
2867 } | |
2868 | |
2869 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); | |
2870 | |
2871 ccv.cf = cf; | |
2872 ccv.value = &value[1]; | |
2873 ccv.complex_value = &flcf->cache_key; | |
2874 | |
2875 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { | |
2876 return NGX_CONF_ERROR; | |
2877 } | |
2878 | |
2879 return NGX_CONF_OK; | |
2880 } | |
2881 | |
2882 #endif | |
2883 | |
2884 | |
1295
5383f5232364
proxy_store and fastcgi_store were changed,
Igor Sysoev <igor@sysoev.ru>
parents:
1291
diff
changeset
|
2885 static char * |
509 | 2886 ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post, void *data) |
2887 { | |
2888 #if (NGX_FREEBSD) | |
2889 ssize_t *np = data; | |
2890 | |
673 | 2891 if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) { |
509 | 2892 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
2893 "\"fastcgi_send_lowat\" must be less than %d " | |
2894 "(sysctl net.inet.tcp.sendspace)", | |
2895 ngx_freebsd_net_inet_tcp_sendspace); | |
2896 | |
2897 return NGX_CONF_ERROR; | |
2898 } | |
2899 | |
2900 #elif !(NGX_HAVE_SO_SNDLOWAT) | |
2901 ssize_t *np = data; | |
2902 | |
2903 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, | |
2904 "\"fastcgi_send_lowat\" is not supported, ignored"); | |
2905 | |
2906 *np = 0; | |
2907 | |
2908 #endif | |
2909 | |
2910 return NGX_CONF_OK; | |
2911 } |