1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
discard """
action: compile
"""
# bug #9441
import asyncdispatch, asyncfutures, strtabs
type
Request = object
Context = object
position: int
accept: bool
headers: StringTableRef
Handler = proc (r: ref Request, c: Context): Future[Context]
proc respond(req: Request): Future[void] = discard
proc handle*(h: Handler): auto = # (proc (req: Request): Future[void]) =
proc server(req: Request): Future[void] {.async.} =
let emptyCtx = Context(
position: 0,
accept: true,
headers: newStringTable()
)
var reqHeap = new(Request)
reqHeap[] = req
var
f: Future[Context]
ctx: Context
try:
f = h(reqHeap, emptyCtx)
ctx = await f
except:
discard
if f.failed:
await req.respond()
else:
if not ctx.accept:
await req.respond()
return server
waitFor handle(nil)(Request())
|