Mercurial > hg > nginx-vendor-1-0
comparison src/http/modules/ngx_http_fastcgi_module.c @ 642:1b80544421e8 NGINX_1_0_11
nginx 1.0.11
*) Change: now double quotes are encoded in an "echo" SSI-command
output.
Thanks to Zaur Abasmirzoev.
*) Feature: the "image_filter_sharpen" directive.
*) Bugfix: a segmentation fault might occur in a worker process if SNI
was used; the bug had appeared in 1.0.9.
*) Bugfix: SIGWINCH signal did not work after first binary upgrade; the
bug had appeared in 1.0.9.
*) Bugfix: the "If-Modified-Since", "If-Range", etc. client request
header lines might be passed to backend while caching; or not passed
without caching if caching was enabled in another part of the
configuration.
*) Bugfix: in the "scgi_param" directive, if complex parameters were
used.
*) Bugfix: "add_header" and "expires" directives did not work if a
request was proxied and response status code was 206.
*) Bugfix: in the "expires @time" directive.
*) Bugfix: in the ngx_http_flv_module.
Thanks to Piotr Sikora.
*) Bugfix: in the ngx_http_mp4_module.
*) Bugfix: nginx could not be built on FreeBSD 10.
*) Bugfix: nginx could not be built on AIX.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Thu, 15 Dec 2011 00:00:00 +0400 |
parents | 0d6525917227 |
children | ad25218fd14b |
comparison
equal
deleted
inserted
replaced
641:e21c9e01ce08 | 642:1b80544421e8 |
---|---|
140 | 140 |
141 static ngx_int_t ngx_http_fastcgi_add_variables(ngx_conf_t *cf); | 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); | 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, | 143 static char *ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, |
144 void *parent, void *child); | 144 void *parent, void *child); |
145 static ngx_int_t ngx_http_fastcgi_merge_params(ngx_conf_t *cf, | |
146 ngx_http_fastcgi_loc_conf_t *conf, ngx_http_fastcgi_loc_conf_t *prev); | |
147 | |
145 static ngx_int_t ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, | 148 static ngx_int_t ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, |
146 ngx_http_variable_value_t *v, uintptr_t data); | 149 ngx_http_variable_value_t *v, uintptr_t data); |
147 static ngx_int_t ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r, | 150 static ngx_int_t ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r, |
148 ngx_http_variable_value_t *v, uintptr_t data); | 151 ngx_http_variable_value_t *v, uintptr_t data); |
149 static ngx_http_fastcgi_ctx_t *ngx_http_fastcgi_split(ngx_http_request_t *r, | 152 static ngx_http_fastcgi_ctx_t *ngx_http_fastcgi_split(ngx_http_request_t *r, |
429 NGX_HTTP_LOC_CONF_OFFSET, | 432 NGX_HTTP_LOC_CONF_OFFSET, |
430 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_headers), | 433 offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_headers), |
431 &ngx_http_upstream_ignore_headers_masks }, | 434 &ngx_http_upstream_ignore_headers_masks }, |
432 | 435 |
433 { ngx_string("fastcgi_catch_stderr"), | 436 { ngx_string("fastcgi_catch_stderr"), |
434 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, | 437 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, |
435 ngx_conf_set_str_array_slot, | 438 ngx_conf_set_str_array_slot, |
436 NGX_HTTP_LOC_CONF_OFFSET, | 439 NGX_HTTP_LOC_CONF_OFFSET, |
437 offsetof(ngx_http_fastcgi_loc_conf_t, catch_stderr), | 440 offsetof(ngx_http_fastcgi_loc_conf_t, catch_stderr), |
438 NULL }, | 441 NULL }, |
439 | 442 |
2023 ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) | 2026 ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) |
2024 { | 2027 { |
2025 ngx_http_fastcgi_loc_conf_t *prev = parent; | 2028 ngx_http_fastcgi_loc_conf_t *prev = parent; |
2026 ngx_http_fastcgi_loc_conf_t *conf = child; | 2029 ngx_http_fastcgi_loc_conf_t *conf = child; |
2027 | 2030 |
2028 u_char *p; | |
2029 size_t size; | 2031 size_t size; |
2030 uintptr_t *code; | |
2031 ngx_uint_t i; | |
2032 ngx_array_t headers_names; | |
2033 ngx_keyval_t *src; | |
2034 ngx_hash_key_t *hk; | |
2035 ngx_hash_init_t hash; | 2032 ngx_hash_init_t hash; |
2036 ngx_http_core_loc_conf_t *clcf; | 2033 ngx_http_core_loc_conf_t *clcf; |
2037 ngx_http_script_compile_t sc; | |
2038 ngx_http_script_copy_code_t *copy; | |
2039 | 2034 |
2040 if (conf->upstream.store != 0) { | 2035 if (conf->upstream.store != 0) { |
2041 ngx_conf_merge_value(conf->upstream.store, | 2036 ngx_conf_merge_value(conf->upstream.store, |
2042 prev->upstream.store, 0); | 2037 prev->upstream.store, 0); |
2043 | 2038 |
2291 conf->split_regex = prev->split_regex; | 2286 conf->split_regex = prev->split_regex; |
2292 conf->split_name = prev->split_name; | 2287 conf->split_name = prev->split_name; |
2293 } | 2288 } |
2294 #endif | 2289 #endif |
2295 | 2290 |
2291 if (ngx_http_fastcgi_merge_params(cf, conf, prev) != NGX_OK) { | |
2292 return NGX_CONF_ERROR; | |
2293 } | |
2294 | |
2295 return NGX_CONF_OK; | |
2296 } | |
2297 | |
2298 | |
2299 static ngx_int_t | |
2300 ngx_http_fastcgi_merge_params(ngx_conf_t *cf, | |
2301 ngx_http_fastcgi_loc_conf_t *conf, ngx_http_fastcgi_loc_conf_t *prev) | |
2302 { | |
2303 u_char *p; | |
2304 size_t size; | |
2305 uintptr_t *code; | |
2306 ngx_uint_t i, nsrc; | |
2307 ngx_array_t headers_names; | |
2308 #if (NGX_HTTP_CACHE) | |
2309 ngx_array_t params_merged; | |
2310 #endif | |
2311 ngx_keyval_t *src; | |
2312 ngx_hash_key_t *hk; | |
2313 ngx_hash_init_t hash; | |
2314 ngx_http_script_compile_t sc; | |
2315 ngx_http_script_copy_code_t *copy; | |
2316 | |
2296 if (conf->params_source == NULL) { | 2317 if (conf->params_source == NULL) { |
2297 conf->flushes = prev->flushes; | |
2298 conf->params_len = prev->params_len; | |
2299 conf->params = prev->params; | |
2300 conf->params_source = prev->params_source; | 2318 conf->params_source = prev->params_source; |
2301 conf->headers_hash = prev->headers_hash; | 2319 |
2302 | 2320 if (prev->headers_hash.buckets |
2303 #if (NGX_HTTP_CACHE) | 2321 #if (NGX_HTTP_CACHE) |
2304 | 2322 && ((conf->upstream.cache == NULL) == (prev->upstream.cache == NULL)) |
2305 if (conf->params_source == NULL) { | |
2306 | |
2307 if ((conf->upstream.cache == NULL) | |
2308 == (prev->upstream.cache == NULL)) | |
2309 { | |
2310 return NGX_CONF_OK; | |
2311 } | |
2312 | |
2313 /* 6 is a number of ngx_http_fastcgi_cache_headers entries */ | |
2314 conf->params_source = ngx_array_create(cf->pool, 6, | |
2315 sizeof(ngx_keyval_t)); | |
2316 if (conf->params_source == NULL) { | |
2317 return NGX_CONF_ERROR; | |
2318 } | |
2319 } | |
2320 #else | |
2321 | |
2322 if (conf->params_source == NULL) { | |
2323 return NGX_CONF_OK; | |
2324 } | |
2325 | |
2326 #endif | 2323 #endif |
2324 ) | |
2325 { | |
2326 conf->flushes = prev->flushes; | |
2327 conf->params_len = prev->params_len; | |
2328 conf->params = prev->params; | |
2329 conf->headers_hash = prev->headers_hash; | |
2330 conf->header_params = prev->header_params; | |
2331 | |
2332 return NGX_OK; | |
2333 } | |
2334 } | |
2335 | |
2336 if (conf->params_source == NULL | |
2337 #if (NGX_HTTP_CACHE) | |
2338 && (conf->upstream.cache == NULL) | |
2339 #endif | |
2340 ) | |
2341 { | |
2342 conf->headers_hash.buckets = (void *) 1; | |
2343 return NGX_OK; | |
2327 } | 2344 } |
2328 | 2345 |
2329 conf->params_len = ngx_array_create(cf->pool, 64, 1); | 2346 conf->params_len = ngx_array_create(cf->pool, 64, 1); |
2330 if (conf->params_len == NULL) { | 2347 if (conf->params_len == NULL) { |
2331 return NGX_CONF_ERROR; | 2348 return NGX_ERROR; |
2332 } | 2349 } |
2333 | 2350 |
2334 conf->params = ngx_array_create(cf->pool, 512, 1); | 2351 conf->params = ngx_array_create(cf->pool, 512, 1); |
2335 if (conf->params == NULL) { | 2352 if (conf->params == NULL) { |
2336 return NGX_CONF_ERROR; | 2353 return NGX_ERROR; |
2337 } | 2354 } |
2338 | 2355 |
2339 if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) | 2356 if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) |
2340 != NGX_OK) | 2357 != NGX_OK) |
2341 { | 2358 { |
2342 return NGX_CONF_ERROR; | 2359 return NGX_ERROR; |
2343 } | 2360 } |
2344 | 2361 |
2345 src = conf->params_source->elts; | 2362 if (conf->params_source) { |
2363 src = conf->params_source->elts; | |
2364 nsrc = conf->params_source->nelts; | |
2365 | |
2366 } else { | |
2367 src = NULL; | |
2368 nsrc = 0; | |
2369 } | |
2346 | 2370 |
2347 #if (NGX_HTTP_CACHE) | 2371 #if (NGX_HTTP_CACHE) |
2348 | 2372 |
2349 if (conf->upstream.cache) { | 2373 if (conf->upstream.cache) { |
2350 ngx_keyval_t *h, *s; | 2374 ngx_keyval_t *h, *s; |
2351 | 2375 |
2352 for (h = ngx_http_fastcgi_cache_headers; h->key.len; h++) { | 2376 if (ngx_array_init(¶ms_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t)) |
2353 | 2377 != NGX_OK) |
2354 for (i = 0; i < conf->params_source->nelts; i++) { | 2378 { |
2379 return NGX_ERROR; | |
2380 } | |
2381 | |
2382 for (i = 0; i < nsrc; i++) { | |
2383 | |
2384 s = ngx_array_push(¶ms_merged); | |
2385 if (s == NULL) { | |
2386 return NGX_ERROR; | |
2387 } | |
2388 | |
2389 *s = src[i]; | |
2390 } | |
2391 | |
2392 h = ngx_http_fastcgi_cache_headers; | |
2393 | |
2394 while (h->key.len) { | |
2395 | |
2396 src = params_merged.elts; | |
2397 nsrc = params_merged.nelts; | |
2398 | |
2399 for (i = 0; i < nsrc; i++) { | |
2355 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { | 2400 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { |
2356 goto next; | 2401 goto next; |
2357 } | 2402 } |
2358 } | 2403 } |
2359 | 2404 |
2360 s = ngx_array_push(conf->params_source); | 2405 s = ngx_array_push(¶ms_merged); |
2361 if (s == NULL) { | 2406 if (s == NULL) { |
2362 return NGX_CONF_ERROR; | 2407 return NGX_ERROR; |
2363 } | 2408 } |
2364 | 2409 |
2365 *s = *h; | 2410 *s = *h; |
2366 | 2411 |
2367 src = conf->params_source->elts; | |
2368 | |
2369 next: | 2412 next: |
2370 | 2413 |
2371 h++; | 2414 h++; |
2372 } | 2415 } |
2416 | |
2417 src = params_merged.elts; | |
2418 nsrc = params_merged.nelts; | |
2373 } | 2419 } |
2374 | 2420 |
2375 #endif | 2421 #endif |
2376 | 2422 |
2377 for (i = 0; i < conf->params_source->nelts; i++) { | 2423 for (i = 0; i < nsrc; i++) { |
2378 | 2424 |
2379 if (src[i].key.len > sizeof("HTTP_") - 1 | 2425 if (src[i].key.len > sizeof("HTTP_") - 1 |
2380 && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0) | 2426 && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0) |
2381 { | 2427 { |
2382 hk = ngx_array_push(&headers_names); | 2428 hk = ngx_array_push(&headers_names); |
2383 if (hk == NULL) { | 2429 if (hk == NULL) { |
2384 return NGX_CONF_ERROR; | 2430 return NGX_ERROR; |
2385 } | 2431 } |
2386 | 2432 |
2387 hk->key.len = src[i].key.len - 5; | 2433 hk->key.len = src[i].key.len - 5; |
2388 hk->key.data = src[i].key.data + 5; | 2434 hk->key.data = src[i].key.data + 5; |
2389 hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len); | 2435 hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len); |
2395 } | 2441 } |
2396 | 2442 |
2397 copy = ngx_array_push_n(conf->params_len, | 2443 copy = ngx_array_push_n(conf->params_len, |
2398 sizeof(ngx_http_script_copy_code_t)); | 2444 sizeof(ngx_http_script_copy_code_t)); |
2399 if (copy == NULL) { | 2445 if (copy == NULL) { |
2400 return NGX_CONF_ERROR; | 2446 return NGX_ERROR; |
2401 } | 2447 } |
2402 | 2448 |
2403 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; | 2449 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code; |
2404 copy->len = src[i].key.len; | 2450 copy->len = src[i].key.len; |
2405 | 2451 |
2406 | 2452 |
2407 size = (sizeof(ngx_http_script_copy_code_t) | 2453 size = (sizeof(ngx_http_script_copy_code_t) |
2408 + src[i].key.len + sizeof(uintptr_t) - 1) | 2454 + src[i].key.len + sizeof(uintptr_t) - 1) |
2409 & ~(sizeof(uintptr_t) - 1); | 2455 & ~(sizeof(uintptr_t) - 1); |
2410 | 2456 |
2411 copy = ngx_array_push_n(conf->params, size); | 2457 copy = ngx_array_push_n(conf->params, size); |
2412 if (copy == NULL) { | 2458 if (copy == NULL) { |
2413 return NGX_CONF_ERROR; | 2459 return NGX_ERROR; |
2414 } | 2460 } |
2415 | 2461 |
2416 copy->code = ngx_http_script_copy_code; | 2462 copy->code = ngx_http_script_copy_code; |
2417 copy->len = src[i].key.len; | 2463 copy->len = src[i].key.len; |
2418 | 2464 |
2427 sc.flushes = &conf->flushes; | 2473 sc.flushes = &conf->flushes; |
2428 sc.lengths = &conf->params_len; | 2474 sc.lengths = &conf->params_len; |
2429 sc.values = &conf->params; | 2475 sc.values = &conf->params; |
2430 | 2476 |
2431 if (ngx_http_script_compile(&sc) != NGX_OK) { | 2477 if (ngx_http_script_compile(&sc) != NGX_OK) { |
2432 return NGX_CONF_ERROR; | 2478 return NGX_ERROR; |
2433 } | 2479 } |
2434 | 2480 |
2435 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | 2481 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); |
2436 if (code == NULL) { | 2482 if (code == NULL) { |
2437 return NGX_CONF_ERROR; | 2483 return NGX_ERROR; |
2438 } | 2484 } |
2439 | 2485 |
2440 *code = (uintptr_t) NULL; | 2486 *code = (uintptr_t) NULL; |
2441 | 2487 |
2442 | 2488 |
2443 code = ngx_array_push_n(conf->params, sizeof(uintptr_t)); | 2489 code = ngx_array_push_n(conf->params, sizeof(uintptr_t)); |
2444 if (code == NULL) { | 2490 if (code == NULL) { |
2445 return NGX_CONF_ERROR; | 2491 return NGX_ERROR; |
2446 } | 2492 } |
2447 | 2493 |
2448 *code = (uintptr_t) NULL; | 2494 *code = (uintptr_t) NULL; |
2449 } | 2495 } |
2450 | 2496 |
2451 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); | 2497 code = ngx_array_push_n(conf->params_len, sizeof(uintptr_t)); |
2452 if (code == NULL) { | 2498 if (code == NULL) { |
2453 return NGX_CONF_ERROR; | 2499 return NGX_ERROR; |
2454 } | 2500 } |
2455 | 2501 |
2456 *code = (uintptr_t) NULL; | 2502 *code = (uintptr_t) NULL; |
2457 | |
2458 | 2503 |
2459 conf->header_params = headers_names.nelts; | 2504 conf->header_params = headers_names.nelts; |
2460 | 2505 |
2461 hash.hash = &conf->headers_hash; | 2506 hash.hash = &conf->headers_hash; |
2462 hash.key = ngx_hash_key_lc; | 2507 hash.key = ngx_hash_key_lc; |
2464 hash.bucket_size = 64; | 2509 hash.bucket_size = 64; |
2465 hash.name = "fastcgi_params_hash"; | 2510 hash.name = "fastcgi_params_hash"; |
2466 hash.pool = cf->pool; | 2511 hash.pool = cf->pool; |
2467 hash.temp_pool = NULL; | 2512 hash.temp_pool = NULL; |
2468 | 2513 |
2469 if (ngx_hash_init(&hash, headers_names.elts, headers_names.nelts) != NGX_OK) | 2514 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); |
2470 { | |
2471 return NGX_CONF_ERROR; | |
2472 } | |
2473 | |
2474 return NGX_CONF_OK; | |
2475 } | 2515 } |
2476 | 2516 |
2477 | 2517 |
2478 static ngx_int_t | 2518 static ngx_int_t |
2479 ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, | 2519 ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, |