mirror of
https://github.com/traefik/traefik.git
synced 2025-10-29 23:41:43 +01:00
Attempt to fix TestProxyFromEnvironment test
Co-authored-by: Kevin Pollet <pollet.kevin@gmail.com>
This commit is contained in:
parent
0b4058dde0
commit
2fdee25bb3
@ -20,7 +20,6 @@ import (
|
|||||||
"github.com/traefik/traefik/v3/pkg/config/dynamic"
|
"github.com/traefik/traefik/v3/pkg/config/dynamic"
|
||||||
"github.com/traefik/traefik/v3/pkg/config/static"
|
"github.com/traefik/traefik/v3/pkg/config/static"
|
||||||
"github.com/traefik/traefik/v3/pkg/testhelpers"
|
"github.com/traefik/traefik/v3/pkg/testhelpers"
|
||||||
"github.com/traefik/traefik/v3/pkg/tls/generate"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -125,9 +124,17 @@ func TestProxyFromEnvironment(t *testing.T) {
|
|||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
t.Run(test.desc, func(t *testing.T) {
|
t.Run(test.desc, func(t *testing.T) {
|
||||||
backendURL, backendCert := newBackendServer(t, test.tls, http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
var backendServer *httptest.Server
|
||||||
|
if test.tls {
|
||||||
|
backendServer = httptest.NewTLSServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
||||||
|
_, _ = rw.Write([]byte("backendTLS"))
|
||||||
|
}))
|
||||||
|
} else {
|
||||||
|
backendServer = httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
||||||
_, _ = rw.Write([]byte("backend"))
|
_, _ = rw.Write([]byte("backend"))
|
||||||
}))
|
}))
|
||||||
|
}
|
||||||
|
t.Cleanup(backendServer.Close)
|
||||||
|
|
||||||
var proxyCalled bool
|
var proxyCalled bool
|
||||||
proxyHandler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
proxyHandler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
|
||||||
@ -155,8 +162,21 @@ func TestProxyFromEnvironment(t *testing.T) {
|
|||||||
connHj, _, err := hj.Hijack()
|
connHj, _, err := hj.Hijack()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
go func() { _, _ = io.Copy(connHj, conn) }()
|
defer func() {
|
||||||
_, _ = io.Copy(conn, connHj)
|
_ = connHj.Close()
|
||||||
|
_ = conn.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
errCh := make(chan error, 1)
|
||||||
|
go func() {
|
||||||
|
_, err = io.Copy(connHj, conn)
|
||||||
|
errCh <- err
|
||||||
|
}()
|
||||||
|
go func() {
|
||||||
|
_, err = io.Copy(conn, connHj)
|
||||||
|
errCh <- err
|
||||||
|
}()
|
||||||
|
<-errCh // Wait for one of the copy operations to finish
|
||||||
})
|
})
|
||||||
|
|
||||||
var proxyURL string
|
var proxyURL string
|
||||||
@ -198,7 +218,7 @@ func TestProxyFromEnvironment(t *testing.T) {
|
|||||||
proxyURL = proxyServer.URL
|
proxyURL = proxyServer.URL
|
||||||
|
|
||||||
case proxyHTTPS:
|
case proxyHTTPS:
|
||||||
proxyServer := httptest.NewServer(proxyHandler)
|
proxyServer := httptest.NewTLSServer(proxyHandler)
|
||||||
t.Cleanup(proxyServer.Close)
|
t.Cleanup(proxyServer.Close)
|
||||||
|
|
||||||
proxyURL = proxyServer.URL
|
proxyURL = proxyServer.URL
|
||||||
@ -209,11 +229,8 @@ func TestProxyFromEnvironment(t *testing.T) {
|
|||||||
if proxyCert != nil {
|
if proxyCert != nil {
|
||||||
certPool.AddCert(proxyCert)
|
certPool.AddCert(proxyCert)
|
||||||
}
|
}
|
||||||
if backendCert != nil {
|
if backendServer.Certificate() != nil {
|
||||||
cert, err := x509.ParseCertificate(backendCert.Certificate[0])
|
certPool.AddCert(backendServer.Certificate())
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
certPool.AddCert(cert)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
builder := NewProxyBuilder(&transportManagerMock{tlsConfig: &tls.Config{RootCAs: certPool}}, static.FastProxyConfig{})
|
builder := NewProxyBuilder(&transportManagerMock{tlsConfig: &tls.Config{RootCAs: certPool}}, static.FastProxyConfig{})
|
||||||
@ -230,7 +247,7 @@ func TestProxyFromEnvironment(t *testing.T) {
|
|||||||
return u, nil
|
return u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
reverseProxy, err := builder.Build("foo", testhelpers.MustParseURL(backendURL), false, false)
|
reverseProxy, err := builder.Build("foo", testhelpers.MustParseURL(backendServer.URL), false, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
reverseProxyServer := httptest.NewServer(reverseProxy)
|
reverseProxyServer := httptest.NewServer(reverseProxy)
|
||||||
@ -246,7 +263,11 @@ func TestProxyFromEnvironment(t *testing.T) {
|
|||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
if test.tls {
|
||||||
|
assert.Equal(t, "backendTLS", string(body))
|
||||||
|
} else {
|
||||||
assert.Equal(t, "backend", string(body))
|
assert.Equal(t, "backend", string(body))
|
||||||
|
}
|
||||||
assert.True(t, proxyCalled)
|
assert.True(t, proxyCalled)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -385,52 +406,6 @@ func TestTransferEncodingChunked(t *testing.T) {
|
|||||||
assert.Equal(t, "chunk 0\nchunk 1\nchunk 2\n", string(body))
|
assert.Equal(t, "chunk 0\nchunk 1\nchunk 2\n", string(body))
|
||||||
}
|
}
|
||||||
|
|
||||||
func newCertificate(t *testing.T, domain string) *tls.Certificate {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
certPEM, keyPEM, err := generate.KeyPair(domain, time.Time{})
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
certificate, err := tls.X509KeyPair(certPEM, keyPEM)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
return &certificate
|
|
||||||
}
|
|
||||||
|
|
||||||
func newBackendServer(t *testing.T, isTLS bool, handler http.Handler) (string, *tls.Certificate) {
|
|
||||||
t.Helper()
|
|
||||||
|
|
||||||
var ln net.Listener
|
|
||||||
var err error
|
|
||||||
var cert *tls.Certificate
|
|
||||||
|
|
||||||
scheme := "http"
|
|
||||||
domain := "backend.localhost"
|
|
||||||
if isTLS {
|
|
||||||
scheme = "https"
|
|
||||||
|
|
||||||
cert = newCertificate(t, domain)
|
|
||||||
|
|
||||||
ln, err = tls.Listen("tcp", ":0", &tls.Config{Certificates: []tls.Certificate{*cert}})
|
|
||||||
require.NoError(t, err)
|
|
||||||
} else {
|
|
||||||
ln, err = net.Listen("tcp", ":0")
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
srv := &http.Server{Handler: handler}
|
|
||||||
go func() { _ = srv.Serve(ln) }()
|
|
||||||
|
|
||||||
t.Cleanup(func() { _ = srv.Close() })
|
|
||||||
|
|
||||||
_, port, err := net.SplitHostPort(ln.Addr().String())
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
backendURL := fmt.Sprintf("%s://%s:%s", scheme, domain, port)
|
|
||||||
|
|
||||||
return backendURL, cert
|
|
||||||
}
|
|
||||||
|
|
||||||
type transportManagerMock struct {
|
type transportManagerMock struct {
|
||||||
tlsConfig *tls.Config
|
tlsConfig *tls.Config
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user