@@ -62,7 +62,7 @@ type ClientConn struct {
6262
6363 // maxResponseHeaderBytes specifies a limit on how many response bytes are
6464 // allowed in the server's response header.
65- maxResponseHeaderBytes uint64
65+ maxResponseHeaderBytes int
6666
6767 // disableCompression, if true, prevents the Transport from requesting compression with an
6868 // "Accept-Encoding: gzip" request header when the Request contains no existing Accept-Encoding value.
@@ -86,7 +86,7 @@ func newClientConn(
8686 additionalSettings map [uint64 ]uint64 ,
8787 streamHijacker func (FrameType , quic.ConnectionTracingID , * quic.Stream , error ) (hijacked bool , err error ),
8888 uniStreamHijacker func (StreamType , quic.ConnectionTracingID , * quic.ReceiveStream , error ) (hijacked bool ),
89- maxResponseHeaderBytes int64 ,
89+ maxResponseHeaderBytes int ,
9090 disableCompression bool ,
9191 logger * slog.Logger ,
9292) * ClientConn {
@@ -100,9 +100,9 @@ func newClientConn(
100100 if maxResponseHeaderBytes <= 0 {
101101 c .maxResponseHeaderBytes = defaultMaxResponseHeaderBytes
102102 } else {
103- c .maxResponseHeaderBytes = uint64 ( maxResponseHeaderBytes )
103+ c .maxResponseHeaderBytes = maxResponseHeaderBytes
104104 }
105- c .decoder = qpack .NewDecoder (func ( hf qpack. HeaderField ) {} )
105+ c .decoder = qpack .NewDecoder ()
106106 c .requestWriter = newRequestWriter ()
107107 c .conn = newConnection (
108108 conn .Context (),
@@ -143,10 +143,15 @@ func (c *ClientConn) setupConn() error {
143143 b := make ([]byte , 0 , 64 )
144144 b = quicvarint .Append (b , streamTypeControlStream )
145145 // send the SETTINGS frame
146- b = (& settingsFrame {Datagram : c .enableDatagrams , Other : c .additionalSettings }).Append (b )
146+ b = (& settingsFrame {
147+ Datagram : c .enableDatagrams ,
148+ Other : c .additionalSettings ,
149+ MaxFieldSectionSize : int64 (c .maxResponseHeaderBytes ),
150+ }).Append (b )
147151 if c .conn .qlogger != nil {
148152 sf := qlog.SettingsFrame {
149- Other : maps .Clone (c .additionalSettings ),
153+ MaxFieldSectionSize : int64 (c .maxResponseHeaderBytes ),
154+ Other : maps .Clone (c .additionalSettings ),
150155 }
151156 if c .enableDatagrams {
152157 sf .Datagram = pointer (true )
@@ -356,32 +361,38 @@ func (c *ClientConn) sendRequestBody(str *RequestStream, body io.ReadCloser, con
356361
357362func (c * ClientConn ) doRequest (req * http.Request , str * RequestStream ) (* http.Response , error ) {
358363 trace := httptrace .ContextClientTrace (req .Context ())
364+ var sendingReqFailed bool
359365 if err := str .sendRequestHeader (req ); err != nil {
360366 traceWroteRequest (trace , err )
361- return nil , err
367+ if c .logger != nil {
368+ c .logger .Debug ("error writing request" , "error" , err )
369+ }
370+ sendingReqFailed = true
362371 }
363- if req .Body == nil {
364- traceWroteRequest (trace , nil )
365- str .Close ()
366- } else {
367- // send the request body asynchronously
368- go func () {
369- contentLength := int64 (- 1 )
370- // According to the documentation for http.Request.ContentLength,
371- // a value of 0 with a non-nil Body is also treated as unknown content length.
372- if req .ContentLength > 0 {
373- contentLength = req .ContentLength
374- }
375- dumps := dump .GetDumpers (req .Context (), c .Dump )
376- err := c .sendRequestBody (str , req .Body , contentLength , dumps )
377- traceWroteRequest (trace , err )
378- if err != nil {
379- if c .Debugf != nil {
380- c .Debugf ("error writing request: %s" , err .Error ())
381- }
382- }
372+ if ! sendingReqFailed {
373+ if req .Body == nil {
374+ traceWroteRequest (trace , nil )
383375 str .Close ()
384- }()
376+ } else {
377+ // send the request body asynchronously
378+ go func () {
379+ contentLength := int64 (- 1 )
380+ // According to the documentation for http.Request.ContentLength,
381+ // a value of 0 with a non-nil Body is also treated as unknown content length.
382+ if req .ContentLength > 0 {
383+ contentLength = req .ContentLength
384+ }
385+ dumps := dump .GetDumpers (req .Context (), c .Dump )
386+ err := c .sendRequestBody (str , req .Body , contentLength , dumps )
387+ traceWroteRequest (trace , err )
388+ if err != nil {
389+ if c .logger != nil {
390+ c .logger .Debug ("error writing request" , "error" , err )
391+ }
392+ }
393+ str .Close ()
394+ }()
395+ }
385396 }
386397
387398 // copy from net/http: support 1xx responses
0 commit comments