@@ -1359,7 +1359,7 @@ func headerListSize(h http.Header) (size uint32) {
13591359// space for an empty "Pad-Headers" key, then adds as many copies of
13601360// filler as possible. Any remaining bytes necessary to push the
13611361// 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 ) {
13631363 if limit > 0xffffffff {
13641364 t .Fatalf ("padHeaders: refusing to pad to more than 2^32-1 bytes. limit = %v" , limit )
13651365 }
@@ -1452,61 +1452,35 @@ func TestPadHeaders(t *testing.T) {
14521452}
14531453
14541454func 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
14711459
1472- tr := & Transport { TLSClientConfig : tlsConfigInsecure }
1473- defer tr . CloseIdleConnections ( )
1460+ tc := newTestClientConn ( t )
1461+ tc . greet ( Setting { SettingMaxHeaderListSize , peerSize } )
14741462
14751463 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 )
15041469 }
15051470 return
15061471 }
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 )
15101484 }
15111485 headerListSizeForRequest := func (req * http.Request ) (size uint64 ) {
15121486 const addGzipHeader = true
@@ -1526,56 +1500,15 @@ func TestTransportChecksRequestHeaderListSize(t *testing.T) {
15261500 newRequest := func () * http.Request {
15271501 // Body must be non-nil to enable writing trailers.
15281502 body := strings .NewReader ("hello" )
1529- req , err := http .NewRequest ("POST" , ts . URL , body )
1503+ req , err := http .NewRequest ("POST" , "https://example.tld/" , body )
15301504 if err != nil {
15311505 t .Fatalf ("newRequest: NewRequest: %v" , err )
15321506 }
15331507 return req
15341508 }
15351509
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-
15771510 // Pad headers & trailers, but stay under peerSize.
1578- req = newRequest ()
1511+ req : = newRequest ()
15791512 req .Header = make (http.Header )
15801513 req .Trailer = make (http.Header )
15811514 filler := strings .Repeat ("*" , 1024 )
0 commit comments