Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions websock/http/server.nim
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type
HttpServer* = ref object of StreamServer
handler*: HttpAsyncCallback
headersTimeout*: Duration
acceptLock: AsyncLock
case secure*: bool
of true:
tlsFlags*: set[TLSFlags]
Expand Down Expand Up @@ -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()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
await server.acceptLock.acquire()
# StreamServer.accept does not allow queueing multiple accept requests, so we protect access to it with a lock
await server.acceptLock.acquire()

or some similar comment

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:
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -221,6 +229,7 @@ proc create*(
tlsCertificate: tlsCertificate,
minVersion: tlsMinVersion,
maxVersion: tlsMaxVersion,
acceptLock: newAsyncLock(),
)

let localAddress =
Expand Down