MCPcopy Create free account
hub / github.com/imroc/req / readMetaFrame

Method readMetaFrame

internal/http2/frame.go:1561–1693  ·  view source on GitHub ↗

readMetaFrame returns 0 or more CONTINUATION frames from fr and merge them into the provided hf and returns a MetaHeadersFrame with the decoded hpack values.

(hf *HeadersFrame, dumps []*dump.Dumper)

Source from the content-addressed store, hash-verified

1559// merge them into the provided hf and returns a MetaHeadersFrame
1560// with the decoded hpack values.
1561func (h2f *Framer) readMetaFrame(hf *HeadersFrame, dumps []*dump.Dumper) (Frame, error) {
1562 if h2f.AllowIllegalReads {
1563 return nil, errors.New("illegal use of AllowIllegalReads with ReadMetaHeaders")
1564 }
1565 mh := &MetaHeadersFrame{
1566 HeadersFrame: hf,
1567 }
1568 remainSize := h2f.maxHeaderListSize()
1569 var sawRegular bool
1570
1571 var invalid error // pseudo header field errors
1572 hdec := h2f.ReadMetaHeaders
1573 hdec.SetEmitEnabled(true)
1574 hdec.SetMaxStringLength(h2f.maxHeaderStringLen())
1575 rawEmitFunc := func(hf hpack.HeaderField) {
1576 if VerboseLogs && h2f.logReads {
1577 h2f.debugReadLoggerf("http2: decoded hpack field %+v", hf)
1578 }
1579 if !httpguts.ValidHeaderFieldValue(hf.Value) {
1580 // Don't include the value in the error, because it may be sensitive.
1581 invalid = headerFieldValueError(hf.Name)
1582 }
1583 isPseudo := strings.HasPrefix(hf.Name, ":")
1584 if isPseudo {
1585 if sawRegular {
1586 invalid = errPseudoAfterRegular
1587 }
1588 } else {
1589 sawRegular = true
1590 if !validWireHeaderFieldName(hf.Name) {
1591 invalid = headerFieldNameError(hf.Name)
1592 }
1593 }
1594
1595 if invalid != nil {
1596 hdec.SetEmitEnabled(false)
1597 return
1598 }
1599
1600 size := hf.Size()
1601 if size > remainSize {
1602 hdec.SetEmitEnabled(false)
1603 mh.Truncated = true
1604 remainSize = 0
1605 return
1606 }
1607 remainSize -= size
1608
1609 mh.Fields = append(mh.Fields, hf)
1610 }
1611 emitFunc := rawEmitFunc
1612
1613 ds := dump.Dumpers(dumps)
1614 if ds.ShouldDump() {
1615 emitFunc = func(hf hpack.HeaderField) {
1616 ds.DumpResponseHeader([]byte(fmt.Sprintf("%s: %s\r\n", hf.Name, hf.Value)))
1617 rawEmitFunc(hf)
1618 }

Callers 1

ReadFrameMethod · 0.95

Calls 15

maxHeaderListSizeMethod · 0.95
maxHeaderStringLenMethod · 0.95
HeaderBlockFragmentMethod · 0.95
ReadFrameMethod · 0.95
checkPseudosMethod · 0.95
DumpersTypeAlias · 0.92
headerFieldValueErrorTypeAlias · 0.85
validWireHeaderFieldNameFunction · 0.85
headerFieldNameErrorTypeAlias · 0.85
ConnectionErrorTypeAlias · 0.85
ShouldDumpMethod · 0.80
WriteMethod · 0.65

Tested by

no test coverage detected