From 6a6c792eef55eded7fb3165a330ec2b239b83960 Mon Sep 17 00:00:00 2001 From: Emmanuel Odeke Date: Sat, 20 May 2017 18:19:54 -0600 Subject: net/http: make ServeMux preserve query string during redirects Ensure that the implicitly created redirect for "/route" after "/route/" has been registered doesn't lose the query string information. Fixes #17841. Change-Id: Ib7df9242fab8c9368a18fc0da678003d6bec63b8 Reviewed-on: https://go-review.googlesource.com/43779 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/http/server.go | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/net/http/server.go') diff --git a/src/net/http/server.go b/src/net/http/server.go index 45f8e1b16a..71f46a74f9 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -1963,6 +1963,7 @@ func StripPrefix(prefix string, h Handler) Handler { // The provided code should be in the 3xx range and is usually // StatusMovedPermanently, StatusFound or StatusSeeOther. func Redirect(w ResponseWriter, r *Request, urlStr string, code int) { + queryAlreadySet := false if u, err := url.Parse(urlStr); err == nil { // If url was relative, make absolute by // combining with request path. @@ -2005,9 +2006,17 @@ func Redirect(w ResponseWriter, r *Request, urlStr string, code int) { urlStr += "/" } urlStr += query + queryAlreadySet = len(query) != 0 } } + // We should make sure not to lose the query string of + // the original request when doing a redirect, if not already set. + // See Issue 17841. + if !queryAlreadySet && len(r.URL.RawQuery) != 0 { + urlStr += "?" + r.URL.RawQuery + } + w.Header().Set("Location", hexEscapeNonASCII(urlStr)) w.WriteHeader(code) -- cgit v1.3-6-g1900