-
Notifications
You must be signed in to change notification settings - Fork 18.6k
Closed
Labels
Milestone
Description
When using io.Copy() with a websocket as source, this fails if incoming websocket frames
are too large.
The reason is because io.Copy() uses a buffer with a default size for the Read().
websocket.Read() in turn uses bufio.ReadSlice() to read the current frame up to the
final 0xff. But if the incoming websocket frame size exceeds the buffer size of
io.Copy(), a ErrBufferFull ("bufio: buffer full") is generated.
The websocket specification does not limit the size of a frame, so this behaviour is
somewhat undesirable, as the success of a io.Copy() depends on the size of internal
buffers and the undeterminable websocket frame size.
What steps will reproduce the problem?
1. One process needs to open a websocket connection to a Go websocket server (pseudo
code, obviously):
ws := websocket.Dial("127.0.0.1:80")
buf := make([]byte, 100000)
ws.Write(buf)
2. Websocket server:
ws := accepted websocket.Conn
writer := io.Writer
err := io.Copy(writer, ws)
What is the expected output?
err == nil
What do you see instead?
err == bufio.ErrBufferFull
Which revision are you using? (hg identify)
1b38d90eebcd+ (release-branch.r58) tip
(patches applied at other locations)