@@ -18,6 +18,7 @@ package endpoints
18
18
19
19
import (
20
20
"bytes"
21
+ "compress/gzip"
21
22
"encoding/json"
22
23
"errors"
23
24
"fmt"
@@ -66,6 +67,7 @@ import (
66
67
"k8s.io/apiserver/pkg/endpoints/request"
67
68
genericapitesting "k8s.io/apiserver/pkg/endpoints/testing"
68
69
"k8s.io/apiserver/pkg/registry/rest"
70
+ "k8s.io/apiserver/pkg/server/filters"
69
71
)
70
72
71
73
// alwaysAdmit is an implementation of admission.Interface which always says yes to an admit request.
@@ -1207,6 +1209,110 @@ func TestRequestsWithInvalidQuery(t *testing.T) {
1207
1209
}
1208
1210
}
1209
1211
1212
+ func TestListCompression (t * testing.T ) {
1213
+ testCases := []struct {
1214
+ url string
1215
+ namespace string
1216
+ selfLink string
1217
+ legacy bool
1218
+ label string
1219
+ field string
1220
+ acceptEncoding string
1221
+ }{
1222
+ // list items in a namespace in the path
1223
+ {
1224
+ url : "/" + grouplessPrefix + "/" + grouplessGroupVersion .Version + "/namespaces/default/simple" ,
1225
+ namespace : "default" ,
1226
+ selfLink : "/" + grouplessPrefix + "/" + grouplessGroupVersion .Version + "/namespaces/default/simple" ,
1227
+ acceptEncoding : "" ,
1228
+ },
1229
+ {
1230
+ url : "/" + grouplessPrefix + "/" + grouplessGroupVersion .Version + "/namespaces/default/simple" ,
1231
+ namespace : "default" ,
1232
+ selfLink : "/" + grouplessPrefix + "/" + grouplessGroupVersion .Version + "/namespaces/default/simple" ,
1233
+ acceptEncoding : "gzip" ,
1234
+ },
1235
+ }
1236
+ for i , testCase := range testCases {
1237
+ storage := map [string ]rest.Storage {}
1238
+ simpleStorage := SimpleRESTStorage {expectedResourceNamespace : testCase .namespace }
1239
+ storage ["simple" ] = & simpleStorage
1240
+ selfLinker := & setTestSelfLinker {
1241
+ t : t ,
1242
+ namespace : testCase .namespace ,
1243
+ expectedSet : testCase .selfLink ,
1244
+ }
1245
+ var handler = handleInternal (storage , admissionControl , selfLinker , nil )
1246
+
1247
+ requestContextMapper = request .NewRequestContextMapper ()
1248
+
1249
+ handler = filters .WithCompression (handler , requestContextMapper )
1250
+ handler = genericapifilters .WithRequestInfo (handler , newTestRequestInfoResolver (), requestContextMapper )
1251
+ handler = request .WithRequestContext (handler , requestContextMapper )
1252
+
1253
+ server := httptest .NewServer (handler )
1254
+
1255
+ defer server .Close ()
1256
+
1257
+ req , err := http .NewRequest ("GET" , server .URL + testCase .url , nil )
1258
+ if err != nil {
1259
+ t .Errorf ("%d: unexpected error: %v" , i , err )
1260
+ continue
1261
+ }
1262
+ // It's necessary to manually set Accept-Encoding here
1263
+ // to prevent http.DefaultClient from automatically
1264
+ // decoding responses
1265
+ req .Header .Set ("Accept-Encoding" , testCase .acceptEncoding )
1266
+ resp , err := http .DefaultClient .Do (req )
1267
+ if err != nil {
1268
+ t .Errorf ("%d: unexpected error: %v" , i , err )
1269
+ continue
1270
+ }
1271
+ defer resp .Body .Close ()
1272
+ if resp .StatusCode != http .StatusOK {
1273
+ t .Errorf ("%d: unexpected status: %d from url %s, Expected: %d, %#v" , i , resp .StatusCode , testCase .url , http .StatusOK , resp )
1274
+ body , err := ioutil .ReadAll (resp .Body )
1275
+ if err != nil {
1276
+ t .Errorf ("%d: unexpected error: %v" , i , err )
1277
+ continue
1278
+ }
1279
+ t .Logf ("%d: body: %s" , i , string (body ))
1280
+ continue
1281
+ }
1282
+ // TODO: future, restore get links
1283
+ if ! selfLinker .called {
1284
+ t .Errorf ("%d: never set self link" , i )
1285
+ }
1286
+ if ! simpleStorage .namespacePresent {
1287
+ t .Errorf ("%d: namespace not set" , i )
1288
+ } else if simpleStorage .actualNamespace != testCase .namespace {
1289
+ t .Errorf ("%d: %q unexpected resource namespace: %s" , i , testCase .url , simpleStorage .actualNamespace )
1290
+ }
1291
+ if simpleStorage .requestedLabelSelector == nil || simpleStorage .requestedLabelSelector .String () != testCase .label {
1292
+ t .Errorf ("%d: unexpected label selector: %v" , i , simpleStorage .requestedLabelSelector )
1293
+ }
1294
+ if simpleStorage .requestedFieldSelector == nil || simpleStorage .requestedFieldSelector .String () != testCase .field {
1295
+ t .Errorf ("%d: unexpected field selector: %v" , i , simpleStorage .requestedFieldSelector )
1296
+ }
1297
+
1298
+ var decoder * json.Decoder
1299
+ if testCase .acceptEncoding == "gzip" {
1300
+ gzipReader , err := gzip .NewReader (resp .Body )
1301
+ if err != nil {
1302
+ t .Fatalf ("unexpected error creating gzip reader: %v" , err )
1303
+ }
1304
+ decoder = json .NewDecoder (gzipReader )
1305
+ } else {
1306
+ decoder = json .NewDecoder (resp .Body )
1307
+ }
1308
+ var itemOut genericapitesting.SimpleList
1309
+ err = decoder .Decode (& itemOut )
1310
+ if err != nil {
1311
+ t .Errorf ("failed to read response body as SimpleList: %v" , err )
1312
+ }
1313
+ }
1314
+ }
1315
+
1210
1316
func TestLogs (t * testing.T ) {
1211
1317
handler := handle (map [string ]rest.Storage {})
1212
1318
server := httptest .NewServer (handler )
@@ -1522,6 +1628,82 @@ func TestGet(t *testing.T) {
1522
1628
}
1523
1629
}
1524
1630
1631
+ func TestGetCompression (t * testing.T ) {
1632
+ storage := map [string ]rest.Storage {}
1633
+ simpleStorage := SimpleRESTStorage {
1634
+ item : genericapitesting.Simple {
1635
+ Other : "foo" ,
1636
+ },
1637
+ }
1638
+ selfLinker := & setTestSelfLinker {
1639
+ t : t ,
1640
+ expectedSet : "/" + prefix + "/" + testGroupVersion .Group + "/" + testGroupVersion .Version + "/namespaces/default/simple/id" ,
1641
+ name : "id" ,
1642
+ namespace : "default" ,
1643
+ }
1644
+
1645
+ requestContextMapper = request .NewRequestContextMapper ()
1646
+
1647
+ storage ["simple" ] = & simpleStorage
1648
+ handler := handleLinker (storage , selfLinker )
1649
+ handler = filters .WithCompression (handler , requestContextMapper )
1650
+ handler = genericapifilters .WithRequestInfo (handler , newTestRequestInfoResolver (), requestContextMapper )
1651
+ handler = request .WithRequestContext (handler , requestContextMapper )
1652
+ server := httptest .NewServer (handler )
1653
+ defer server .Close ()
1654
+
1655
+ tests := []struct {
1656
+ acceptEncoding string
1657
+ }{
1658
+ {acceptEncoding : "" },
1659
+ {acceptEncoding : "gzip" },
1660
+ }
1661
+
1662
+ for _ , test := range tests {
1663
+ req , err := http .NewRequest ("GET" , server .URL + "/" + prefix + "/" + testGroupVersion .Group + "/" + testGroupVersion .Version + "/namespaces/default/simple/id" , nil )
1664
+ if err != nil {
1665
+ t .Fatalf ("unexpected error cretaing request: %v" , err )
1666
+ }
1667
+ // It's necessary to manually set Accept-Encoding here
1668
+ // to prevent http.DefaultClient from automatically
1669
+ // decoding responses
1670
+ req .Header .Set ("Accept-Encoding" , test .acceptEncoding )
1671
+ resp , err := http .DefaultClient .Do (req )
1672
+ if err != nil {
1673
+ t .Fatalf ("unexpected error: %v" , err )
1674
+ }
1675
+ if resp .StatusCode != http .StatusOK {
1676
+ t .Fatalf ("unexpected response: %#v" , resp )
1677
+ }
1678
+ var decoder * json.Decoder
1679
+ if test .acceptEncoding == "gzip" {
1680
+ gzipReader , err := gzip .NewReader (resp .Body )
1681
+ if err != nil {
1682
+ t .Fatalf ("unexpected error creating gzip reader: %v" , err )
1683
+ }
1684
+ decoder = json .NewDecoder (gzipReader )
1685
+ } else {
1686
+ decoder = json .NewDecoder (resp .Body )
1687
+ }
1688
+ var itemOut genericapitesting.Simple
1689
+ err = decoder .Decode (& itemOut )
1690
+ if err != nil {
1691
+ t .Errorf ("unexpected error: %v" , err )
1692
+ }
1693
+ body , err := ioutil .ReadAll (resp .Body )
1694
+ if err != nil {
1695
+ t .Errorf ("unexpected error reading body: %v" , err )
1696
+ }
1697
+
1698
+ if itemOut .Name != simpleStorage .item .Name {
1699
+ t .Errorf ("Unexpected data: %#v, expected %#v (%s)" , itemOut , simpleStorage .item , string (body ))
1700
+ }
1701
+ if ! selfLinker .called {
1702
+ t .Errorf ("Never set self link" )
1703
+ }
1704
+ }
1705
+ }
1706
+
1525
1707
func TestGetUninitialized (t * testing.T ) {
1526
1708
storage := map [string ]rest.Storage {}
1527
1709
simpleStorage := SimpleRESTStorage {
0 commit comments