From 3986b3557714d9f3bbbc3854d08a3c404996a4d7 Mon Sep 17 00:00:00 2001 From: Fabiana Cecin Date: Wed, 26 Nov 2025 09:14:43 -0300 Subject: [PATCH] feat: support HttpServer.accept call from multiple spawned tasks --- websock/http/server.nim | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/websock/http/server.nim b/websock/http/server.nim index e3a8c78f42..85a999202b 100644 --- a/websock/http/server.nim +++ b/websock/http/server.nim @@ -24,6 +24,7 @@ type HttpServer* = ref object of StreamServer handler*: HttpAsyncCallback headersTimeout*: Duration + acceptLock: AsyncLock case secure*: bool of true: tlsFlags*: set[TLSFlags] @@ -137,12 +138,17 @@ proc accept*(server: HttpServer): Future[HttpRequest] {.async.} = HttpError, "Callback already registered - cannot mix callback and accepts styles!" ) + await server.acceptLock.acquire() trace "Awaiting new request" - let + var transp: StreamTransport + try: transp = await StreamServer(server).accept() - stream = server.openAsyncStream(transp).valueOr: - await transp.closeWait() - raise (ref HttpError)(msg: error) + finally: + server.acceptLock.release() + + let stream = server.openAsyncStream(transp).valueOr: + await transp.closeWait() + raise (ref HttpError)(msg: error) trace "Got new request", isTls = server.secure try: @@ -173,7 +179,9 @@ proc create*( else: address - var server = HttpServer(handler: handler, headersTimeout: headersTimeout) + var server = HttpServer( + handler: handler, headersTimeout: headersTimeout, acceptLock: newAsyncLock() + ) server = HttpServer( createStreamServer(localAddress, handleConnCb, flags, child = StreamServer(server)) @@ -221,6 +229,7 @@ proc create*( tlsCertificate: tlsCertificate, minVersion: tlsMinVersion, maxVersion: tlsMaxVersion, + acceptLock: newAsyncLock(), ) let localAddress =