Skip to content

Instantly share code, notes, and snippets.

@cezarsa
Created May 23, 2017 18:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cezarsa/c3a88a85f41862ad289b2a631ec7443d to your computer and use it in GitHub Desktop.
Save cezarsa/c3a88a85f41862ad289b2a631ec7443d to your computer and use it in GitHub Desktop.
func (s *S) TestRoundTripSNI(c *check.C) {
var receivedReq *http.Request
ts := httptest.NewTLSServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
receivedReq = req
rw.Header().Set("X-Some-Rsp-Header", "rspvalue")
rw.WriteHeader(200)
rw.Write([]byte("my result"))
}))
defer ts.Close()
router := &recoderRouter{dst: ts.URL}
rp := &SNIReverseProxy{}
err := rp.Initialize(ReverseProxyConfig{Router: router, RequestIDHeader: "X-RID"})
c.Assert(err, check.IsNil)
addr, listener := getFreeListener()
go rp.Listen(listener)
defer rp.Stop()
defer listener.Close()
req, err := http.NewRequest("GET", fmt.Sprintf("https://%s/", addr), nil)
c.Assert(err, check.IsNil)
req.Host = "example.com"
req.Header.Set("X-My-Header", "myvalue")
cert, err := x509.ParseCertificate(ts.TLS.Certificates[0].Certificate[0])
c.Assert(err, check.IsNil)
certpool := x509.NewCertPool()
certpool.AddCert(cert)
cli := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: certpool,
ServerName: req.Host,
},
},
}
rsp, err := cli.Do(req)
c.Assert(err, check.IsNil)
defer rsp.Body.Close()
c.Assert(rsp.StatusCode, check.Equals, 200)
c.Assert(rsp.Header.Get("X-Some-Rsp-Header"), check.Equals, "rspvalue")
data, err := ioutil.ReadAll(rsp.Body)
c.Assert(err, check.IsNil)
c.Assert(string(data), check.Equals, "my result")
c.Assert(receivedReq.Host, check.Equals, "example.com")
c.Assert(receivedReq.Header.Get("X-My-Header"), check.Equals, "myvalue")
c.Assert(receivedReq.Header.Get("X-Host"), check.Equals, "")
c.Assert(receivedReq.Header.Get("X-Forwarded-Host"), check.Equals, "")
c.Assert(router.resultHost, check.Equals, "example.com")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment