MCPcopy
hub / github.com/nats-io/nats.go / Read

Method Read

ws.go:209–369  ·  view source on GitHub ↗
(p []byte)

Source from the content-addressed store, hash-verified

207}
208
209func (r *websocketReader) Read(p []byte) (int, error) {
210 var err error
211 var buf []byte
212
213 if l := len(r.ib); l > 0 {
214 buf = r.ib
215 r.ib = nil
216 } else {
217 if len(r.pending) > 0 {
218 return r.drainPending(p), nil
219 }
220
221 // If we have a deferred close error (from a previous Read that
222 // had both data frames and a close frame), return it now that
223 // pending data has been drained.
224 if r.closeErr != nil {
225 err := r.closeErr
226 r.closeErr = nil
227 return 0, err
228 }
229
230 // Get some data from the underlying reader.
231 n, err := r.r.Read(p)
232 if err != nil {
233 return 0, err
234 }
235 buf = p[:n]
236 }
237
238 // Now parse this and decode frames. We will possibly read more to
239 // ensure that we get a full frame.
240 var (
241 tmpBuf []byte
242 pos int
243 max = len(buf)
244 rem = 0
245 )
246 for pos < max {
247 b0 := buf[pos]
248 frameType := wsOpCode(b0 & 0xF)
249 final := b0&wsFinalBit != 0
250 compressed := b0&wsRsv1Bit != 0
251 pos++
252
253 tmpBuf, pos, err = wsGet(r.r, buf, pos, 1)
254 if err != nil {
255 return 0, err
256 }
257 b1 := tmpBuf[0]
258
259 // Store size in case it is < 125
260 rem = int(b1 & 0x7F)
261
262 switch frameType {
263 case wsPingMessage, wsPongMessage, wsCloseMessage:
264 if rem > wsMaxControlPayloadSize {
265 return 0, fmt.Errorf(
266 "control frame length bigger than maximum allowed of %v bytes",

Callers

nothing calls this directly

Calls 10

drainPendingMethod · 0.95
maxFrameSizeMethod · 0.95
handleControlFrameMethod · 0.95
addCBufMethod · 0.95
wsOpCodeTypeAlias · 0.85
wsGetFunction · 0.85
wsIsControlFrameFunction · 0.85
ErrorfMethod · 0.80
decompressMethod · 0.80
ReadMethod · 0.45

Tested by

no test coverage detected