diff --git a/pkg/apiserver/proxy.go b/pkg/apiserver/proxy.go index edaed7423b9..b765de7de70 100644 --- a/pkg/apiserver/proxy.go +++ b/pkg/apiserver/proxy.go @@ -174,7 +174,9 @@ func (t *proxyTransport) RoundTrip(req *http.Request) (*http.Response, error) { return resp, nil } - if resp.Header.Get("Content-Type") != "text/html" { + cType := resp.Header.Get("Content-Type") + cType = strings.TrimSpace(strings.SplitN(cType, ";", 2)[0]) + if cType != "text/html" { // Do nothing, simply pass through return resp, nil } diff --git a/pkg/apiserver/proxy_test.go b/pkg/apiserver/proxy_test.go index fdc9954af95..4b2ce125b37 100644 --- a/pkg/apiserver/proxy_test.go +++ b/pkg/apiserver/proxy_test.go @@ -52,7 +52,7 @@ func fmtHTML(in string) string { return string(out.Bytes()) } -func TestProxyTransport_fixLinks(t *testing.T) { +func TestProxyTransport(t *testing.T) { testTransport := &proxyTransport{ proxyScheme: "http", proxyHost: "foo.com", @@ -65,40 +65,60 @@ func TestProxyTransport_fixLinks(t *testing.T) { } table := map[string]struct { - input string - sourceURL string - transport *proxyTransport - output string + input string + sourceURL string + transport *proxyTransport + output string + contentType string }{ "normal": { - input: `
kubelet.loggoogle.log`, - sourceURL: "http://myminion.com/logs/log.log", - transport: testTransport, - output: `
kubelet.loggoogle.log`, + input: `
kubelet.loggoogle.log`, + sourceURL: "http://myminion.com/logs/log.log", + transport: testTransport, + output: `
kubelet.loggoogle.log`, + contentType: "text/html", + }, + "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", + }, + "content-type passthrough": { + input: `
kubelet.loggoogle.log`, + sourceURL: "http://myminion.com/logs/log.log", + transport: testTransport, + output: `
kubelet.loggoogle.log`, + contentType: "text/plain", }, "subdir": { - input: `kubelet.loggoogle.log`, - sourceURL: "http://myminion.com/whatever/apt/somelog.log", - transport: testTransport2, - output: `kubelet.loggoogle.log`, + input: `kubelet.loggoogle.log`, + sourceURL: "http://myminion.com/whatever/apt/somelog.log", + transport: testTransport2, + output: `kubelet.loggoogle.log`, + contentType: "text/html", }, "image": { - input: `
`, - sourceURL: "http://myminion.com/", - transport: testTransport, - output: `
`, + input: `
`, + sourceURL: "http://myminion.com/", + transport: testTransport, + output: `
`, + contentType: "text/html", }, "abs": { - input: ``, - sourceURL: "http://myminion.com/any/path/", - transport: testTransport, - output: ``, + input: ``, + sourceURL: "http://myminion.com/any/path/", + transport: testTransport, + output: ``, + contentType: "text/html", }, "abs but same host": { - input: ``, - sourceURL: "http://myminion.com/any/path/", - transport: testTransport, - output: ``, + input: ``, + sourceURL: "http://myminion.com/any/path/", + transport: testTransport, + output: ``, + contentType: "text/html", }, } @@ -106,22 +126,28 @@ func TestProxyTransport_fixLinks(t *testing.T) { // Canonicalize the html so we can diff. item.input = fmtHTML(item.input) item.output = fmtHTML(item.output) - req := &http.Request{ - Method: "GET", - URL: parseURLOrDie(item.sourceURL), - } - resp := &http.Response{ - Status: "200 OK", - StatusCode: http.StatusOK, - Body: ioutil.NopCloser(strings.NewReader(item.input)), - Close: true, - } - updatedResp, err := item.transport.fixLinks(req, resp) + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", item.contentType) + fmt.Fprint(w, item.input) + })) + // Replace source URL with our test server address. + sourceURL := parseURLOrDie(item.sourceURL) + serverURL := parseURLOrDie(server.URL) + item.input = strings.Replace(item.input, sourceURL.Host, serverURL.Host, -1) + sourceURL.Host = serverURL.Host + + req, err := http.NewRequest("GET", sourceURL.String(), nil) if err != nil { t.Errorf("%v: Unexpected error: %v", name, err) continue } - body, err := ioutil.ReadAll(updatedResp.Body) + resp, err := item.transport.RoundTrip(req) + if err != nil { + t.Errorf("%v: Unexpected error: %v", name, err) + continue + } + body, err := ioutil.ReadAll(resp.Body) if err != nil { t.Errorf("%v: Unexpected error: %v", name, err) continue @@ -129,6 +155,7 @@ func TestProxyTransport_fixLinks(t *testing.T) { if e, a := item.output, string(body); e != a { t.Errorf("%v: expected %v, but got %v", name, e, a) } + server.Close() } }