From e6143e17d3e0c3ab8a7bd8357001217eb01dc6c6 Mon Sep 17 00:00:00 2001 From: Emmanuel Odeke Date: Sun, 25 Sep 2016 18:31:05 -0700 Subject: [PATCH] net/http: add Client tests for various 3xx redirect codes Updates #13994 Updates #16840 Change-Id: Ia3cad5c211e0c688a945ed6b6277c2552592774c Reviewed-on: https://go-review.googlesource.com/29760 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/http/client_test.go | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/net/http/client_test.go b/src/net/http/client_test.go index dc9995b152..77498b3913 100644 --- a/src/net/http/client_test.go +++ b/src/net/http/client_test.go @@ -1338,3 +1338,71 @@ func TestShouldCopyHeaderOnRedirect(t *testing.T) { } } } + +func TestClientRedirectTypes(t *testing.T) { + defer afterTest(t) + + tests := [...]struct { + broken int // broken is bug number + method string + serverStatus int + wantMethod string // desired subsequent client method + }{ + 0: {method: "POST", serverStatus: 301, wantMethod: "GET"}, + 1: {method: "POST", serverStatus: 302, wantMethod: "GET"}, + 2: {method: "POST", serverStatus: 307, wantMethod: "POST", broken: 16840}, + + 5: {method: "GET", serverStatus: 301, wantMethod: "GET"}, + 6: {method: "GET", serverStatus: 302, wantMethod: "GET"}, + 7: {method: "GET", serverStatus: 303, wantMethod: "GET"}, + 8: {method: "GET", serverStatus: 307, wantMethod: "GET"}, + 9: {method: "GET", serverStatus: 308, wantMethod: "GET"}, + + 10: {method: "DELETE", serverStatus: 308, wantMethod: "DELETE", broken: 13994}, + } + + handlerc := make(chan HandlerFunc, 1) + + ts := httptest.NewServer(HandlerFunc(func(rw ResponseWriter, req *Request) { + h := <-handlerc + h(rw, req) + })) + defer ts.Close() + + for i, tt := range tests { + if tt.broken != 0 { + t.Logf("#%d: skipping known broken test case. See Issue #%d", i, tt.broken) + continue + } + + handlerc <- func(w ResponseWriter, r *Request) { + w.Header().Set("Location", ts.URL) + w.WriteHeader(tt.serverStatus) + } + + req, err := NewRequest(tt.method, ts.URL, nil) + if err != nil { + t.Errorf("#%d: NewRequest: %v", i, err) + continue + } + + c := &Client{} + c.CheckRedirect = func(req *Request, via []*Request) error { + if got, want := req.Method, tt.wantMethod; got != want { + return fmt.Errorf("#%d: got next method %q; want %q", i, got, want) + } + handlerc <- func(rw ResponseWriter, req *Request) { + // TODO: Check that the body is valid when we do 307 and 308 support + } + return nil + } + + res, err := c.Do(req) + if err != nil { + t.Errorf("#%d: Response: %v", i, err) + continue + } + + res.Body.Close() + } +}