Skip to content

Commit dbd323b

Browse files
committed
internal/x/net/http2/hpack: update from upstream
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 #29187 Change-Id: Ie2568b3f8d6aaa3f097a4ac25d3acdc794f5ff5c Reviewed-on: https://go-review.googlesource.com/c/154118 Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Matt Layher <[email protected]>
1 parent 47fb1fb commit dbd323b

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/internal/x/net/http2/hpack/hpack.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ type Decoder struct {
9292
// saveBuf is previous data passed to Write which we weren't able
9393
// to fully parse before. Unlike buf, we own this data.
9494
saveBuf bytes.Buffer
95+
96+
firstField bool // processing the first field of the header block
9597
}
9698

9799
// NewDecoder returns a new decoder with the provided maximum dynamic
@@ -101,6 +103,7 @@ func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decod
101103
d := &Decoder{
102104
emit: emitFunc,
103105
emitEnabled: true,
106+
firstField: true,
104107
}
105108
d.dynTab.table.init()
106109
d.dynTab.allowedMaxSize = maxDynamicTableSize
@@ -226,11 +229,15 @@ func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) {
226229
return hf, nil
227230
}
228231

232+
// Close declares that the decoding is complete and resets the Decoder
233+
// to be reused again for a new header block. If there is any remaining
234+
// data in the decoder's buffer, Close returns an error.
229235
func (d *Decoder) Close() error {
230236
if d.saveBuf.Len() > 0 {
231237
d.saveBuf.Reset()
232238
return DecodingError{errors.New("truncated headers")}
233239
}
240+
d.firstField = true
234241
return nil
235242
}
236243

@@ -266,6 +273,7 @@ func (d *Decoder) Write(p []byte) (n int, err error) {
266273
d.saveBuf.Write(d.buf)
267274
return len(p), nil
268275
}
276+
d.firstField = false
269277
if err != nil {
270278
break
271279
}
@@ -391,7 +399,7 @@ func (d *Decoder) callEmit(hf HeaderField) error {
391399
func (d *Decoder) parseDynamicTableSizeUpdate() error {
392400
// RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
393401
// beginning of the first header block following the change to the dynamic table size.
394-
if d.dynTab.size > 0 {
402+
if !d.firstField && d.dynTab.size > 0 {
395403
return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
396404
}
397405

src/internal/x/net/http2/hpack/hpack_test.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -748,14 +748,22 @@ func TestDynamicSizeUpdate(t *testing.T) {
748748
enc.SetMaxDynamicTableSize(255)
749749
enc.WriteField(HeaderField{Name: "foo", Value: "bar"})
750750

751-
d := NewDecoder(4096, nil)
752-
_, err := d.DecodeFull(buf.Bytes())
751+
d := NewDecoder(4096, func(_ HeaderField) {})
752+
_, err := d.Write(buf.Bytes())
753+
if err != nil {
754+
t.Fatalf("unexpected error: got = %v", err)
755+
}
756+
757+
d.Close()
758+
759+
// Start a new header
760+
_, err = d.Write(buf.Bytes())
753761
if err != nil {
754762
t.Fatalf("unexpected error: got = %v", err)
755763
}
756764

757765
// must fail since the dynamic table update must be at the beginning
758-
_, err = d.DecodeFull(buf.Bytes())
766+
_, err = d.Write(buf.Bytes())
759767
if err == nil {
760768
t.Fatalf("dynamic table size update not at the beginning of a header block")
761769
}

0 commit comments

Comments
 (0)