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

Method ReadFrame

internal/http2/frame.go:526–584  ·  view source on GitHub ↗

ReadFrame reads a single frame. The returned Frame is only valid until the next call to ReadFrame. If the frame is larger than previously set with SetMaxReadFrameSize, the returned error is errFrameTooLarge. Other errors may be of type ConnectionError, StreamError, or anything else from the underly

()

Source from the content-addressed store, hash-verified

524// If ReadFrame returns an error and a non-nil Frame, the Frame's StreamID
525// indicates the stream responsible for the error.
526func (h2f *Framer) ReadFrame() (Frame, error) {
527 h2f.errDetail = nil
528 if h2f.lastFrame != nil {
529 h2f.lastFrame.invalidate()
530 }
531 fh, err := readFrameHeader(h2f.headerBuf[:], h2f.r)
532 if err != nil {
533 return nil, err
534 }
535 if fh.Length > h2f.maxReadSize {
536 return nil, errFrameTooLarge
537 }
538 payload := h2f.getReadBuf(fh.Length)
539 if _, err := io.ReadFull(h2f.r, payload); err != nil {
540 return nil, err
541 }
542 f, err := typeFrameParser(fh.Type)(h2f.frameCache, fh, h2f.countError, payload)
543 if err != nil {
544 if ce, ok := err.(connError); ok {
545 return nil, h2f.connError(ce.Code, ce.Reason)
546 }
547 return nil, err
548 }
549 if err := h2f.checkFrameOrder(f); err != nil {
550 return nil, err
551 }
552 if h2f.logReads {
553 h2f.debugReadLoggerf("http2: Framer %p: read %v", h2f, summarizeFrame(f))
554 }
555 if fh.Type == FrameHeaders && h2f.ReadMetaHeaders != nil {
556 hf := f.(*HeadersFrame)
557 req := h2f.currentRequest(hf.StreamID)
558 var ctx context.Context
559 if req != nil {
560 ctx = req.Context()
561 }
562 var dumps []*dump.Dumper
563 if h2f.cc != nil {
564 dumps = dump.GetDumpers(ctx, h2f.cc.t.Dump)
565 }
566 if len(dumps) > 0 {
567 dd := []*dump.Dumper{}
568 for _, dump := range dumps {
569 if dump.ResponseHeader() {
570 dd = append(dd, dump)
571 }
572 }
573 dumps = dd
574 }
575 hr, err := h2f.readMetaFrame(hf, dumps)
576 if err == nil && len(dumps) > 0 {
577 for _, dump := range dumps {
578 dump.DumpResponseHeader([]byte("\r\n"))
579 }
580 }
581 return hr, err
582 }
583 return f, nil

Callers 8

TestFramerWriteReadDataFunction · 0.95
TestFramerWriteReadPingFunction · 0.95
readMetaFrameMethod · 0.95
runMethod · 0.80
logWriteMethod · 0.80

Calls 12

connErrorMethod · 0.95
checkFrameOrderMethod · 0.95
currentRequestMethod · 0.95
readMetaFrameMethod · 0.95
GetDumpersFunction · 0.92
readFrameHeaderFunction · 0.85
typeFrameParserFunction · 0.85
summarizeFrameFunction · 0.85
invalidateMethod · 0.65
ContextMethod · 0.65
ResponseHeaderMethod · 0.65
DumpResponseHeaderMethod · 0.45

Tested by 5

TestFramerWriteReadDataFunction · 0.76
TestFramerWriteReadPingFunction · 0.76