mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-28 14:43:48 +03:00
rewrite: Fix a double-encode issue when using the {uri}
placeholder (#4516)
This commit is contained in:
parent
66de438a98
commit
1feb65952a
2 changed files with 28 additions and 0 deletions
|
@ -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
|
// in a temporary variable so that they all read the
|
||||||
// same version of the URI
|
// same version of the URI
|
||||||
var newPath, newQuery, newFrag string
|
var newPath, newQuery, newFrag string
|
||||||
|
|
||||||
if path != "" {
|
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, "")
|
newPath = repl.ReplaceAll(path, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -189,6 +189,21 @@ func TestRewrite(t *testing.T) {
|
||||||
input: newRequest(t, "GET", "/foo/?a=b"),
|
input: newRequest(t, "GET", "/foo/?a=b"),
|
||||||
expect: newRequest(t, "GET", "/foo/bar?c=d"),
|
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"},
|
rule: Rewrite{StripPathPrefix: "/prefix"},
|
||||||
|
|
Loading…
Reference in a new issue