From 8c900187b692cc4069c8065fb8a06126c4f7686d Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Mon, 19 Jan 2015 13:15:41 -0800 Subject: [PATCH] Add reverse proxy headers in apiserver proxy. Fixes #3484 --- pkg/apiserver/proxy.go | 5 ++ pkg/apiserver/proxy_test.go | 106 +++++++++++++++++++++--------------- 2 files changed, 68 insertions(+), 43 deletions(-) diff --git a/pkg/apiserver/proxy.go b/pkg/apiserver/proxy.go index a64eabd0faf..360ef417152 100644 --- a/pkg/apiserver/proxy.go +++ b/pkg/apiserver/proxy.go @@ -169,6 +169,11 @@ type proxyTransport struct { } func (t *proxyTransport) RoundTrip(req *http.Request) (*http.Response, error) { + // Add reverse proxy headers. + req.Header.Set("X-Forwarded-Uri", t.proxyPathPrepend+req.URL.Path) + req.Header.Set("X-Forwarded-Host", t.proxyHost) + req.Header.Set("X-Forwarded-Proto", t.proxyScheme) + resp, err := http.DefaultTransport.RoundTrip(req) if err != nil { diff --git a/pkg/apiserver/proxy_test.go b/pkg/apiserver/proxy_test.go index 7765ab2c83c..99f3ce66f8d 100644 --- a/pkg/apiserver/proxy_test.go +++ b/pkg/apiserver/proxy_test.go @@ -56,69 +56,77 @@ func TestProxyTransport(t *testing.T) { testTransport := &proxyTransport{ proxyScheme: "http", proxyHost: "foo.com", - proxyPathPrepend: "/proxy/minion/minion1:10250/", + proxyPathPrepend: "/proxy/minion/minion1:10250", } testTransport2 := &proxyTransport{ proxyScheme: "https", proxyHost: "foo.com", - proxyPathPrepend: "/proxy/minion/minion1:8080/", + proxyPathPrepend: "/proxy/minion/minion1:8080", } table := map[string]struct { - input string - sourceURL string - transport *proxyTransport - output string - contentType string + input string + sourceURL string + transport *proxyTransport + output string + contentType string + forwardedURI string }{ "normal": { - input: `
kubelet.loggoogle.log
`, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
kubelet.loggoogle.log
`, - contentType: "text/html", + input: `
kubelet.loggoogle.log
`, + sourceURL: "http://myminion.com/logs/log.log", + transport: testTransport, + output: `
kubelet.loggoogle.log
`, + contentType: "text/html", + forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", }, "content-type charset": { - input: `
kubelet.loggoogle.log
`, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
kubelet.loggoogle.log
`, - contentType: "text/html; charset=utf-8", + input: `
kubelet.loggoogle.log
`, + sourceURL: "http://myminion.com/logs/log.log", + transport: testTransport, + output: `
kubelet.loggoogle.log
`, + contentType: "text/html; charset=utf-8", + forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", }, "content-type passthrough": { - input: `
kubelet.loggoogle.log
`, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
kubelet.loggoogle.log
`, - contentType: "text/plain", + input: `
kubelet.loggoogle.log
`, + sourceURL: "http://myminion.com/logs/log.log", + transport: testTransport, + output: `
kubelet.loggoogle.log
`, + contentType: "text/plain", + forwardedURI: "/proxy/minion/minion1:10250/logs/log.log", }, "subdir": { - input: `kubelet.loggoogle.log`, - sourceURL: "http://myminion.com/whatever/apt/somelog.log", - transport: testTransport2, - output: `kubelet.loggoogle.log`, - contentType: "text/html", + input: `kubelet.loggoogle.log`, + sourceURL: "http://myminion.com/whatever/apt/somelog.log", + transport: testTransport2, + output: `kubelet.loggoogle.log`, + contentType: "text/html", + forwardedURI: "/proxy/minion/minion1:8080/whatever/apt/somelog.log", }, "image": { - input: `
`, - sourceURL: "http://myminion.com/", - transport: testTransport, - output: `
`, - contentType: "text/html", + input: `
`, + sourceURL: "http://myminion.com/", + transport: testTransport, + output: `
`, + contentType: "text/html", + forwardedURI: "/proxy/minion/minion1:10250/", }, "abs": { - input: `