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

Method Read

internal/http3/stream.go:76–119  ·  view source on GitHub ↗
(b []byte)

Source from the content-addressed store, hash-verified

74}
75
76func (s *Stream) Read(b []byte) (int, error) {
77 if s.bytesRemainingInFrame == 0 {
78 parseLoop:
79 for {
80 frame, err := s.frameParser.ParseNext(s.qlogger)
81 if err != nil {
82 return 0, err
83 }
84 switch f := frame.(type) {
85 case *dataFrame:
86 if s.parsedTrailer {
87 return 0, errors.New("DATA frame received after trailers")
88 }
89 s.bytesRemainingInFrame = f.Length
90 break parseLoop
91 case *headersFrame:
92 if s.conn.isServer {
93 continue
94 }
95 if s.parsedTrailer {
96 maybeQlogInvalidHeadersFrame(s.qlogger, s.StreamID(), f.Length)
97 return 0, errors.New("additional HEADERS frame received after trailers")
98 }
99 s.parsedTrailer = true
100 return 0, s.parseTrailer(s.datagramStream, f)
101 default:
102 s.conn.CloseWithError(quic.ApplicationErrorCode(ErrCodeFrameUnexpected), "")
103 // parseNextFrame skips over unknown frame types
104 // Therefore, this condition is only entered when we parsed another known frame type.
105 return 0, fmt.Errorf("peer sent an unexpected frame: %T", f)
106 }
107 }
108 }
109
110 var n int
111 var err error
112 if s.bytesRemainingInFrame < uint64(len(b)) {
113 n, err = s.datagramStream.Read(b[:s.bytesRemainingInFrame])
114 } else {
115 n, err = s.datagramStream.Read(b)
116 }
117 s.bytesRemainingInFrame -= uint64(n)
118 return n, err
119}
120
121func (s *Stream) hasMoreData() bool {
122 return s.bytesRemainingInFrame > 0

Callers 2

ReadMethod · 0.45
ReadMethod · 0.45

Calls 5

StreamIDMethod · 0.95
ParseNextMethod · 0.80
ErrorfMethod · 0.65
CloseWithErrorMethod · 0.45

Tested by

no test coverage detected