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
()
| 524 | // If ReadFrame returns an error and a non-nil Frame, the Frame's StreamID |
| 525 | // indicates the stream responsible for the error. |
| 526 | func (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 |