diff --git a/news.nimble b/news.nimble index 9774940..2b73e80 100644 --- a/news.nimble +++ b/news.nimble @@ -1,6 +1,6 @@ # Package -version = "0.4" +version = "0.5" author = "Andre von Houck, Volodymyr Melnychuk" description = "Simple WebSocket library for nim." license = "MIT" diff --git a/src/news.nim b/src/news.nim index 4243f1a..1b22c7e 100644 --- a/src/news.nim +++ b/src/news.nim @@ -475,6 +475,14 @@ proc sendPing*(ws: WebSocket): Future[void] {.async.} = proc sendPong(ws: WebSocket): Future[void] {.async.} = await ws.send("", Opcode.Pong) +proc sendClose(ws: WebSocket): Future[void] {.async.} = + await ws.send("", Opcode.Close) + +proc shutdown*(ws: WebSocket): Future[void] {.async.} = + ## close the socket + ws.readyState = Closing + await ws.sendClose + proc receivePacket*(ws: WebSocket): Future[Packet] {.async.} = try: ## wait for a string packet to come @@ -497,7 +505,11 @@ proc receivePacket*(ws: WebSocket): Future[Packet] {.async.} = return elif frame.opcode == Close: - ws.close() + if ws.readyState != Closing: + await ws.sendClose() + ws.readyState = Closed + if not ws.transp.isClosed: + ws.transp.close() except WebSocketError as e: raise e diff --git a/tests/test_close.nim b/tests/test_close.nim new file mode 100644 index 0000000..52117c7 --- /dev/null +++ b/tests/test_close.nim @@ -0,0 +1,40 @@ +import news, asyncdispatch, asynchttpserver, asyncnet + +proc cb(req: Request): Future[void] {.async.} = + echo "cb ", req + var ws = await newWebsocket(req) + await ws.send("Welcome to simple echo server") + while ws.readyState == Open: + let packet = await ws.receivePacket() + await ws.send(packet) + await ws.shutdown() + await req.respond(Http200, "Hello World") + + +proc sendMsg() {.async.} = + var ws = await newWebSocket("ws://localhost:9001") + await ws.send("hi") + while ws.readyState == Open: + let str = await ws.receiveString() + echo "received ", str + ws.close() + + +proc sendClose() {.async.} = + var ws = await newWebSocket("ws://echo.websocket.org:80") + await ws.sendPing() + let pong = await ws.receivePacket() + assert(pong.kind == Pong) + await ws.shutdown() + let close = await ws.receivePacket() + assert(close.kind == Close) + ws.close() + +proc run() {.async.} = + var server = newAsyncHttpServer() + asyncCheck server.serve(Port(9001), cb) + await sendMsg() + await sendClose() + server.close() + +waitFor run() \ No newline at end of file diff --git a/tests/test_ping.nim b/tests/test_ping.nim index 4473fb9..98e40ad 100644 --- a/tests/test_ping.nim +++ b/tests/test_ping.nim @@ -3,7 +3,7 @@ import news, asyncdispatch, asynchttpserver var continueTest = true proc establishConnectionAndListen() {.async.} = - var ws = await newWebSocket("ws://echo.websocket.org:80/") + var ws = await newWebSocket("ws://echo.websocket.org:80") await ws.sendPing() let pong = await ws.receivePacket() assert(pong.kind == Pong)