diff options
author | Francis Lavoie <lavofr@gmail.com> | 2022-01-13 12:17:15 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-13 12:17:15 -0500 |
commit | 1feb65952acd814f9abcfb8e38f727f4e49e9e68 (patch) | |
tree | 8824bcfab94e37f4bd5b73e3615fef898d5efc26 /modules | |
parent | 66de438a98989135dc1e4ce5aeb0c4bc98af8049 (diff) |
rewrite: Fix a double-encode issue when using the `{uri}` placeholder (#4516)
Diffstat (limited to 'modules')
-rw-r--r-- | modules/caddyhttp/rewrite/rewrite.go | 13 | ||||
-rw-r--r-- | modules/caddyhttp/rewrite/rewrite_test.go | 15 |
2 files changed, 28 insertions, 0 deletions
diff --git a/modules/caddyhttp/rewrite/rewrite.go b/modules/caddyhttp/rewrite/rewrite.go index fbf655c..cd340e3 100644 --- a/modules/caddyhttp/rewrite/rewrite.go +++ b/modules/caddyhttp/rewrite/rewrite.go @@ -168,7 +168,20 @@ func (rewr Rewrite) rewrite(r *http.Request, repl *caddy.Replacer, logger *zap.L // in a temporary variable so that they all read the // same version of the URI var newPath, newQuery, newFrag string + if path != "" { + // Since the 'uri' placeholder performs a URL-encode, + // we need to intercept it so that it doesn't, because + // otherwise we risk a double-encode of the path. + uriPlaceholder := "{http.request.uri}" + if strings.Contains(path, uriPlaceholder) { + tmpUri := r.URL.Path + if r.URL.RawQuery != "" { + tmpUri += "?" + r.URL.RawQuery + } + path = strings.ReplaceAll(path, uriPlaceholder, tmpUri) + } + newPath = repl.ReplaceAll(path, "") } diff --git a/modules/caddyhttp/rewrite/rewrite_test.go b/modules/caddyhttp/rewrite/rewrite_test.go index 4d595e2..38d96fe 100644 --- a/modules/caddyhttp/rewrite/rewrite_test.go +++ b/modules/caddyhttp/rewrite/rewrite_test.go @@ -189,6 +189,21 @@ func TestRewrite(t *testing.T) { input: newRequest(t, "GET", "/foo/?a=b"), expect: newRequest(t, "GET", "/foo/bar?c=d"), }, + { + rule: Rewrite{URI: "/i{http.request.uri}"}, + input: newRequest(t, "GET", "/%C2%B7%E2%88%B5.png"), + expect: newRequest(t, "GET", "/i/%C2%B7%E2%88%B5.png"), + }, + { + rule: Rewrite{URI: "/i{http.request.uri}"}, + input: newRequest(t, "GET", "/·∵.png?a=b"), + expect: newRequest(t, "GET", "/i/%C2%B7%E2%88%B5.png?a=b"), + }, + { + rule: Rewrite{URI: "/i{http.request.uri}"}, + input: newRequest(t, "GET", "/%C2%B7%E2%88%B5.png?a=b"), + expect: newRequest(t, "GET", "/i/%C2%B7%E2%88%B5.png?a=b"), + }, { rule: Rewrite{StripPathPrefix: "/prefix"}, |