rewrite: Fix a double-encode issue when using the {uri} placeholder (#4516)

This commit is contained in:
Francis Lavoie 2022-01-13 12:17:15 -05:00 committed by GitHub
parent 66de438a98
commit 1feb65952a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 0 deletions

View file

@ -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, "")
}

View file

@ -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"},