comparison src/http/modules/ngx_http_proxy_module.c @ 4398:3d51ba7f347b

Fixed: proxy_redirect with regex might broke Refresh header. The problem was localized in ngx_http_proxy_rewrite_redirect_regex() handler function which did not take into account prefix when overwriting header value.
author Valentin Bartenev <vbart@nginx.com>
date Tue, 10 Jan 2012 15:09:45 +0000
parents 70ba81827472
children a0505851e70c
comparison
equal deleted inserted replaced
4397:d3000365ac65 4398:3d51ba7f347b
2346 2346
2347 static ngx_int_t 2347 static ngx_int_t
2348 ngx_http_proxy_rewrite_redirect_regex(ngx_http_request_t *r, ngx_table_elt_t *h, 2348 ngx_http_proxy_rewrite_redirect_regex(ngx_http_request_t *r, ngx_table_elt_t *h,
2349 size_t prefix, ngx_http_proxy_redirect_t *pr) 2349 size_t prefix, ngx_http_proxy_redirect_t *pr)
2350 { 2350 {
2351 size_t len;
2352 u_char *data;
2351 ngx_str_t redirect, replacement; 2353 ngx_str_t redirect, replacement;
2352 2354
2353 redirect.len = h->value.len - prefix; 2355 redirect.len = h->value.len - prefix;
2354 redirect.data = h->value.data + prefix; 2356 redirect.data = h->value.data + prefix;
2355 2357
2359 2361
2360 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { 2362 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2361 return NGX_ERROR; 2363 return NGX_ERROR;
2362 } 2364 }
2363 2365
2364 h->value = replacement; 2366 if (!prefix) {
2367 h->value = replacement;
2368 return NGX_OK;
2369 }
2370
2371 len = prefix + replacement.len;
2372
2373 data = ngx_pnalloc(r->pool, len);
2374 if (data == NULL) {
2375 return NGX_ERROR;
2376 }
2377
2378 ngx_memcpy(data, h->value.data, prefix);
2379 ngx_memcpy(data + prefix, replacement.data, replacement.len);
2380
2381 h->value.len = len;
2382 h->value.data = data;
2365 2383
2366 return NGX_OK; 2384 return NGX_OK;
2367 } 2385 }
2368 2386
2369 #endif 2387 #endif