From: Jes Cok Date: Sat, 24 Feb 2024 11:52:38 +0000 (+0000) Subject: net/http: allow multiple spaces between method and path in mux patterns X-Git-Tag: go1.23rc1~1134 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7b583fd1a1aeda98daa5a9d485b35786c031e941;p=gostls13.git net/http: allow multiple spaces between method and path in mux patterns Fixes #64910 Change-Id: I14fd1e35c95b14591e3ad7b889dc1ab19a008730 GitHub-Last-Rev: b8d436cdee93d103703e7e6d4bb28315c5035300 GitHub-Pull-Request: golang/go#65868 Reviewed-on: https://go-review.googlesource.com/c/go/+/565916 LUCI-TryBot-Result: Go LUCI Reviewed-by: Damien Neil Reviewed-by: Jonathan Amsterdam --- diff --git a/doc/next/6-stdlib/99-minor/net/http/64910.md b/doc/next/6-stdlib/99-minor/net/http/64910.md new file mode 100644 index 0000000000..020e18b97b --- /dev/null +++ b/doc/next/6-stdlib/99-minor/net/http/64910.md @@ -0,0 +1,2 @@ +The patterns used by [`net/http.ServeMux`](//net/http#ServeMux) allow +multiple spaces matching regexp '[ \t]+'. diff --git a/src/net/http/pattern.go b/src/net/http/pattern.go index f6af19b0f4..8fd120e777 100644 --- a/src/net/http/pattern.go +++ b/src/net/http/pattern.go @@ -76,7 +76,7 @@ type segment struct { // a literal or a wildcard of the form "{name}", "{name...}", or "{$}". // // METHOD, HOST and PATH are all optional; that is, the string can be "/". -// If METHOD is present, it must be followed by a single space. +// If METHOD is present, it must be followed by at least one space or tab. // Wildcard names must be valid Go identifiers. // The "{$}" and "{name...}" wildcard must occur at the end of PATH. // PATH may end with a '/'. @@ -92,7 +92,10 @@ func parsePattern(s string) (_ *pattern, err error) { } }() - method, rest, found := strings.Cut(s, " ") + method, rest, found := s, "", false + if i := strings.IndexAny(s, " \t"); i >= 0 { + method, rest, found = s[:i], strings.TrimLeft(s[i+1:], " \t"), true + } if !found { rest = method method = "" diff --git a/src/net/http/pattern_test.go b/src/net/http/pattern_test.go index f0c84d243e..833fe88bf6 100644 --- a/src/net/http/pattern_test.go +++ b/src/net/http/pattern_test.go @@ -98,6 +98,23 @@ func TestParsePattern(t *testing.T) { "/%61%62/%7b/%", pattern{segments: []segment{lit("ab"), lit("{"), lit("%")}}, }, + // Allow multiple spaces matching regexp '[ \t]+' between method and path. + { + "GET\t /", + pattern{method: "GET", segments: []segment{multi("")}}, + }, + { + "POST \t example.com/foo/{w}", + pattern{ + method: "POST", + host: "example.com", + segments: []segment{lit("foo"), wild("w")}, + }, + }, + { + "DELETE \texample.com/a/{foo12}/{$}", + pattern{method: "DELETE", host: "example.com", segments: []segment{lit("a"), wild("foo12"), lit("/")}}, + }, } { got := mustParsePattern(t, test.in) if !got.equal(&test.want) { diff --git a/src/net/http/server.go b/src/net/http/server.go index 0ba88d1119..7d73cca43f 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2335,7 +2335,7 @@ func RedirectHandler(url string, code int) Handler { // [METHOD ][HOST]/[PATH] // // All three parts are optional; "/" is a valid pattern. -// If METHOD is present, it must be followed by a single space. +// If METHOD is present, it must be followed by at least one space or tab. // // Literal (that is, non-wildcard) parts of a pattern match // the corresponding parts of a request case-sensitively.