From a5681d03e38006655b2b6383253c701a8d5409f4 Mon Sep 17 00:00:00 2001 From: Euan T Date: Mon, 3 Jul 2017 20:13:25 +0100 Subject: [PATCH 1/3] Wait for reads to finish before reading the result As requested by @dom96, this fixes an issue seen here: https://github.com/nim-lang/redis/pull/4#issuecomment-312713921 --- lib/pure/asyncnet.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/asyncnet.nim b/lib/pure/asyncnet.nim index 9f73bc3cfa..f5c7b3e05b 100644 --- a/lib/pure/asyncnet.nim +++ b/lib/pure/asyncnet.nim @@ -534,14 +534,14 @@ proc recvLineInto*(socket: AsyncSocket, resString: FutureVar[string], var c = "" while true: let recvFut = recv(socket, 1, flags) - c = recvFut.read() + c = await recvFut if c.len == 0: resString.mget.setLen(0) resString.complete() return if c == "\r": let recvFut = recv(socket, 1, flags) # Skip \L - c = recvFut.read() + c = await recvFut assert c == "\L" addNLIfEmpty() resString.complete() From 3f3853945d161a2ada421530bbcd43c7ab74a2eb Mon Sep 17 00:00:00 2001 From: Euan Torano Date: Sun, 9 Jul 2017 20:50:47 +0100 Subject: [PATCH 2/3] Adding test for recvline Signed-off-by: Euan Torano --- lib/pure/asyncnet.nim | 6 ++-- tests/async/tasyncRecvLine.nim | 54 ++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 tests/async/tasyncRecvLine.nim diff --git a/lib/pure/asyncnet.nim b/lib/pure/asyncnet.nim index f5c7b3e05b..5de65efe0b 100644 --- a/lib/pure/asyncnet.nim +++ b/lib/pure/asyncnet.nim @@ -533,15 +533,13 @@ proc recvLineInto*(socket: AsyncSocket, resString: FutureVar[string], else: var c = "" while true: - let recvFut = recv(socket, 1, flags) - c = await recvFut + c = await recv(socket, 1, flags) if c.len == 0: resString.mget.setLen(0) resString.complete() return if c == "\r": - let recvFut = recv(socket, 1, flags) # Skip \L - c = await recvFut + c = await recv(socket, 1, flags) # Skip \L assert c == "\L" addNLIfEmpty() resString.complete() diff --git a/tests/async/tasyncRecvLine.nim b/tests/async/tasyncRecvLine.nim new file mode 100644 index 0000000000..5db51671e1 --- /dev/null +++ b/tests/async/tasyncRecvLine.nim @@ -0,0 +1,54 @@ +discard """ + file: "tasyncsend4754.nim" + output: ''' +Hello World +Hello World +''' +""" + +import asyncdispatch, asyncnet + +const recvLinePort = Port(6047) + +proc setupTestServer(): AsyncSocket = + result = newAsyncSocket() + result.setSockOpt(OptReuseAddr, true) + result.bindAddr(recvLinePort) + result.listen() + +proc testUnbuffered(): Future[void] {.async.} = + let serverSock = setupTestServer() + let serverAcceptClientFut = serverSock.accept() + + let clientSock = newAsyncSocket(buffered = false) + let clientConnectFut = clientSock.connect("localhost", recvLinePort) + + let serverAcceptedClient = await serverAcceptClientFut + await clientConnectFut + + await serverAcceptedClient.send("Hello World\c\L") + + echo await clientSock.recvLine() + + clientSock.close() + serverSock.close() + +proc testBuffered(): Future[void] {.async.} = + let serverSock = setupTestServer() + let serverAcceptClientFut = serverSock.accept() + + let clientSock = newAsyncSocket(buffered = true) + let clientConnectFut = clientSock.connect("localhost", recvLinePort) + + let serverAcceptedClient = await serverAcceptClientFut + await clientConnectFut + + await serverAcceptedClient.send("Hello World\c\L") + + echo await clientSock.recvLine() + + clientSock.close() + serverSock.close() + +waitFor testUnbuffered() +waitFor testBuffered() From 7e4ca9a8716e571ad6a70d28e416969d33d251cb Mon Sep 17 00:00:00 2001 From: Euan T Date: Mon, 10 Jul 2017 09:23:45 +0100 Subject: [PATCH 3/3] Update test header Signed-off-by: Euan T --- tests/async/tasyncRecvLine.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/async/tasyncRecvLine.nim b/tests/async/tasyncRecvLine.nim index 5db51671e1..679831b27b 100644 --- a/tests/async/tasyncRecvLine.nim +++ b/tests/async/tasyncRecvLine.nim @@ -1,5 +1,5 @@ discard """ - file: "tasyncsend4754.nim" + file: "tasyncRecvLine.nim" output: ''' Hello World Hello World