|
|
@@ -811,7 +811,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
|
|
|
|
|
|
cc.wmu.Lock()
|
|
|
endStream := !hasBody && !hasTrailers
|
|
|
- werr := cc.writeHeaders(cs.ID, endStream, hdrs)
|
|
|
+ werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs)
|
|
|
cc.wmu.Unlock()
|
|
|
traceWroteHeaders(cs.trace)
|
|
|
cc.mu.Unlock()
|
|
|
@@ -964,13 +964,12 @@ func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error {
|
|
|
}
|
|
|
|
|
|
// requires cc.wmu be held
|
|
|
-func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error {
|
|
|
+func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, maxFrameSize int, hdrs []byte) error {
|
|
|
first := true // first frame written (HEADERS is first, then CONTINUATION)
|
|
|
- frameSize := int(cc.maxFrameSize)
|
|
|
for len(hdrs) > 0 && cc.werr == nil {
|
|
|
chunk := hdrs
|
|
|
- if len(chunk) > frameSize {
|
|
|
- chunk = chunk[:frameSize]
|
|
|
+ if len(chunk) > maxFrameSize {
|
|
|
+ chunk = chunk[:maxFrameSize]
|
|
|
}
|
|
|
hdrs = hdrs[len(chunk):]
|
|
|
endHeaders := len(hdrs) == 0
|
|
|
@@ -1087,13 +1086,17 @@ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ cc.mu.Lock()
|
|
|
+ maxFrameSize := int(cc.maxFrameSize)
|
|
|
+ cc.mu.Unlock()
|
|
|
+
|
|
|
cc.wmu.Lock()
|
|
|
defer cc.wmu.Unlock()
|
|
|
|
|
|
// Two ways to send END_STREAM: either with trailers, or
|
|
|
// with an empty DATA frame.
|
|
|
if len(trls) > 0 {
|
|
|
- err = cc.writeHeaders(cs.ID, true, trls)
|
|
|
+ err = cc.writeHeaders(cs.ID, true, maxFrameSize, trls)
|
|
|
} else {
|
|
|
err = cc.fr.WriteData(cs.ID, true, nil)
|
|
|
}
|