mirror of
https://github.com/golang/go
synced 2024-11-07 03:26:10 -07:00
net/http: use relative path in Location redirect
If the cleaned path did not match the requested path, ServeMux.Handler would return a Location header which reflected the hostname in the request, possibly leading to an incorrect redirect. Instead the Location header should be relative, like the other cases in ServeMux.Handler. Change-Id: I2c220d925e708061bc128f0bdc96cca7a32764d3 Reviewed-on: https://go-review.googlesource.com/c/go/+/313950 Trust: Roland Shoemaker <roland@golang.org> Trust: Katie Hockman <katie@golang.org> Run-TryBot: Roland Shoemaker <roland@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Katie Hockman <katie@golang.org>
This commit is contained in:
parent
169155d61e
commit
b584230889
@ -6507,3 +6507,20 @@ func TestDisableKeepAliveUpgrade(t *testing.T) {
|
|||||||
t.Fatalf("unexpected value read from body:\ngot: %q\nwant: %q", b, "hello")
|
t.Fatalf("unexpected value read from body:\ngot: %q\nwant: %q", b, "hello")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMuxRedirectRelative(t *testing.T) {
|
||||||
|
setParallel(t)
|
||||||
|
req, err := ReadRequest(bufio.NewReader(strings.NewReader("GET http://example.com HTTP/1.1\r\nHost: test\r\n\r\n")))
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%s", err)
|
||||||
|
}
|
||||||
|
mux := NewServeMux()
|
||||||
|
resp := httptest.NewRecorder()
|
||||||
|
mux.ServeHTTP(resp, req)
|
||||||
|
if got, want := resp.Header().Get("Location"), "/"; got != want {
|
||||||
|
t.Errorf("Location header expected %q; got %q", want, got)
|
||||||
|
}
|
||||||
|
if got, want := resp.Code, StatusMovedPermanently; got != want {
|
||||||
|
t.Errorf("Expected response code %d; got %d", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2404,9 +2404,8 @@ func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) {
|
|||||||
|
|
||||||
if path != r.URL.Path {
|
if path != r.URL.Path {
|
||||||
_, pattern = mux.handler(host, path)
|
_, pattern = mux.handler(host, path)
|
||||||
url := *r.URL
|
u := &url.URL{Path: path, RawQuery: r.URL.RawQuery}
|
||||||
url.Path = path
|
return RedirectHandler(u.String(), StatusMovedPermanently), pattern
|
||||||
return RedirectHandler(url.String(), StatusMovedPermanently), pattern
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return mux.handler(host, r.URL.Path)
|
return mux.handler(host, r.URL.Path)
|
||||||
|
Loading…
Reference in New Issue
Block a user