@@ -901,6 +901,60 @@ func testRejectRequest(t *testing.T, send func(*serverTester)) {
901
901
st .wantRSTStream (1 , ErrCodeProtocol )
902
902
}
903
903
904
+ func TestServer_Request_Connect (t * testing.T ) {
905
+ testServerRequest (t , func (st * serverTester ) {
906
+ st .writeHeaders (HeadersFrameParam {
907
+ StreamID : 1 ,
908
+ BlockFragment : st .encodeHeaderRaw (
909
+ ":method" , "CONNECT" ,
910
+ ":authority" , "example.com:123" ,
911
+ ),
912
+ EndStream : true ,
913
+ EndHeaders : true ,
914
+ })
915
+ }, func (r * http.Request ) {
916
+ if g , w := r .Method , "CONNECT" ; g != w {
917
+ t .Errorf ("Method = %q; want %q" , g , w )
918
+ }
919
+ if g , w := r .RequestURI , "example.com:123" ; g != w {
920
+ t .Errorf ("RequestURI = %q; want %q" , g , w )
921
+ }
922
+ if g , w := r .URL .Host , "example.com:123" ; g != w {
923
+ t .Errorf ("URL.Host = %q; want %q" , g , w )
924
+ }
925
+ })
926
+ }
927
+
928
+ func TestServer_Request_Connect_InvalidPath (t * testing.T ) {
929
+ testServerRejectsStream (t , ErrCodeProtocol , func (st * serverTester ) {
930
+ st .writeHeaders (HeadersFrameParam {
931
+ StreamID : 1 ,
932
+ BlockFragment : st .encodeHeaderRaw (
933
+ ":method" , "CONNECT" ,
934
+ ":authority" , "example.com:123" ,
935
+ ":path" , "/bogus" ,
936
+ ),
937
+ EndStream : true ,
938
+ EndHeaders : true ,
939
+ })
940
+ })
941
+ }
942
+
943
+ func TestServer_Request_Connect_InvalidScheme (t * testing.T ) {
944
+ testServerRejectsStream (t , ErrCodeProtocol , func (st * serverTester ) {
945
+ st .writeHeaders (HeadersFrameParam {
946
+ StreamID : 1 ,
947
+ BlockFragment : st .encodeHeaderRaw (
948
+ ":method" , "CONNECT" ,
949
+ ":authority" , "example.com:123" ,
950
+ ":scheme" , "https" ,
951
+ ),
952
+ EndStream : true ,
953
+ EndHeaders : true ,
954
+ })
955
+ })
956
+ }
957
+
904
958
func TestServer_Ping (t * testing.T ) {
905
959
st := newServerTester (t , nil )
906
960
defer st .Close ()
@@ -1222,7 +1276,7 @@ func TestServer_StateTransitions(t *testing.T) {
1222
1276
1223
1277
// test HEADERS w/o EndHeaders + another HEADERS (should get rejected)
1224
1278
func TestServer_Rejects_HeadersNoEnd_Then_Headers (t * testing.T ) {
1225
- testServerRejects (t , func (st * serverTester ) {
1279
+ testServerRejectsConn (t , func (st * serverTester ) {
1226
1280
st .writeHeaders (HeadersFrameParam {
1227
1281
StreamID : 1 ,
1228
1282
BlockFragment : st .encodeHeader (),
@@ -1240,7 +1294,7 @@ func TestServer_Rejects_HeadersNoEnd_Then_Headers(t *testing.T) {
1240
1294
1241
1295
// test HEADERS w/o EndHeaders + PING (should get rejected)
1242
1296
func TestServer_Rejects_HeadersNoEnd_Then_Ping (t * testing.T ) {
1243
- testServerRejects (t , func (st * serverTester ) {
1297
+ testServerRejectsConn (t , func (st * serverTester ) {
1244
1298
st .writeHeaders (HeadersFrameParam {
1245
1299
StreamID : 1 ,
1246
1300
BlockFragment : st .encodeHeader (),
@@ -1255,7 +1309,7 @@ func TestServer_Rejects_HeadersNoEnd_Then_Ping(t *testing.T) {
1255
1309
1256
1310
// test HEADERS w/ EndHeaders + a continuation HEADERS (should get rejected)
1257
1311
func TestServer_Rejects_HeadersEnd_Then_Continuation (t * testing.T ) {
1258
- testServerRejects (t , func (st * serverTester ) {
1312
+ testServerRejectsConn (t , func (st * serverTester ) {
1259
1313
st .writeHeaders (HeadersFrameParam {
1260
1314
StreamID : 1 ,
1261
1315
BlockFragment : st .encodeHeader (),
@@ -1271,7 +1325,7 @@ func TestServer_Rejects_HeadersEnd_Then_Continuation(t *testing.T) {
1271
1325
1272
1326
// test HEADERS w/o EndHeaders + a continuation HEADERS on wrong stream ID
1273
1327
func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream (t * testing.T ) {
1274
- testServerRejects (t , func (st * serverTester ) {
1328
+ testServerRejectsConn (t , func (st * serverTester ) {
1275
1329
st .writeHeaders (HeadersFrameParam {
1276
1330
StreamID : 1 ,
1277
1331
BlockFragment : st .encodeHeader (),
@@ -1286,7 +1340,7 @@ func TestServer_Rejects_HeadersNoEnd_Then_ContinuationWrongStream(t *testing.T)
1286
1340
1287
1341
// No HEADERS on stream 0.
1288
1342
func TestServer_Rejects_Headers0 (t * testing.T ) {
1289
- testServerRejects (t , func (st * serverTester ) {
1343
+ testServerRejectsConn (t , func (st * serverTester ) {
1290
1344
st .fr .AllowIllegalWrites = true
1291
1345
st .writeHeaders (HeadersFrameParam {
1292
1346
StreamID : 0 ,
@@ -1299,7 +1353,7 @@ func TestServer_Rejects_Headers0(t *testing.T) {
1299
1353
1300
1354
// No CONTINUATION on stream 0.
1301
1355
func TestServer_Rejects_Continuation0 (t * testing.T ) {
1302
- testServerRejects (t , func (st * serverTester ) {
1356
+ testServerRejectsConn (t , func (st * serverTester ) {
1303
1357
st .fr .AllowIllegalWrites = true
1304
1358
if err := st .fr .WriteContinuation (0 , true , st .encodeHeader ()); err != nil {
1305
1359
t .Fatal (err )
@@ -1308,7 +1362,7 @@ func TestServer_Rejects_Continuation0(t *testing.T) {
1308
1362
}
1309
1363
1310
1364
func TestServer_Rejects_PushPromise (t * testing.T ) {
1311
- testServerRejects (t , func (st * serverTester ) {
1365
+ testServerRejectsConn (t , func (st * serverTester ) {
1312
1366
pp := PushPromiseParam {
1313
1367
StreamID : 1 ,
1314
1368
PromiseID : 3 ,
@@ -1319,10 +1373,10 @@ func TestServer_Rejects_PushPromise(t *testing.T) {
1319
1373
})
1320
1374
}
1321
1375
1322
- // testServerRejects tests that the server hangs up with a GOAWAY
1376
+ // testServerRejectsConn tests that the server hangs up with a GOAWAY
1323
1377
// frame and a server close after the client does something
1324
1378
// deserving a CONNECTION_ERROR.
1325
- func testServerRejects (t * testing.T , writeReq func (* serverTester )) {
1379
+ func testServerRejectsConn (t * testing.T , writeReq func (* serverTester )) {
1326
1380
st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {})
1327
1381
st .addLogFilter ("connection error: PROTOCOL_ERROR" )
1328
1382
defer st .Close ()
@@ -1348,6 +1402,16 @@ func testServerRejects(t *testing.T, writeReq func(*serverTester)) {
1348
1402
}
1349
1403
}
1350
1404
1405
+ // testServerRejectsStream tests that the server sends a RST_STREAM with the provided
1406
+ // error code after a client sends a bogus request.
1407
+ func testServerRejectsStream (t * testing.T , code ErrCode , writeReq func (* serverTester )) {
1408
+ st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {})
1409
+ defer st .Close ()
1410
+ st .greet ()
1411
+ writeReq (st )
1412
+ st .wantRSTStream (1 , code )
1413
+ }
1414
+
1351
1415
// testServerRequest sets up an idle HTTP/2 connection and lets you
1352
1416
// write a single request with writeReq, and then verify that the
1353
1417
// *http.Request is built correctly in checkReq.
0 commit comments