@@ -1359,7 +1359,7 @@ func headerListSize(h http.Header) (size uint32) {
1359
1359
// space for an empty "Pad-Headers" key, then adds as many copies of
1360
1360
// filler as possible. Any remaining bytes necessary to push the
1361
1361
// header list size up to limit are added to h["Pad-Headers"].
1362
- func padHeaders (t * testing.T , h http.Header , limit uint64 , filler string ) {
1362
+ func padHeaders (t testing.TB , h http.Header , limit uint64 , filler string ) {
1363
1363
if limit > 0xffffffff {
1364
1364
t .Fatalf ("padHeaders: refusing to pad to more than 2^32-1 bytes. limit = %v" , limit )
1365
1365
}
@@ -1452,61 +1452,35 @@ func TestPadHeaders(t *testing.T) {
1452
1452
}
1453
1453
1454
1454
func TestTransportChecksRequestHeaderListSize (t * testing.T ) {
1455
- ts := newTestServer (t ,
1456
- func (w http.ResponseWriter , r * http.Request ) {
1457
- // Consume body & force client to send
1458
- // trailers before writing response.
1459
- // io.ReadAll returns non-nil err for
1460
- // requests that attempt to send greater than
1461
- // maxHeaderListSize bytes of trailers, since
1462
- // those requests generate a stream reset.
1463
- io .ReadAll (r .Body )
1464
- r .Body .Close ()
1465
- },
1466
- func (ts * httptest.Server ) {
1467
- ts .Config .MaxHeaderBytes = 16 << 10
1468
- },
1469
- optQuiet ,
1470
- )
1455
+ synctestTest (t , testTransportChecksRequestHeaderListSize )
1456
+ }
1457
+ func testTransportChecksRequestHeaderListSize (t testing.TB ) {
1458
+ const peerSize = 16 << 10
1471
1459
1472
- tr := & Transport { TLSClientConfig : tlsConfigInsecure }
1473
- defer tr . CloseIdleConnections ( )
1460
+ tc := newTestClientConn ( t )
1461
+ tc . greet ( Setting { SettingMaxHeaderListSize , peerSize } )
1474
1462
1475
1463
checkRoundTrip := func (req * http.Request , wantErr error , desc string ) {
1476
- // Make an arbitrary request to ensure we get the server's
1477
- // settings frame and initialize peerMaxHeaderListSize.
1478
- req0 , err := http .NewRequest ("GET" , ts .URL , nil )
1479
- if err != nil {
1480
- t .Fatalf ("newRequest: NewRequest: %v" , err )
1481
- }
1482
- res0 , err := tr .RoundTrip (req0 )
1483
- if err != nil {
1484
- t .Errorf ("%v: Initial RoundTrip err = %v" , desc , err )
1485
- }
1486
- res0 .Body .Close ()
1487
-
1488
- res , err := tr .RoundTrip (req )
1489
- if ! errors .Is (err , wantErr ) {
1490
- if res != nil {
1491
- res .Body .Close ()
1492
- }
1493
- t .Errorf ("%v: RoundTrip err = %v; want %v" , desc , err , wantErr )
1494
- return
1495
- }
1496
- if err == nil {
1497
- if res == nil {
1498
- t .Errorf ("%v: response nil; want non-nil." , desc )
1499
- return
1500
- }
1501
- defer res .Body .Close ()
1502
- if res .StatusCode != http .StatusOK {
1503
- t .Errorf ("%v: response status = %v; want %v" , desc , res .StatusCode , http .StatusOK )
1464
+ t .Helper ()
1465
+ rt := tc .roundTrip (req )
1466
+ if wantErr != nil {
1467
+ if err := rt .err (); ! errors .Is (err , wantErr ) {
1468
+ t .Errorf ("%v: RoundTrip err = %v; want %v" , desc , err , wantErr )
1504
1469
}
1505
1470
return
1506
1471
}
1507
- if res != nil {
1508
- t .Errorf ("%v: RoundTrip err = %v but response non-nil" , desc , err )
1509
- }
1472
+
1473
+ tc .wantFrameType (FrameHeaders )
1474
+ tc .writeHeaders (HeadersFrameParam {
1475
+ StreamID : rt .streamID (),
1476
+ EndHeaders : true ,
1477
+ EndStream : true ,
1478
+ BlockFragment : tc .makeHeaderBlockFragment (
1479
+ ":status" , "200" ,
1480
+ ),
1481
+ })
1482
+
1483
+ rt .wantStatus (http .StatusOK )
1510
1484
}
1511
1485
headerListSizeForRequest := func (req * http.Request ) (size uint64 ) {
1512
1486
const addGzipHeader = true
@@ -1526,56 +1500,15 @@ func TestTransportChecksRequestHeaderListSize(t *testing.T) {
1526
1500
newRequest := func () * http.Request {
1527
1501
// Body must be non-nil to enable writing trailers.
1528
1502
body := strings .NewReader ("hello" )
1529
- req , err := http .NewRequest ("POST" , ts . URL , body )
1503
+ req , err := http .NewRequest ("POST" , "https://example.tld/" , body )
1530
1504
if err != nil {
1531
1505
t .Fatalf ("newRequest: NewRequest: %v" , err )
1532
1506
}
1533
1507
return req
1534
1508
}
1535
1509
1536
- var (
1537
- scMu sync.Mutex
1538
- sc * serverConn
1539
- )
1540
- testHookGetServerConn = func (v * serverConn ) {
1541
- scMu .Lock ()
1542
- defer scMu .Unlock ()
1543
- if sc != nil {
1544
- panic ("testHookGetServerConn called multiple times" )
1545
- }
1546
- sc = v
1547
- }
1548
- defer func () {
1549
- testHookGetServerConn = nil
1550
- }()
1551
-
1552
- // Validate peerMaxHeaderListSize.
1553
- req := newRequest ()
1554
- checkRoundTrip (req , nil , "Initial request" )
1555
- addr := authorityAddr (req .URL .Scheme , req .URL .Host )
1556
- cc , err := tr .connPool ().GetClientConn (req , addr )
1557
- if err != nil {
1558
- t .Fatalf ("GetClientConn: %v" , err )
1559
- }
1560
- cc .mu .Lock ()
1561
- peerSize := cc .peerMaxHeaderListSize
1562
- cc .mu .Unlock ()
1563
- scMu .Lock ()
1564
- wantSize := uint64 (sc .maxHeaderListSize ())
1565
- scMu .Unlock ()
1566
- if peerSize != wantSize {
1567
- t .Errorf ("peerMaxHeaderListSize = %v; want %v" , peerSize , wantSize )
1568
- }
1569
-
1570
- // Sanity check peerSize. (*serverConn) maxHeaderListSize adds
1571
- // 320 bytes of padding.
1572
- wantHeaderBytes := uint64 (ts .Config .MaxHeaderBytes ) + 320
1573
- if peerSize != wantHeaderBytes {
1574
- t .Errorf ("peerMaxHeaderListSize = %v; want %v." , peerSize , wantHeaderBytes )
1575
- }
1576
-
1577
1510
// Pad headers & trailers, but stay under peerSize.
1578
- req = newRequest ()
1511
+ req : = newRequest ()
1579
1512
req .Header = make (http.Header )
1580
1513
req .Trailer = make (http.Header )
1581
1514
filler := strings .Repeat ("*" , 1024 )
0 commit comments