Skip to content

Commit 92d350f

Browse files
authored
Fix fragmented message sending (#116)
We previously crashed when sending things over 1mb
1 parent 283a9bb commit 92d350f

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

tests/testwebsockets.nim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -783,11 +783,11 @@ suite "Test Payload":
783783

784784
asyncTest "Send text message with multiple frames":
785785
const FrameSize = 3000
786-
let testData = rndStr(FrameSize * 3)
786+
let testData = rndStr(FrameSize * 3 + 100)
787787
proc handle(request: HttpRequest) {.async.} =
788788
check request.uri.path == WSPath
789789

790-
let server = WSServer.new(protos = ["proto"])
790+
let server = WSServer.new(protos = ["proto"], frameSize = FrameSize)
791791
let ws = await server.handleRequest(request)
792792
let res = await ws.recvMsg()
793793

websock/session.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,21 @@ proc writeMessage*(ws: WSSession,
3737
let maxSize = ws.frameSize
3838
var i = 0
3939
while ws.readyState notin {ReadyState.Closing}:
40-
let len = min(data.len, maxSize)
40+
let canSend = min(data.len - i, maxSize)
4141
let frame = Frame(
42-
fin: if (len + i >= data.len): true else: false,
42+
fin: if (canSend + i >= data.len): true else: false,
4343
rsv1: false,
4444
rsv2: false,
4545
rsv3: false,
4646
opcode: if i > 0: Opcode.Cont else: opcode, # fragments have to be `Continuation` frames
4747
mask: ws.masked,
48-
data: data[i ..< len + i],
48+
data: data[i ..< canSend + i],
4949
maskKey: maskKey)
5050

5151
let encoded = await frame.encode(extensions)
5252
await ws.stream.writer.write(encoded)
5353

54-
i += len
54+
i += canSend
5555
if i >= data.len:
5656
break
5757

0 commit comments

Comments
 (0)