]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: update bundled x/net/http2
authorEmmanuel T Odeke <emmanuel@orijtech.com>
Thu, 19 Mar 2020 23:51:13 +0000 (16:51 -0700)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Fri, 20 Mar 2020 00:33:16 +0000 (00:33 +0000)
Updates bundled http2 to x/net git rev 63522dbf7

    http2: reduce allocations of (*clientConnReadLoop).handleReponse
    https://golang.org/cl/223783 (#37853)

    http2: remove unused errors
    https://golang.org/cl/220458

    http2: remove unused stream struct fields
    https://golang.org/cl/219857

    http2: fix typo in comment
    https://golang.org/cl/214602

    http2: workaround TCPConn CloseWrite not being supported on Plan 9
    https://golang.org/cl/209417 (#17906, #35904)

Change-Id: I0e48f32247938c3858170bf419624367d4faef4b
Reviewed-on: https://go-review.googlesource.com/c/go/+/224217
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/net/http/h2_bundle.go

index a5bdb09113dc51186e19fdd182ef6d7da3680898..dd48bec75596a0c4994f62e23d0b8f080705efa6 100644 (file)
@@ -3245,11 +3245,6 @@ func (s http2SettingID) String() string {
        return fmt.Sprintf("UNKNOWN_SETTING_%d", uint16(s))
 }
 
-var (
-       http2errInvalidHeaderFieldName  = errors.New("http2: invalid header field name")
-       http2errInvalidHeaderFieldValue = errors.New("http2: invalid header field value")
-)
-
 // validWireHeaderFieldName reports whether v is a valid header field
 // name (key). See httpguts.ValidHeaderName for the base rules.
 //
@@ -4147,13 +4142,10 @@ type http2stream struct {
        cancelCtx func()
 
        // owned by serverConn's serve loop:
-       bodyBytes        int64        // body bytes seen so far
-       declBodyBytes    int64        // or -1 if undeclared
-       flow             http2flow    // limits writing from Handler to client
-       inflow           http2flow    // what the client is allowed to POST/etc to us
-       parent           *http2stream // or nil
-       numTrailerValues int64
-       weight           uint8
+       bodyBytes        int64     // body bytes seen so far
+       declBodyBytes    int64     // or -1 if undeclared
+       flow             http2flow // limits writing from Handler to client
+       inflow           http2flow // what the client is allowed to POST/etc to us
        state            http2streamState
        resetQueued      bool        // RST_STREAM queued for write; set by sc.resetStream
        gotTrailerHeader bool        // HEADER frame for trailers was seen
@@ -6592,7 +6584,7 @@ type http2Transport struct {
        // send in the initial settings frame. It is how many bytes
        // of response headers are allowed. Unlike the http2 spec, zero here
        // means to use a default limit (currently 10MB). If you actually
-       // want to advertise an ulimited value to the peer, Transport
+       // want to advertise an unlimited value to the peer, Transport
        // interprets the highest possible value here (0xffffffff or 1<<32-1)
        // to mean no limit.
        MaxHeaderListSize uint32
@@ -8392,7 +8384,9 @@ func (rl *http2clientConnReadLoop) handleResponse(cs *http2clientStream, f *http
                return nil, errors.New("malformed response from server: malformed non-numeric status pseudo header")
        }
 
-       header := make(Header)
+       regularFields := f.RegularFields()
+       strs := make([]string, len(regularFields))
+       header := make(Header, len(regularFields))
        res := &Response{
                Proto:      "HTTP/2.0",
                ProtoMajor: 2,
@@ -8400,7 +8394,7 @@ func (rl *http2clientConnReadLoop) handleResponse(cs *http2clientStream, f *http
                StatusCode: statusCode,
                Status:     status + " " + StatusText(statusCode),
        }
-       for _, hf := range f.RegularFields() {
+       for _, hf := range regularFields {
                key := CanonicalHeaderKey(hf.Name)
                if key == "Trailer" {
                        t := res.Trailer
@@ -8412,7 +8406,18 @@ func (rl *http2clientConnReadLoop) handleResponse(cs *http2clientStream, f *http
                                t[CanonicalHeaderKey(v)] = nil
                        })
                } else {
-                       header[key] = append(header[key], hf.Value)
+                       vv := header[key]
+                       if vv == nil && len(strs) > 0 {
+                               // More than likely this will be a single-element key.
+                               // Most headers aren't multi-valued.
+                               // Set the capacity on strs[0] to 1, so any future append
+                               // won't extend the slice into the other strings.
+                               vv, strs = strs[:1:1], strs[1:]
+                               vv[0] = hf.Value
+                               header[key] = vv
+                       } else {
+                               header[key] = append(vv, hf.Value)
+                       }
                }
        }
 
@@ -8698,8 +8703,6 @@ func (rl *http2clientConnReadLoop) processData(f *http2DataFrame) error {
        return nil
 }
 
-var http2errInvalidTrailers = errors.New("http2: invalid trailers")
-
 func (rl *http2clientConnReadLoop) endStream(cs *http2clientStream) {
        // TODO: check that any declared content-length matches, like
        // server.go's (*stream).endStream method.
@@ -8930,7 +8933,6 @@ func (cc *http2ClientConn) writeStreamReset(streamID uint32, code http2ErrCode,
 var (
        http2errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit")
        http2errRequestHeaderListSize  = errors.New("http2: request header list larger than peer's advertised limit")
-       http2errPseudoTrailers         = errors.New("http2: invalid pseudo header in trailers")
 )
 
 func (cc *http2ClientConn) logf(format string, args ...interface{}) {