func TestRedirectCookiesJar(t *testing.T) { var ts *httptest.Server ts = httptest.NewServer(echoCookiesRedirectHandler) defer ts.Close() c := &Client{} c.Jar = &TestJar{perURL: make(map[string][]*Cookie)} u, _ := url.Parse(ts.URL) c.Jar.SetCookies(u, []*Cookie{expectedCookies[0]}) resp, _ := c.Get(ts.URL) matchReturnedCookies(t, expectedCookies, resp.Cookies()) }
func TestRedirectCookiesOnRequest(t *testing.T) { var ts *httptest.Server ts = httptest.NewServer(echoCookiesRedirectHandler) defer ts.Close() c := &Client{} req, _ := NewRequest("GET", ts.URL, nil) req.AddCookie(expectedCookies[0]) // TODO: Uncomment when an implementation of a RFC6265 cookie jar lands. _ = c // resp, _ := c.Do(req) // matchReturnedCookies(t, expectedCookies, resp.Cookies()) req, _ = NewRequest("GET", ts.URL, nil) // resp, _ = c.Do(req) // matchReturnedCookies(t, expectedCookies[1:], resp.Cookies()) }
func TestRedirects(t *testing.T) { var ts *httptest.Server ts = httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { n, _ := strconv.Atoi(r.FormValue("n")) // Test Referer header. (7 is arbitrary position to test at) if n == 7 { if g, e := r.Referer(), ts.URL+"/?n=6"; e != g { t.Errorf("on request ?n=7, expected referer of %q; got %q", e, g) } } if n < 15 { Redirect(w, r, fmt.Sprintf("/?n=%d", n+1), StatusFound) return } fmt.Fprintf(w, "n=%d", n) })) defer ts.Close() c := &Client{} _, err := c.Get(ts.URL) if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g { t.Errorf("with default client Get, expected error %q, got %q", e, g) } // HEAD request should also have the ability to follow redirects. _, err = c.Head(ts.URL) if e, g := "Head /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g { t.Errorf("with default client Head, expected error %q, got %q", e, g) } // Do should also follow redirects. greq, _ := NewRequest("GET", ts.URL, nil) _, err = c.Do(greq) if e, g := "Get /?n=10: stopped after 10 redirects", fmt.Sprintf("%v", err); e != g { t.Errorf("with default client Do, expected error %q, got %q", e, g) } var checkErr error var lastVia []*Request c = &Client{CheckRedirect: func(_ *Request, _ *Response, via []*Request) error { lastVia = via return checkErr }} res, err := c.Get(ts.URL) finalUrl := res.Request.URL.String() if e, g := "<nil>", fmt.Sprintf("%v", err); e != g { t.Errorf("with custom client, expected error %q, got %q", e, g) } if !strings.HasSuffix(finalUrl, "/?n=15") { t.Errorf("expected final url to end in /?n=15; got url %q", finalUrl) } if e, g := 15, len(lastVia); e != g { t.Errorf("expected lastVia to have contained %d elements; got %d", e, g) } checkErr = errors.New("no redirects allowed") res, err = c.Get(ts.URL) finalUrl = res.Request.URL.String() if e, g := "Get /?n=1: no redirects allowed", fmt.Sprintf("%v", err); e != g { t.Errorf("with redirects forbidden, expected error %q, got %q", e, g) } }