mirror of
https://github.com/status-im/nim-websock.git
synced 2025-02-13 01:46:49 +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
|
frame.length = finalLen
|
||||||
|
|
||||||
|
if frame.length > WSMaxMessageSize:
|
||||||
|
raise newException(WSPayloadLengthError, "Frame too big: " & $frame.length)
|
||||||
|
|
||||||
# Do we need to apply mask?
|
# Do we need to apply mask?
|
||||||
frame.mask = (b1 and 0x80) == 0x80
|
frame.mask = (b1 and 0x80) == 0x80
|
||||||
if masked == frame.mask:
|
if masked == frame.mask:
|
||||||
|
@ -312,6 +312,10 @@ proc recv*(
|
|||||||
## Use this to stream data from frames
|
## 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 consumed = 0
|
||||||
var pbuffer = cast[ptr UncheckedArray[byte]](data)
|
var pbuffer = cast[ptr UncheckedArray[byte]](data)
|
||||||
try:
|
try:
|
||||||
@ -321,7 +325,8 @@ proc recv*(
|
|||||||
|
|
||||||
while consumed < size:
|
while consumed < size:
|
||||||
if isNil(ws.frame):
|
if isNil(ws.frame):
|
||||||
trace "Empty frame, breaking"
|
assert ws.readyState == ReadyState.Closed
|
||||||
|
trace "Closed connection, breaking"
|
||||||
break
|
break
|
||||||
|
|
||||||
logScope:
|
logScope:
|
||||||
@ -347,8 +352,8 @@ proc recv*(
|
|||||||
trace "Reading bytes from frame stream", len
|
trace "Reading bytes from frame stream", len
|
||||||
let read = await ws.frame.read(ws.stream.reader, addr pbuffer[consumed], len)
|
let read = await ws.frame.read(ws.stream.reader, addr pbuffer[consumed], len)
|
||||||
if read <= 0:
|
if read <= 0:
|
||||||
trace "Didn't read any bytes, breaking"
|
trace "Didn't read any bytes, stopping"
|
||||||
break
|
raise newException(WSClosedError, "WebSocket is closed!")
|
||||||
|
|
||||||
trace "Read data from frame", read
|
trace "Read data from frame", read
|
||||||
consumed += read
|
consumed += read
|
||||||
|
@ -96,6 +96,7 @@ type
|
|||||||
stream*: AsyncStream
|
stream*: AsyncStream
|
||||||
frame*: Frame
|
frame*: Frame
|
||||||
first*: bool
|
first*: bool
|
||||||
|
reading*: bool
|
||||||
proto*: string
|
proto*: string
|
||||||
|
|
||||||
Ext* = ref object of RootObj
|
Ext* = ref object of RootObj
|
||||||
|
Loading…
x
Reference in New Issue
Block a user