Merge pull request #72589 from logicalhan/filter
add a content-type filter to apiserver filters to autoset nosniff Kubernetes-commit: fc86054f880ea3748a23a47637e00d6622a71f55
This commit is contained in:
		
						commit
						aad552f8d1
					
				|  | @ -0,0 +1,28 @@ | |||
| /* | ||||
| Copyright 2019 The Kubernetes Authors. | ||||
| 
 | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
| 
 | ||||
|     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package filters | ||||
| 
 | ||||
| import "net/http" | ||||
| 
 | ||||
| // WithContentType sets both the Content-Type and the X-Content-Type-Options (nosniff) header
 | ||||
| func WithContentType(handler http.Handler, contentType string) http.Handler { | ||||
| 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		w.Header().Set("Content-Type", contentType) | ||||
| 		w.Header().Set("X-Content-Type-Options", "nosniff") | ||||
| 		handler.ServeHTTP(w, r) | ||||
| 	}) | ||||
| } | ||||
|  | @ -0,0 +1,60 @@ | |||
| /* | ||||
| Copyright 2019 The Kubernetes Authors. | ||||
| 
 | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
| 
 | ||||
|     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| package filters | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"testing" | ||||
| ) | ||||
| 
 | ||||
| func noopHandler() http.HandlerFunc { | ||||
| 	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||||
| 		// noop
 | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func TestWithContentType(t *testing.T) { | ||||
| 	mux := http.NewServeMux() | ||||
| 	mux.Handle("/text", WithContentType(noopHandler(), "text/plain")) | ||||
| 	mux.Handle("/json", WithContentType(noopHandler(), "application/json")) | ||||
| 	tests := []struct { | ||||
| 		description      string | ||||
| 		path             string | ||||
| 		expectedMimeType string | ||||
| 	}{ | ||||
| 		{"/text should return a plain text response", "/text", "text/plain"}, | ||||
| 		{"/json should return a json response", "/json", "application/json"}, | ||||
| 	} | ||||
| 	for _, test := range tests { | ||||
| 		path := "http://example.com" + test.path | ||||
| 		t.Run(path, func(t *testing.T) { | ||||
| 			req, err := http.NewRequest("GET", path, nil) | ||||
| 			if err != nil { | ||||
| 				t.Fatalf("unexpected error: %v", err) | ||||
| 			} | ||||
| 			w := httptest.NewRecorder() | ||||
| 			mux.ServeHTTP(w, req) | ||||
| 			if nosniffHeader := w.Header().Get("X-Content-Type-Options"); nosniffHeader != "nosniff" { | ||||
| 				t.Errorf("expected nosniff header to be set, got %v", nosniffHeader) | ||||
| 			} | ||||
| 			if mimeTypeHeader := w.Header().Get("Content-Type"); mimeTypeHeader != test.expectedMimeType { | ||||
| 				t.Errorf("expected %v, got %v", test.expectedMimeType, mimeTypeHeader) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue