diff --git a/daemon/logger/splunk/splunk.go b/daemon/logger/splunk/splunk.go index d1c690481a..8756ffa3b2 100644 --- a/daemon/logger/splunk/splunk.go +++ b/daemon/logger/splunk/splunk.go @@ -218,6 +218,7 @@ func New(info logger.Info) (logger.Logger, error) { transport := &http.Transport{ TLSClientConfig: tlsConfig, + Proxy: http.ProxyFromEnvironment, } client := &http.Client{ Transport: transport, diff --git a/daemon/logger/splunk/splunk_test.go b/daemon/logger/splunk/splunk_test.go index 796049c69c..9744cb561a 100644 --- a/daemon/logger/splunk/splunk_test.go +++ b/daemon/logger/splunk/splunk_test.go @@ -4,12 +4,14 @@ import ( "compress/gzip" "context" "fmt" + "net/http" "os" "runtime" "testing" "time" "github.com/docker/docker/daemon/logger" + "github.com/gotestyourself/gotestyourself/env" "github.com/stretchr/testify/require" ) @@ -82,6 +84,36 @@ func TestNewMissedToken(t *testing.T) { } } +func TestNewWithProxy(t *testing.T) { + proxy := "http://proxy.testing:8888" + reset := env.Patch(t, "HTTP_PROXY", proxy) + defer reset() + + // must not be localhost + splunkURL := "http://example.com:12345" + logger, err := New(logger.Info{ + Config: map[string]string{ + splunkURLKey: splunkURL, + splunkTokenKey: "token", + splunkVerifyConnectionKey: "false", + }, + ContainerID: "containeriid", + }) + require.NoError(t, err) + splunkLogger := logger.(*splunkLoggerInline) + + proxyFunc := splunkLogger.transport.Proxy + require.NotNil(t, proxyFunc) + + req, err := http.NewRequest("GET", splunkURL, nil) + require.NoError(t, err) + + proxyURL, err := proxyFunc(req) + require.NoError(t, err) + require.NotNil(t, proxyURL) + require.Equal(t, proxy, proxyURL.String()) +} + // Test default settings func TestDefault(t *testing.T) { hec := NewHTTPEventCollectorMock(t) diff --git a/vendor/github.com/gotestyourself/gotestyourself/env/env.go b/vendor/github.com/gotestyourself/gotestyourself/env/env.go new file mode 100644 index 0000000000..95a53bee9c --- /dev/null +++ b/vendor/github.com/gotestyourself/gotestyourself/env/env.go @@ -0,0 +1,92 @@ +/*Package env provides functions to test code that read environment variables +or the current working directory. +*/ +package env + +import ( + "os" + "strings" + + "github.com/gotestyourself/gotestyourself/assert" +) + +type helperT interface { + Helper() +} + +// Patch changes the value of an environment variable, and returns a +// function which will reset the the value of that variable back to the +// previous state. +func Patch(t assert.TestingT, key, value string) func() { + if ht, ok := t.(helperT); ok { + ht.Helper() + } + oldValue, ok := os.LookupEnv(key) + assert.NilError(t, os.Setenv(key, value)) + return func() { + if ht, ok := t.(helperT); ok { + ht.Helper() + } + if !ok { + assert.NilError(t, os.Unsetenv(key)) + return + } + assert.NilError(t, os.Setenv(key, oldValue)) + } +} + +// PatchAll sets the environment to env, and returns a function which will +// reset the environment back to the previous state. +func PatchAll(t assert.TestingT, env map[string]string) func() { + if ht, ok := t.(helperT); ok { + ht.Helper() + } + oldEnv := os.Environ() + os.Clearenv() + + for key, value := range env { + assert.NilError(t, os.Setenv(key, value)) + } + return func() { + if ht, ok := t.(helperT); ok { + ht.Helper() + } + os.Clearenv() + for key, oldVal := range ToMap(oldEnv) { + assert.NilError(t, os.Setenv(key, oldVal)) + } + } +} + +// ToMap takes a list of strings in the format returned by os.Environ() and +// returns a mapping of keys to values. +func ToMap(env []string) map[string]string { + result := map[string]string{} + for _, raw := range env { + parts := strings.SplitN(raw, "=", 2) + switch len(parts) { + case 1: + result[raw] = "" + case 2: + result[parts[0]] = parts[1] + } + } + return result +} + +// ChangeWorkingDir to the directory, and return a function which restores the +// previous working directory. +func ChangeWorkingDir(t assert.TestingT, dir string) func() { + if ht, ok := t.(helperT); ok { + ht.Helper() + } + cwd, err := os.Getwd() + assert.NilError(t, err) + assert.NilError(t, os.Chdir(dir)) + return func() { + if ht, ok := t.(helperT); ok { + ht.Helper() + } + assert.NilError(t, os.Chdir(cwd)) + } +}