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