aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/ngx_http_proxy_module.c
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2012-01-10 15:09:45 +0000
committerValentin Bartenev <vbart@nginx.com>2012-01-10 15:09:45 +0000
commitb8ef9d92550b5077d376dbbe38f855c066530941 (patch)
tree05b4f84acdea4cd99efb594c287550d13ffb5c35 /src/http/modules/ngx_http_proxy_module.c
parentd55ce18c953ed46893f531e2d1ba6e4db6f7399d (diff)
downloadnginx-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.c20
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;
}