(b []byte)
| 74 | } |
| 75 | |
| 76 | func (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 | |
| 121 | func (s *Stream) hasMoreData() bool { |
| 122 | return s.bytesRemainingInFrame > 0 |
no test coverage detected