Browse Source

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

master
Francis Lavoie 3 years ago
committed by GitHub
parent
commit
1feb65952a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      modules/caddyhttp/rewrite/rewrite.go
  2. 15
      modules/caddyhttp/rewrite/rewrite_test.go

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

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

Loading…
Cancel
Save