(ctx context.Context)
| 367 | } |
| 368 | |
| 369 | func (c *Conn) reader(ctx context.Context) (_ MessageType, _ io.Reader, err error) { |
| 370 | defer errd.Wrap(&err, "failed to get reader") |
| 371 | |
| 372 | err = c.readMu.lock(ctx) |
| 373 | if err != nil { |
| 374 | return 0, nil, err |
| 375 | } |
| 376 | defer c.readMu.unlock() |
| 377 | |
| 378 | if !c.msgReader.fin { |
| 379 | return 0, nil, errors.New("previous message not read to completion") |
| 380 | } |
| 381 | |
| 382 | h, err := c.readLoop(ctx) |
| 383 | if err != nil { |
| 384 | return 0, nil, err |
| 385 | } |
| 386 | |
| 387 | if h.opcode == opContinuation { |
| 388 | err := errors.New("received continuation frame without text or binary frame") |
| 389 | c.writeError(StatusProtocolError, err) |
| 390 | return 0, nil, err |
| 391 | } |
| 392 | |
| 393 | c.msgReader.reset(ctx, h) |
| 394 | |
| 395 | return MessageType(h.opcode), c.msgReader, nil |
| 396 | } |
| 397 | |
| 398 | type msgReader struct { |
| 399 | c *Conn |
no test coverage detected