Skip to content

Commit a65dbf7

Browse files
authored
Use async to fix asynchttpserver (#236)
* Use async to fix asynchttpserver * Different solution
1 parent 4c39652 commit a65dbf7

File tree

2 files changed

+17
-17
lines changed

2 files changed

+17
-17
lines changed

jester.nim

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,24 @@ proc unsafeSend(request: Request, content: string) =
9999

100100
proc send(
101101
request: Request, code: HttpCode, headers: Option[RawHeaders], body: string
102-
) =
102+
): Future[void] =
103103
when useHttpBeast:
104104
let h =
105105
if headers.isNone: ""
106106
else: headers.get().createHeaders
107107
request.getNativeReq.send(code, body, h)
108+
var fut = newFuture[void]()
109+
complete(fut)
110+
return fut
108111
else:
109-
# TODO: This may cause issues if we send too fast.
110-
asyncCheck request.getNativeReq.respond(
112+
return request.getNativeReq.respond(
111113
code, body, newHttpHeaders(headers.get(@({:})))
112114
)
113115

114116
proc statusContent(request: Request, status: HttpCode, content: string,
115-
headers: Option[RawHeaders]) =
117+
headers: Option[RawHeaders]): Future[void] =
116118
try:
117-
send(request, status, headers, content)
119+
result = send(request, status, headers, content)
118120
when not defined(release):
119121
logging.debug(" $1 $2" % [$status, toStr(headers)])
120122
except:
@@ -188,18 +190,18 @@ proc sendStaticIfExists(
188190
# If the user has a cached version of this file and it matches our
189191
# version, let them use it
190192
if req.headers.hasKey("If-None-Match") and req.headers["If-None-Match"] == hashed:
191-
req.statusContent(Http304, "", none[RawHeaders]())
193+
await req.statusContent(Http304, "", none[RawHeaders]())
192194
else:
193-
req.statusContent(Http200, file, some(@({
194-
"Content-Type": mimetype,
195-
"ETag": hashed
196-
})))
195+
await req.statusContent(Http200, file, some(@({
196+
"Content-Type": mimetype,
197+
"ETag": hashed
198+
})))
197199
else:
198200
let headers = @({
199201
"Content-Type": mimetype,
200202
"Content-Length": $fileSize
201203
})
202-
req.statusContent(Http200, "", some(headers))
204+
await req.statusContent(Http200, "", some(headers))
203205

204206
var fileStream = newFutureStream[string]("sendStaticIfExists")
205207
var file = openAsync(p, fmRead)
@@ -227,7 +229,7 @@ proc close*(request: Request) =
227229
## Routes using this procedure must enable raw mode.
228230
let nativeReq = request.getNativeReq()
229231
when useHttpBeast:
230-
nativeReq.forget()
232+
nativeReq.forget()
231233
nativeReq.client.close()
232234

233235
proc defaultErrorFilter(error: RouteError): ResponseData =
@@ -363,7 +365,7 @@ proc handleRequestSlow(
363365
not dispatchedError and respData.content.len == 0:
364366
respData = await dispatchError(jes, req, initRouteError(respData))
365367

366-
statusContent(
368+
await statusContent(
367369
req,
368370
respData.code,
369371
respData.content,
@@ -384,7 +386,7 @@ proc handleRequest(jes: Jester, httpReq: NativeRequest): Future[void] =
384386
if likely(jes.matchers.len == 1 and not jes.matchers[0].async):
385387
let respData = jes.matchers[0].syncProc(req)
386388
if likely(respData.matched):
387-
statusContent(
389+
return statusContent(
388390
req,
389391
respData.code,
390392
respData.content,
@@ -398,9 +400,6 @@ proc handleRequest(jes: Jester, httpReq: NativeRequest): Future[void] =
398400
let exc = getCurrentException()
399401
let respDataFut = dispatchError(jes, req, initRouteError(exc))
400402
return handleRequestSlow(jes, req, respDataFut, true)
401-
let future = newFuture[void]()
402-
complete(future)
403-
return future
404403

405404
proc newSettings*(
406405
port = Port(5000), staticDir = getCurrentDir() / "public",

jester/request.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ proc reqMethod*(req: Request): HttpMethod =
6161
req.req.httpMethod.get()
6262
else:
6363
req.req.reqMethod
64+
6465
proc reqMeth*(req: Request): HttpMethod {.deprecated.} =
6566
req.reqMethod
6667

0 commit comments

Comments
 (0)