Skip to content

x/net/websocket: Read() doesn't read the whole frame #27967

@antong

Description

@antong

The documentation for websocket.(*Conn).Read() states:

func (ws *Conn) Read(msg []byte) (n int, err error)

Read implements the io.Reader interface: it reads data of a frame from the WebSocket connection.
if msg is not large enough for the frame data, it fills the msg and next Read will read the rest of the
frame data. it reads Text frame or Binary frame.

I interpret this as meaning that if msg is large enough, then the whole frame will be read (exceptio probat regulam in casibus non exceptis, the exception proves the rule).

However, in case of large frames (larger than bufio defaultBufSize) the read will always be short. Either the documentation or the implementation is wrong.

websocket.Message.Receive() does read the whole frame.

What version of Go are you using (go version)?

go1.11

Does this issue reproduce with the latest release?

Yes.

What operating system and processor architecture are you using (go env)?

Reproduced on:

  • GOOS=windows GOARCH=amd64
  • GOOS=linux GOARCH=amd64

What did you do?

I connected an x/net/websocket client and server, and had the server write a 5000 byte long frame using websocket.(*Conn).Write() and the client read it using websocket.(*Conn).Read().

Client: https://play.golang.org/p/BYtr4kSJUfu
Server: https://play.golang.org/p/LHWv9YfqsjB

What did you expect to see?

I expected websocket.(*Conn).Read() to read the whole 5000 byte long frame.

What did you see instead?

websocket.(*Conn).Read() read only 4092 bytes of the 5000 byte long frame.

Metadata

Metadata

Assignees

No one assigned

    Labels

    NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions