Skip to content

Commit 0d8a4f9

Browse files
committed
Check content-type on response
1 parent 3023678 commit 0d8a4f9

File tree

4 files changed

+44
-13
lines changed

4 files changed

+44
-13
lines changed

cluster-autoscaler/cloudprovider/packet/packet_manager_rest.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ import (
4545
schedulerframework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
4646
)
4747

48-
const userAgent = "kubernetes/cluster-autoscaler/" + version.ClusterAutoscalerVersion
48+
const (
49+
userAgent = "kubernetes/cluster-autoscaler/" + version.ClusterAutoscalerVersion
50+
expectedAPIContentTypePrefix = "application/json"
51+
)
4952

5053
type instanceType struct {
5154
InstanceName string
@@ -368,6 +371,13 @@ func (mgr *packetManagerRest) request(ctx context.Context, method, url string, j
368371
return nil, fmt.Errorf("failed to read response body: %w", err)
369372
}
370373

374+
ct := resp.Header.Get("Content-Type")
375+
if !strings.HasPrefix(ct, expectedAPIContentTypePrefix) {
376+
errorResponse := &ErrorResponse{Response: resp}
377+
errorResponse.SingleError = fmt.Sprintf("Unexpected Content-Type: %s with status: %s", ct, resp.Status)
378+
return nil, errorResponse
379+
}
380+
371381
// If the response is good return early
372382
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
373383
return body, nil

cluster-autoscaler/cloudprovider/packet/packet_manager_rest_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func newTestPacketManagerRest(t *testing.T, url string) *packetManagerRest {
7777
}
7878
func TestListPacketDevices(t *testing.T) {
7979
var m *packetManagerRest
80-
server := NewHttpServerMock()
80+
server := NewHttpServerMockWithContentType()
8181
defer server.Close()
8282
if len(os.Getenv("PACKET_AUTH_TOKEN")) > 0 {
8383
// If auth token set in env, hit the actual Packet API
@@ -87,7 +87,7 @@ func TestListPacketDevices(t *testing.T) {
8787
m = newTestPacketManagerRest(t, server.URL)
8888
t.Logf("server URL: %v", server.URL)
8989
t.Logf("default packetManagerNodePool baseURL: %v", m.packetManagerNodePools["default"].baseURL)
90-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(listPacketDevicesResponse).Times(2)
90+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", listPacketDevicesResponse).Times(2)
9191
}
9292

9393
_, err := m.listPacketDevices(context.TODO())

cluster-autoscaler/cloudprovider/packet/packet_node_group_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const deletePacketDeviceResponsePool3 = ``
3737

3838
func TestIncreaseDecreaseSize(t *testing.T) {
3939
var m *packetManagerRest
40-
server := NewHttpServerMock()
40+
server := NewHttpServerMockWithContentType()
4141
defer server.Close()
4242
assert.Equal(t, true, true)
4343
if len(os.Getenv("PACKET_AUTH_TOKEN")) > 0 {
@@ -46,15 +46,15 @@ func TestIncreaseDecreaseSize(t *testing.T) {
4646
} else {
4747
// Set up a mock Packet API
4848
m = newTestPacketManagerRest(t, server.URL)
49-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(listPacketDevicesResponse).Times(3)
50-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(createPacketDeviceResponsePool3).Times(1)
51-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(listPacketDevicesResponseAfterIncreasePool3).Times(2)
52-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(createPacketDeviceResponsePool2).Times(1)
53-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(listPacketDevicesResponseAfterIncreasePool2).Times(3)
54-
server.On("handle", "/devices/0f5609af-1c27-451b-8edd-a1283f2c9440").Return(deletePacketDeviceResponsePool2).Times(1)
55-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(listPacketDevicesResponseAfterIncreasePool3).Times(3)
56-
server.On("handle", "/devices/8fa90049-e715-4794-ba31-81c1c78cee84").Return(deletePacketDeviceResponsePool3).Times(1)
57-
server.On("handle", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return(listPacketDevicesResponse).Times(3)
49+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", listPacketDevicesResponse).Times(3)
50+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", createPacketDeviceResponsePool3).Times(1)
51+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", listPacketDevicesResponseAfterIncreasePool3).Times(2)
52+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", createPacketDeviceResponsePool2).Times(1)
53+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", listPacketDevicesResponseAfterIncreasePool2).Times(3)
54+
server.On("handleWithContentType", "/devices/0f5609af-1c27-451b-8edd-a1283f2c9440").Return("application/json", deletePacketDeviceResponsePool2).Times(1)
55+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", listPacketDevicesResponseAfterIncreasePool3).Times(3)
56+
server.On("handleWithContentType", "/devices/8fa90049-e715-4794-ba31-81c1c78cee84").Return("application/json", deletePacketDeviceResponsePool3).Times(1)
57+
server.On("handleWithContentType", "/projects/"+m.packetManagerNodePools["default"].projectID+"/devices").Return("application/json", listPacketDevicesResponse).Times(3)
5858
}
5959
clusterUpdateLock := sync.Mutex{}
6060
ngPool2 := &packetNodeGroup{

cluster-autoscaler/utils/test/test_utils.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,3 +258,24 @@ func (l *HttpServerMock) handleWithStatusCode(url string) (int, string) {
258258
args := l.Called(url)
259259
return args.Int(0), args.String(1)
260260
}
261+
262+
// NewHttpServerMockWithContentType creates new HttpServerMock.
263+
func NewHttpServerMockWithContentType() *HttpServerMock {
264+
httpServerMock := &HttpServerMock{}
265+
mux := http.NewServeMux()
266+
mux.HandleFunc("/",
267+
func(w http.ResponseWriter, req *http.Request) {
268+
contentType, result := httpServerMock.handleWithContentType(req.URL.Path)
269+
w.Header().Set("Content-Type", contentType)
270+
_, _ = w.Write([]byte(result))
271+
})
272+
273+
server := httptest.NewServer(mux)
274+
httpServerMock.Server = server
275+
return httpServerMock
276+
}
277+
278+
func (l *HttpServerMock) handleWithContentType(url string) (string, string) {
279+
args := l.Called(url)
280+
return args.String(0), args.String(1)
281+
}

0 commit comments

Comments
 (0)