func (s *ReaderSuite) TestReaderRoundRobin(c *C) { called1 := false srv1 := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { called1 = true }) defer srv1.Close() called2 := false srv2 := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { called2 = true }) defer srv2.Close() target1 := srv1.URL target2 := srv2.URL reader := NewReader([]string{target1, target2}) proxyWrapper := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { reader.ServeHTTP(w, req) }) defer proxyWrapper.Close() re, _, err := testutils.Get(proxyWrapper.URL, testutils.Headers(http.Header{})) c.Assert(err, IsNil) c.Assert(re.StatusCode, Equals, http.StatusOK) c.Assert(called1, Equals, true) c.Assert(called2, Equals, false) re, _, err = testutils.Get(proxyWrapper.URL, testutils.Headers(http.Header{})) c.Assert(err, IsNil) c.Assert(re.StatusCode, Equals, http.StatusOK) c.Assert(called2, Equals, true) }
// Makes sure hop-by-hop headers are removed func (s *FwdSuite) TestForwardedHeaders(c *C) { var outHeaders http.Header srv := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { outHeaders = req.Header w.Write([]byte("hello")) }) defer srv.Close() f, err := New(Rewriter(&HeaderRewriter{TrustForwardHeader: true, Hostname: "hello"})) c.Assert(err, IsNil) proxy := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { req.URL = testutils.ParseURI(srv.URL) f.ServeHTTP(w, req) }) defer proxy.Close() headers := http.Header{ XForwardedProto: []string{"httpx"}, XForwardedFor: []string{"192.168.1.1"}, XForwardedServer: []string{"foobar"}, } re, _, err := testutils.Get(proxy.URL, testutils.Headers(headers)) c.Assert(err, IsNil) c.Assert(re.StatusCode, Equals, http.StatusOK) c.Assert(outHeaders.Get(XForwardedProto), Equals, "httpx") c.Assert(strings.Contains(outHeaders.Get(XForwardedFor), "192.168.1.1"), Equals, true) c.Assert(outHeaders.Get(XForwardedServer), Equals, "hello") }
func (s *TraceSuite) TestTraceCaptureHeaders(c *C) { respHeaders := http.Header{ "X-Re-1": []string{"6", "7"}, "X-Re-2": []string{"2", "3"}, } handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { utils.CopyHeaders(w.Header(), respHeaders) w.Write([]byte("hello")) }) buf := &bytes.Buffer{} l := utils.NewFileLogger(buf, utils.INFO) trace := &bytes.Buffer{} t, err := New(handler, trace, Logger(l), RequestHeaders("X-Req-B", "X-Req-A"), ResponseHeaders("X-Re-1", "X-Re-2")) c.Assert(err, IsNil) srv := httptest.NewServer(t) defer srv.Close() reqHeaders := http.Header{"X-Req-A": []string{"1", "2"}, "X-Req-B": []string{"3", "4"}} re, _, err := testutils.Get(srv.URL+"/hello", testutils.Headers(reqHeaders)) c.Assert(err, IsNil) c.Assert(re.StatusCode, Equals, http.StatusOK) var r *Record c.Assert(json.Unmarshal(trace.Bytes(), &r), IsNil) c.Assert(r.Request.Headers, DeepEquals, reqHeaders) c.Assert(r.Response.Headers, DeepEquals, respHeaders) }
func (s *UpdaterSuite) TestUpdaterRoundRobin(c *C) { called1 := false srv1 := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { called1 = true }) defer srv1.Close() updater := NewUpdater(srv1.URL) proxyWrapper := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { updater.ServeHTTP(w, req) }) defer proxyWrapper.Close() re, _, err := testutils.Get(proxyWrapper.URL, testutils.Headers(http.Header{})) c.Assert(err, IsNil) c.Assert(re.StatusCode, Equals, http.StatusOK) c.Assert(called1, Equals, true) }
// Makes sure hop-by-hop headers are removed func (s *FwdSuite) TestForwardHopHeaders(c *C) { called := false var outHeaders http.Header var outHost, expectedHost string srv := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { called = true outHeaders = req.Header outHost = req.Host w.Write([]byte("hello")) }) defer srv.Close() f, err := New() c.Assert(err, IsNil) proxy := testutils.NewHandler(func(w http.ResponseWriter, req *http.Request) { req.URL = testutils.ParseURI(srv.URL) expectedHost = req.URL.Host f.ServeHTTP(w, req) }) defer proxy.Close() headers := http.Header{ Connection: []string{"close"}, KeepAlive: []string{"timeout=600"}, } re, body, err := testutils.Get(proxy.URL, testutils.Headers(headers)) c.Assert(err, IsNil) c.Assert(string(body), Equals, "hello") c.Assert(re.StatusCode, Equals, http.StatusOK) c.Assert(called, Equals, true) c.Assert(outHeaders.Get(Connection), Equals, "") c.Assert(outHeaders.Get(KeepAlive), Equals, "") c.Assert(outHost, Equals, expectedHost) }