1 package ldhttp
2
3 import (
4 "crypto/x509"
5 "net/http"
6 "net/http/httptest"
7 "net/url"
8 "os"
9 "reflect"
10 "testing"
11
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14
15 helpers "github.com/launchdarkly/go-test-helpers/v3"
16 "github.com/launchdarkly/go-test-helpers/v3/httphelpers"
17 )
18
19
20
21 func TestDefaultTransportDoesNotAcceptSelfSignedCert(t *testing.T) {
22 alwaysOK := httphelpers.HandlerWithStatus(200)
23 httphelpers.WithSelfSignedServer(alwaysOK, func(server *httptest.Server, certData []byte, certs *x509.CertPool) {
24 transport, _, err := NewHTTPTransport()
25 require.NoError(t, err)
26
27 client := *http.DefaultClient
28 client.Transport = transport
29 _, err = client.Get(server.URL)
30 require.NotNil(t, err)
31 require.Contains(t, err.Error(), "certificate")
32 })
33 }
34
35 func TestCanAcceptSelfSignedCertWithCA(t *testing.T) {
36 alwaysOK := httphelpers.HandlerWithStatus(200)
37 httphelpers.WithSelfSignedServer(alwaysOK, func(server *httptest.Server, certData []byte, certs *x509.CertPool) {
38 transport, _, err := NewHTTPTransport(CACertOption(certData))
39 require.NoError(t, err)
40
41 client := *http.DefaultClient
42 client.Transport = transport
43 resp, err := client.Get(server.URL)
44 require.NoError(t, err)
45 assert.Equal(t, 200, resp.StatusCode)
46 })
47 }
48
49 func TestErrorForNonexistentCertFile(t *testing.T) {
50 helpers.WithTempFile(func(certFile string) {
51 os.Remove(certFile)
52 _, _, err := NewHTTPTransport(CACertFileOption(certFile))
53 require.Error(t, err)
54 require.Contains(t, err.Error(), "can't read CA certificate file")
55 })
56 }
57
58 func TestErrorForCertFileWithBadData(t *testing.T) {
59 helpers.WithTempFile(func(certFile string) {
60 os.WriteFile(certFile, []byte("sorry"), os.ModeAppend)
61 _, _, err := NewHTTPTransport(CACertFileOption(certFile))
62 require.Error(t, err)
63 require.Contains(t, err.Error(), "invalid CA certificate data")
64 })
65 }
66
67 func TestErrorForBadCertData(t *testing.T) {
68 _, _, err := NewHTTPTransport(CACertOption([]byte("sorry")))
69 require.Error(t, err)
70 require.Contains(t, err.Error(), "invalid CA certificate data")
71 }
72
73 func TestProxyEnvVarsAreUsedByDefault(t *testing.T) {
74 transport, _, err := NewHTTPTransport()
75 require.NoError(t, err)
76 require.NotNil(t, transport.Proxy)
77 assert.Equal(t, reflect.ValueOf(http.ProxyFromEnvironment).Pointer(), reflect.ValueOf(transport.Proxy).Pointer())
78 }
79
80 func TestCanSetProxyURL(t *testing.T) {
81 url, err := url.Parse("https://fake-proxy")
82 require.NoError(t, err)
83 transport, _, err := NewHTTPTransport(ProxyOption(*url))
84 require.NoError(t, err)
85 require.NotNil(t, transport.Proxy)
86 urlOut, err := transport.Proxy(&http.Request{})
87 require.NoError(t, err)
88 assert.Equal(t, url, urlOut)
89 }
90
View as plain text