diff options
author | Valentin Bartenev <vbart@nginx.com> | 2012-01-10 15:09:45 +0000 |
---|---|---|
committer | Valentin Bartenev <vbart@nginx.com> | 2012-01-10 15:09:45 +0000 |
commit | b8ef9d92550b5077d376dbbe38f855c066530941 (patch) | |
tree | 05b4f84acdea4cd99efb594c287550d13ffb5c35 /src/http/modules/ngx_http_proxy_module.c | |
parent | d55ce18c953ed46893f531e2d1ba6e4db6f7399d (diff) | |
download | nginx-b8ef9d92550b5077d376dbbe38f855c066530941.tar.gz nginx-b8ef9d92550b5077d376dbbe38f855c066530941.zip |
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.
Diffstat (limited to 'src/http/modules/ngx_http_proxy_module.c')
-rw-r--r-- | src/http/modules/ngx_http_proxy_module.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c index b65093b72..78817cea8 100644 --- a/src/http/modules/ngx_http_proxy_module.c +++ b/src/http/modules/ngx_http_proxy_module.c @@ -2348,6 +2348,8 @@ static ngx_int_t ngx_http_proxy_rewrite_redirect_regex(ngx_http_request_t *r, ngx_table_elt_t *h, size_t prefix, ngx_http_proxy_redirect_t *pr) { + size_t len; + u_char *data; ngx_str_t redirect, replacement; redirect.len = h->value.len - prefix; @@ -2361,7 +2363,23 @@ ngx_http_proxy_rewrite_redirect_regex(ngx_http_request_t *r, ngx_table_elt_t *h, return NGX_ERROR; } - h->value = replacement; + if (!prefix) { + h->value = replacement; + return NGX_OK; + } + + len = prefix + replacement.len; + + data = ngx_pnalloc(r->pool, len); + if (data == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(data, h->value.data, prefix); + ngx_memcpy(data + prefix, replacement.data, replacement.len); + + h->value.len = len; + h->value.data = data; return NGX_OK; } |