Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_proxy_module.c @ 4461:103587c7ae5f
Proxy: renamed some "proxy_redirect" related declarations to a more general and
reusable.
No functional changes.
author | Valentin Bartenev <vbart@nginx.com> |
---|---|
date | Mon, 13 Feb 2012 10:42:44 +0000 |
parents | b1a9d725ab69 |
children | a73c63bdce32 |
comparison
equal
deleted
inserted
replaced
4460:6299d1c4dbb4 | 4461:103587c7ae5f |
---|---|
8 #include <ngx_config.h> | 8 #include <ngx_config.h> |
9 #include <ngx_core.h> | 9 #include <ngx_core.h> |
10 #include <ngx_http.h> | 10 #include <ngx_http.h> |
11 | 11 |
12 | 12 |
13 typedef struct ngx_http_proxy_redirect_s ngx_http_proxy_redirect_t; | 13 typedef struct ngx_http_proxy_rewrite_s ngx_http_proxy_rewrite_t; |
14 | 14 |
15 typedef ngx_int_t (*ngx_http_proxy_redirect_pt)(ngx_http_request_t *r, | 15 typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r, |
16 ngx_table_elt_t *h, size_t prefix, ngx_http_proxy_redirect_t *pr); | 16 ngx_table_elt_t *h, size_t prefix, ngx_http_proxy_rewrite_t *pr); |
17 | 17 |
18 struct ngx_http_proxy_redirect_s { | 18 struct ngx_http_proxy_rewrite_s { |
19 ngx_http_proxy_redirect_pt handler; | 19 ngx_http_proxy_rewrite_pt handler; |
20 | 20 |
21 union { | 21 union { |
22 ngx_http_complex_value_t complex; | 22 ngx_http_complex_value_t complex; |
23 #if (NGX_PCRE) | 23 #if (NGX_PCRE) |
24 ngx_http_regex_t *regex; | 24 ngx_http_regex_t *regex; |
25 #endif | 25 #endif |
26 } redirect; | 26 } pattern; |
27 | 27 |
28 ngx_http_complex_value_t replacement; | 28 ngx_http_complex_value_t replacement; |
29 }; | 29 }; |
30 | 30 |
31 | 31 |
2272 ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h, | 2272 ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h, |
2273 size_t prefix) | 2273 size_t prefix) |
2274 { | 2274 { |
2275 ngx_int_t rc; | 2275 ngx_int_t rc; |
2276 ngx_uint_t i; | 2276 ngx_uint_t i; |
2277 ngx_http_proxy_rewrite_t *pr; | |
2277 ngx_http_proxy_loc_conf_t *plcf; | 2278 ngx_http_proxy_loc_conf_t *plcf; |
2278 ngx_http_proxy_redirect_t *pr; | |
2279 | 2279 |
2280 plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); | 2280 plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); |
2281 | 2281 |
2282 pr = plcf->redirects->elts; | 2282 pr = plcf->redirects->elts; |
2283 | 2283 |
2296 return NGX_DECLINED; | 2296 return NGX_DECLINED; |
2297 } | 2297 } |
2298 | 2298 |
2299 | 2299 |
2300 static ngx_int_t | 2300 static ngx_int_t |
2301 ngx_http_proxy_rewrite_redirect_complex(ngx_http_request_t *r, | 2301 ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r, |
2302 ngx_table_elt_t *h, size_t prefix, ngx_http_proxy_redirect_t *pr) | 2302 ngx_table_elt_t *h, size_t prefix, ngx_http_proxy_rewrite_t *pr) |
2303 { | 2303 { |
2304 size_t len; | 2304 size_t len; |
2305 u_char *data, *p; | 2305 u_char *data, *p; |
2306 ngx_str_t redirect, replacement; | 2306 ngx_str_t pattern, replacement; |
2307 | 2307 |
2308 if (ngx_http_complex_value(r, &pr->redirect.complex, &redirect) != NGX_OK) { | 2308 if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) { |
2309 return NGX_ERROR; | 2309 return NGX_ERROR; |
2310 } | 2310 } |
2311 | 2311 |
2312 if (redirect.len > h->value.len - prefix | 2312 if (pattern.len > h->value.len - prefix |
2313 || ngx_rstrncmp(h->value.data + prefix, redirect.data, | 2313 || ngx_rstrncmp(h->value.data + prefix, pattern.data, |
2314 redirect.len) != 0) | 2314 pattern.len) != 0) |
2315 { | 2315 { |
2316 return NGX_DECLINED; | 2316 return NGX_DECLINED; |
2317 } | 2317 } |
2318 | 2318 |
2319 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { | 2319 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { |
2320 return NGX_ERROR; | 2320 return NGX_ERROR; |
2321 } | 2321 } |
2322 | 2322 |
2323 len = replacement.len + h->value.len - redirect.len; | 2323 len = replacement.len + h->value.len - pattern.len; |
2324 | 2324 |
2325 data = ngx_pnalloc(r->pool, len); | 2325 data = ngx_pnalloc(r->pool, len); |
2326 if (data == NULL) { | 2326 if (data == NULL) { |
2327 return NGX_ERROR; | 2327 return NGX_ERROR; |
2328 } | 2328 } |
2331 | 2331 |
2332 if (replacement.len) { | 2332 if (replacement.len) { |
2333 p = ngx_copy(p, replacement.data, replacement.len); | 2333 p = ngx_copy(p, replacement.data, replacement.len); |
2334 } | 2334 } |
2335 | 2335 |
2336 ngx_memcpy(p, h->value.data + prefix + redirect.len, | 2336 ngx_memcpy(p, h->value.data + prefix + pattern.len, |
2337 h->value.len - redirect.len - prefix); | 2337 h->value.len - pattern.len - prefix); |
2338 | 2338 |
2339 h->value.len = len; | 2339 h->value.len = len; |
2340 h->value.data = data; | 2340 h->value.data = data; |
2341 | 2341 |
2342 return NGX_OK; | 2342 return NGX_OK; |
2344 | 2344 |
2345 | 2345 |
2346 #if (NGX_PCRE) | 2346 #if (NGX_PCRE) |
2347 | 2347 |
2348 static ngx_int_t | 2348 static ngx_int_t |
2349 ngx_http_proxy_rewrite_redirect_regex(ngx_http_request_t *r, ngx_table_elt_t *h, | 2349 ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_table_elt_t *h, |
2350 size_t prefix, ngx_http_proxy_redirect_t *pr) | 2350 size_t prefix, ngx_http_proxy_rewrite_t *pr) |
2351 { | 2351 { |
2352 size_t len; | 2352 size_t len; |
2353 u_char *data; | 2353 u_char *data; |
2354 ngx_str_t redirect, replacement; | 2354 ngx_str_t pattern, replacement; |
2355 | 2355 |
2356 redirect.len = h->value.len - prefix; | 2356 pattern.len = h->value.len - prefix; |
2357 redirect.data = h->value.data + prefix; | 2357 pattern.data = h->value.data + prefix; |
2358 | 2358 |
2359 if (ngx_http_regex_exec(r, pr->redirect.regex, &redirect) != NGX_OK) { | 2359 if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) { |
2360 return NGX_DECLINED; | 2360 return NGX_DECLINED; |
2361 } | 2361 } |
2362 | 2362 |
2363 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { | 2363 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { |
2364 return NGX_ERROR; | 2364 return NGX_ERROR; |
2505 | 2505 |
2506 u_char *p; | 2506 u_char *p; |
2507 size_t size; | 2507 size_t size; |
2508 ngx_hash_init_t hash; | 2508 ngx_hash_init_t hash; |
2509 ngx_http_core_loc_conf_t *clcf; | 2509 ngx_http_core_loc_conf_t *clcf; |
2510 ngx_http_proxy_redirect_t *pr; | 2510 ngx_http_proxy_rewrite_t *pr; |
2511 ngx_http_script_compile_t sc; | 2511 ngx_http_script_compile_t sc; |
2512 | 2512 |
2513 if (conf->upstream.store != 0) { | 2513 if (conf->upstream.store != 0) { |
2514 ngx_conf_merge_value(conf->upstream.store, | 2514 ngx_conf_merge_value(conf->upstream.store, |
2515 prev->upstream.store, 0); | 2515 prev->upstream.store, 0); |
2758 } | 2758 } |
2759 | 2759 |
2760 if (conf->redirects == NULL && conf->url.data) { | 2760 if (conf->redirects == NULL && conf->url.data) { |
2761 | 2761 |
2762 conf->redirects = ngx_array_create(cf->pool, 1, | 2762 conf->redirects = ngx_array_create(cf->pool, 1, |
2763 sizeof(ngx_http_proxy_redirect_t)); | 2763 sizeof(ngx_http_proxy_rewrite_t)); |
2764 if (conf->redirects == NULL) { | 2764 if (conf->redirects == NULL) { |
2765 return NGX_CONF_ERROR; | 2765 return NGX_CONF_ERROR; |
2766 } | 2766 } |
2767 | 2767 |
2768 pr = ngx_array_push(conf->redirects); | 2768 pr = ngx_array_push(conf->redirects); |
2769 if (pr == NULL) { | 2769 if (pr == NULL) { |
2770 return NGX_CONF_ERROR; | 2770 return NGX_CONF_ERROR; |
2771 } | 2771 } |
2772 | 2772 |
2773 ngx_memzero(&pr->redirect.complex, | 2773 ngx_memzero(&pr->pattern.complex, |
2774 sizeof(ngx_http_complex_value_t)); | 2774 sizeof(ngx_http_complex_value_t)); |
2775 | 2775 |
2776 ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t)); | 2776 ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t)); |
2777 | 2777 |
2778 pr->handler = ngx_http_proxy_rewrite_redirect_complex; | 2778 pr->handler = ngx_http_proxy_rewrite_complex_handler; |
2779 | 2779 |
2780 if (conf->vars.uri.len) { | 2780 if (conf->vars.uri.len) { |
2781 pr->redirect.complex.value = conf->url; | 2781 pr->pattern.complex.value = conf->url; |
2782 pr->replacement.value = conf->location; | 2782 pr->replacement.value = conf->location; |
2783 | 2783 |
2784 } else { | 2784 } else { |
2785 pr->redirect.complex.value.len = conf->url.len | 2785 pr->pattern.complex.value.len = conf->url.len |
2786 + sizeof("/") - 1; | 2786 + sizeof("/") - 1; |
2787 | 2787 |
2788 p = ngx_pnalloc(cf->pool, pr->redirect.complex.value.len); | 2788 p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len); |
2789 if (p == NULL) { | 2789 if (p == NULL) { |
2790 return NGX_CONF_ERROR; | 2790 return NGX_CONF_ERROR; |
2791 } | 2791 } |
2792 | 2792 |
2793 pr->redirect.complex.value.data = p; | 2793 pr->pattern.complex.value.data = p; |
2794 | 2794 |
2795 p = ngx_cpymem(p, conf->url.data, conf->url.len); | 2795 p = ngx_cpymem(p, conf->url.data, conf->url.len); |
2796 *p = '/'; | 2796 *p = '/'; |
2797 | 2797 |
2798 ngx_str_set(&pr->replacement.value, "/"); | 2798 ngx_str_set(&pr->replacement.value, "/"); |
3283 { | 3283 { |
3284 ngx_http_proxy_loc_conf_t *plcf = conf; | 3284 ngx_http_proxy_loc_conf_t *plcf = conf; |
3285 | 3285 |
3286 u_char *p; | 3286 u_char *p; |
3287 ngx_str_t *value; | 3287 ngx_str_t *value; |
3288 ngx_http_proxy_redirect_t *pr; | 3288 ngx_http_proxy_rewrite_t *pr; |
3289 ngx_http_compile_complex_value_t ccv; | 3289 ngx_http_compile_complex_value_t ccv; |
3290 | 3290 |
3291 if (plcf->redirect == 0) { | 3291 if (plcf->redirect == 0) { |
3292 return NGX_CONF_OK; | 3292 return NGX_CONF_OK; |
3293 } | 3293 } |
3318 } | 3318 } |
3319 } | 3319 } |
3320 | 3320 |
3321 if (plcf->redirects == NULL) { | 3321 if (plcf->redirects == NULL) { |
3322 plcf->redirects = ngx_array_create(cf->pool, 1, | 3322 plcf->redirects = ngx_array_create(cf->pool, 1, |
3323 sizeof(ngx_http_proxy_redirect_t)); | 3323 sizeof(ngx_http_proxy_rewrite_t)); |
3324 if (plcf->redirects == NULL) { | 3324 if (plcf->redirects == NULL) { |
3325 return NGX_CONF_ERROR; | 3325 return NGX_CONF_ERROR; |
3326 } | 3326 } |
3327 } | 3327 } |
3328 | 3328 |
3344 "\"proxy_redirect default\" must go " | 3344 "\"proxy_redirect default\" must go " |
3345 "after the \"proxy_pass\" directive"); | 3345 "after the \"proxy_pass\" directive"); |
3346 return NGX_CONF_ERROR; | 3346 return NGX_CONF_ERROR; |
3347 } | 3347 } |
3348 | 3348 |
3349 pr->handler = ngx_http_proxy_rewrite_redirect_complex; | 3349 pr->handler = ngx_http_proxy_rewrite_complex_handler; |
3350 | 3350 |
3351 ngx_memzero(&pr->redirect.complex, sizeof(ngx_http_complex_value_t)); | 3351 ngx_memzero(&pr->pattern.complex, sizeof(ngx_http_complex_value_t)); |
3352 | 3352 |
3353 ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t)); | 3353 ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t)); |
3354 | 3354 |
3355 if (plcf->vars.uri.len) { | 3355 if (plcf->vars.uri.len) { |
3356 pr->redirect.complex.value = plcf->url; | 3356 pr->pattern.complex.value = plcf->url; |
3357 pr->replacement.value = plcf->location; | 3357 pr->replacement.value = plcf->location; |
3358 | 3358 |
3359 } else { | 3359 } else { |
3360 pr->redirect.complex.value.len = plcf->url.len + sizeof("/") - 1; | 3360 pr->pattern.complex.value.len = plcf->url.len + sizeof("/") - 1; |
3361 | 3361 |
3362 p = ngx_pnalloc(cf->pool, pr->redirect.complex.value.len); | 3362 p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len); |
3363 if (p == NULL) { | 3363 if (p == NULL) { |
3364 return NGX_CONF_ERROR; | 3364 return NGX_CONF_ERROR; |
3365 } | 3365 } |
3366 | 3366 |
3367 pr->redirect.complex.value.data = p; | 3367 pr->pattern.complex.value.data = p; |
3368 | 3368 |
3369 p = ngx_cpymem(p, plcf->url.data, plcf->url.len); | 3369 p = ngx_cpymem(p, plcf->url.data, plcf->url.len); |
3370 *p = '/'; | 3370 *p = '/'; |
3371 | 3371 |
3372 ngx_str_set(&pr->replacement.value, "/"); | 3372 ngx_str_set(&pr->replacement.value, "/"); |
3394 | 3394 |
3395 rc.pattern = value[1]; | 3395 rc.pattern = value[1]; |
3396 rc.err.len = NGX_MAX_CONF_ERRSTR; | 3396 rc.err.len = NGX_MAX_CONF_ERRSTR; |
3397 rc.err.data = errstr; | 3397 rc.err.data = errstr; |
3398 | 3398 |
3399 pr->redirect.regex = ngx_http_regex_compile(cf, &rc); | 3399 pr->pattern.regex = ngx_http_regex_compile(cf, &rc); |
3400 if (pr->redirect.regex == NULL) { | 3400 if (pr->pattern.regex == NULL) { |
3401 return NGX_CONF_ERROR; | 3401 return NGX_CONF_ERROR; |
3402 } | 3402 } |
3403 | 3403 |
3404 pr->handler = ngx_http_proxy_rewrite_redirect_regex; | 3404 pr->handler = ngx_http_proxy_rewrite_regex_handler; |
3405 | 3405 |
3406 #else | 3406 #else |
3407 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 3407 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3408 "using regex \"%V\" requires PCRE library", | 3408 "using regex \"%V\" requires PCRE library", |
3409 &value[1]); | 3409 &value[1]); |
3414 | 3414 |
3415 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); | 3415 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); |
3416 | 3416 |
3417 ccv.cf = cf; | 3417 ccv.cf = cf; |
3418 ccv.value = &value[1]; | 3418 ccv.value = &value[1]; |
3419 ccv.complex_value = &pr->redirect.complex; | 3419 ccv.complex_value = &pr->pattern.complex; |
3420 | 3420 |
3421 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { | 3421 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { |
3422 return NGX_CONF_ERROR; | 3422 return NGX_CONF_ERROR; |
3423 } | 3423 } |
3424 | 3424 |
3425 pr->handler = ngx_http_proxy_rewrite_redirect_complex; | 3425 pr->handler = ngx_http_proxy_rewrite_complex_handler; |
3426 } | 3426 } |
3427 | 3427 |
3428 | 3428 |
3429 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); | 3429 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); |
3430 | 3430 |