mirror of
https://github.com/status-im/nim-websock.git
synced 2025-02-12 17:36:26 +00:00
Fix some issues with recv hanging (#109)
* Crash on concurrent reads * Fix some issues with recv hanging
This commit is contained in:
parent
5311a6e0b8
commit
edfbb169c8
@ -205,6 +205,9 @@ proc decode*(
|
||||
|
||||
frame.length = finalLen
|
||||
|
||||
if frame.length > WSMaxMessageSize:
|
||||
raise newException(WSPayloadLengthError, "Frame too big: " & $frame.length)
|
||||
|
||||
# Do we need to apply mask?
|
||||
frame.mask = (b1 and 0x80) == 0x80
|
||||
if masked == frame.mask:
|
||||
|
@ -312,6 +312,10 @@ proc recv*(
|
||||
## Use this to stream data from frames
|
||||
##
|
||||
|
||||
doAssert ws.reading == false, "Only one concurrent read allowed"
|
||||
ws.reading = true
|
||||
defer: ws.reading = false
|
||||
|
||||
var consumed = 0
|
||||
var pbuffer = cast[ptr UncheckedArray[byte]](data)
|
||||
try:
|
||||
@ -321,7 +325,8 @@ proc recv*(
|
||||
|
||||
while consumed < size:
|
||||
if isNil(ws.frame):
|
||||
trace "Empty frame, breaking"
|
||||
assert ws.readyState == ReadyState.Closed
|
||||
trace "Closed connection, breaking"
|
||||
break
|
||||
|
||||
logScope:
|
||||
@ -347,8 +352,8 @@ proc recv*(
|
||||
trace "Reading bytes from frame stream", len
|
||||
let read = await ws.frame.read(ws.stream.reader, addr pbuffer[consumed], len)
|
||||
if read <= 0:
|
||||
trace "Didn't read any bytes, breaking"
|
||||
break
|
||||
trace "Didn't read any bytes, stopping"
|
||||
raise newException(WSClosedError, "WebSocket is closed!")
|
||||
|
||||
trace "Read data from frame", read
|
||||
consumed += read
|
||||
|
@ -96,6 +96,7 @@ type
|
||||
stream*: AsyncStream
|
||||
frame*: Frame
|
||||
first*: bool
|
||||
reading*: bool
|
||||
proto*: string
|
||||
|
||||
Ext* = ref object of RootObj
|
||||
|
Loading…
x
Reference in New Issue
Block a user