]> Cypherpunks repositories - gostls13.git/commitdiff
internal/x/net/http2/hpack: update from upstream
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 13 Dec 2018 20:28:29 +0000 (20:28 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 14 Dec 2018 18:15:56 +0000 (18:15 +0000)
Updates to x/net git rev 891ebc4b82d6e74f468c533b06f983c7be918a96 for:

   http2/hpack: track the beginning of a header block
   https://go-review.googlesource.com/c/153978

Updates golang/go#29187

Change-Id: Ie2568b3f8d6aaa3f097a4ac25d3acdc794f5ff5c
Reviewed-on: https://go-review.googlesource.com/c/154118
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matt Layher <mdlayher@gmail.com>
src/internal/x/net/http2/hpack/hpack.go
src/internal/x/net/http2/hpack/hpack_test.go

index 166788ceec5e84f0c1dd5245f9bb042e40d88dad..85f18a2b0a8616295fdb1e69c9df352bf944e436 100644 (file)
@@ -92,6 +92,8 @@ type Decoder struct {
        // saveBuf is previous data passed to Write which we weren't able
        // to fully parse before. Unlike buf, we own this data.
        saveBuf bytes.Buffer
+
+       firstField bool // processing the first field of the header block
 }
 
 // NewDecoder returns a new decoder with the provided maximum dynamic
@@ -101,6 +103,7 @@ func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decod
        d := &Decoder{
                emit:        emitFunc,
                emitEnabled: true,
+               firstField:  true,
        }
        d.dynTab.table.init()
        d.dynTab.allowedMaxSize = maxDynamicTableSize
@@ -226,11 +229,15 @@ func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) {
        return hf, nil
 }
 
+// Close declares that the decoding is complete and resets the Decoder
+// to be reused again for a new header block. If there is any remaining
+// data in the decoder's buffer, Close returns an error.
 func (d *Decoder) Close() error {
        if d.saveBuf.Len() > 0 {
                d.saveBuf.Reset()
                return DecodingError{errors.New("truncated headers")}
        }
+       d.firstField = true
        return nil
 }
 
@@ -266,6 +273,7 @@ func (d *Decoder) Write(p []byte) (n int, err error) {
                        d.saveBuf.Write(d.buf)
                        return len(p), nil
                }
+               d.firstField = false
                if err != nil {
                        break
                }
@@ -391,7 +399,7 @@ func (d *Decoder) callEmit(hf HeaderField) error {
 func (d *Decoder) parseDynamicTableSizeUpdate() error {
        // RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
        // beginning of the first header block following the change to the dynamic table size.
-       if d.dynTab.size > 0 {
+       if !d.firstField && d.dynTab.size > 0 {
                return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
        }
 
index 3f2227442a985319e1f7eeceb9ba4fe7687da148..a361a2a7c2ece1b537d0018002e8e32685b133be 100644 (file)
@@ -748,14 +748,22 @@ func TestDynamicSizeUpdate(t *testing.T) {
        enc.SetMaxDynamicTableSize(255)
        enc.WriteField(HeaderField{Name: "foo", Value: "bar"})
 
-       d := NewDecoder(4096, nil)
-       _, err := d.DecodeFull(buf.Bytes())
+       d := NewDecoder(4096, func(_ HeaderField) {})
+       _, err := d.Write(buf.Bytes())
+       if err != nil {
+               t.Fatalf("unexpected error: got = %v", err)
+       }
+
+       d.Close()
+
+       // Start a new header
+       _, err = d.Write(buf.Bytes())
        if err != nil {
                t.Fatalf("unexpected error: got = %v", err)
        }
 
        // must fail since the dynamic table update must be at the beginning
-       _, err = d.DecodeFull(buf.Bytes())
+       _, err = d.Write(buf.Bytes())
        if err == nil {
                t.Fatalf("dynamic table size update not at the beginning of a header block")
        }