Refactored createCb in asyncdispatch.
This commit is contained in:
parent
5dc28cc9a7
commit
e4e87f1cb2
2 changed files with 14 additions and 35 deletions
|
|
@ -739,14 +739,16 @@ proc accept*(socket: TAsyncFD): PFuture[TAsyncFD] =
|
||||||
|
|
||||||
# -- Await Macro
|
# -- Await Macro
|
||||||
|
|
||||||
template createCb*(cbName, varNameIterSym, retFutureSym: expr): stmt {.immediate, dirty.} =
|
template createCb*(retFutureSym, iteratorNameSym: expr): stmt {.immediate.} =
|
||||||
proc cbName {.closure.} =
|
var nameIterVar = iteratorNameSym
|
||||||
if not varNameIterSym.finished:
|
proc cb {.closure.} =
|
||||||
var next = varNameIterSym()
|
if not nameIterVar.finished:
|
||||||
|
var next = nameIterVar()
|
||||||
if next == nil:
|
if next == nil:
|
||||||
assert retFutureSym.finished, "Async procedure's return Future was not finished."
|
assert retFutureSym.finished, "Async procedure's return Future was not finished."
|
||||||
else:
|
else:
|
||||||
next.callback = cbName
|
next.callback = cb
|
||||||
|
cb()
|
||||||
|
|
||||||
template createVar(futSymName: string, asyncProc: PNimrodNode,
|
template createVar(futSymName: string, asyncProc: PNimrodNode,
|
||||||
valueReceiver: expr) {.immediate, dirty.} =
|
valueReceiver: expr) {.immediate, dirty.} =
|
||||||
|
|
@ -876,25 +878,11 @@ macro async*(prc: stmt): stmt {.immediate.} =
|
||||||
closureIterator[4] = newNimNode(nnkPragma).add(newIdentNode("closure"))
|
closureIterator[4] = newNimNode(nnkPragma).add(newIdentNode("closure"))
|
||||||
outerProcBody.add(closureIterator)
|
outerProcBody.add(closureIterator)
|
||||||
|
|
||||||
# -> var nameIterVar = nameIter
|
# -> createCb(retFuture)
|
||||||
# -> var first = nameIterVar()
|
|
||||||
var varNameIterSym = genSym(nskVar, $prc[0].getName & "IterVar")
|
|
||||||
var varNameIter = newVarStmt(varNameIterSym, iteratorNameSym)
|
|
||||||
outerProcBody.add varNameIter
|
|
||||||
var varFirstSym = genSym(nskVar, "first")
|
|
||||||
var varFirst = newVarStmt(varFirstSym, newCall(varNameIterSym))
|
|
||||||
outerProcBody.add varFirst
|
|
||||||
|
|
||||||
# -> createCb(cb, nameIter, retFuture)
|
|
||||||
var cbName = newIdentNode("cb")
|
var cbName = newIdentNode("cb")
|
||||||
var procCb = newCall("createCb", cbName, varNameIterSym, retFutureSym)
|
var procCb = newCall("createCb", retFutureSym, iteratorNameSym)
|
||||||
outerProcBody.add procCb
|
outerProcBody.add procCb
|
||||||
|
|
||||||
# -> first.callback = cb
|
|
||||||
outerProcBody.add newAssignment(
|
|
||||||
newDotExpr(varFirstSym, newIdentNode("callback")),
|
|
||||||
cbName)
|
|
||||||
|
|
||||||
# -> return retFuture
|
# -> return retFuture
|
||||||
outerProcBody.add newNimNode(nnkReturnStmt).add(retFutureSym)
|
outerProcBody.add newNimNode(nnkReturnStmt).add(retFutureSym)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -432,7 +432,6 @@ proc generateHeaders(r: TURL, httpMethod: THttpMethod,
|
||||||
type
|
type
|
||||||
PAsyncHttpClient = ref object
|
PAsyncHttpClient = ref object
|
||||||
socket: PAsyncSocket
|
socket: PAsyncSocket
|
||||||
connected: bool
|
|
||||||
currentURL: TURL ## Where we are currently connected.
|
currentURL: TURL ## Where we are currently connected.
|
||||||
headers: PStringTable
|
headers: PStringTable
|
||||||
userAgent: string
|
userAgent: string
|
||||||
|
|
@ -548,24 +547,16 @@ proc parseResponse(client: PAsyncHttpClient,
|
||||||
else:
|
else:
|
||||||
result.body = ""
|
result.body = ""
|
||||||
|
|
||||||
proc close*(client: PAsyncHttpClient) =
|
|
||||||
## Closes any connections held by the HttpClient.
|
|
||||||
if client.connected:
|
|
||||||
client.socket.close()
|
|
||||||
client.connected = false
|
|
||||||
#client.socket = newAsyncSocket()
|
|
||||||
|
|
||||||
proc newConnection(client: PAsyncHttpClient, url: TURL) {.async.} =
|
proc newConnection(client: PAsyncHttpClient, url: TURL) {.async.} =
|
||||||
if not client.connected or client.currentURL.hostname != url.hostname or
|
if client.currentURL.hostname != url.hostname or
|
||||||
client.currentURL.scheme != url.scheme:
|
client.currentURL.scheme != url.scheme:
|
||||||
if client.connected: client.close()
|
|
||||||
if url.scheme == "https":
|
if url.scheme == "https":
|
||||||
assert false, "TODO SSL"
|
assert false, "TODO SSL"
|
||||||
|
|
||||||
# TODO: I should be able to write 'net.TPort' here...
|
# TODO: I should be able to write 'net.TPort' here...
|
||||||
let port =
|
let port =
|
||||||
if url.port == "": rawsockets.TPort(80)
|
if url.port == "": rawsockets.TPort(80)
|
||||||
else: rawsockets.TPort(url.port.parseInt)
|
else: rawsockets.TPort(url.port.parseInt)
|
||||||
|
|
||||||
await client.socket.connect(url.hostname, port)
|
await client.socket.connect(url.hostname, port)
|
||||||
client.currentURL = url
|
client.currentURL = url
|
||||||
|
|
@ -597,10 +588,10 @@ when isMainModule:
|
||||||
echo("Body:\n")
|
echo("Body:\n")
|
||||||
echo(resp.body)
|
echo(resp.body)
|
||||||
|
|
||||||
#var resp1 = await client.request("http://freenode.net")
|
var resp1 = await client.request("http://picheta.me/aboutme.html")
|
||||||
#echo("Got response: ", resp1.status)
|
echo("Got response: ", resp1.status)
|
||||||
|
|
||||||
var resp2 = await client.request("http://picheta.me/aasfasgf.html")
|
var resp2 = await client.request("http://picheta.me/aboutme.html")
|
||||||
echo("Got response: ", resp2.status)
|
echo("Got response: ", resp2.status)
|
||||||
main()
|
main()
|
||||||
runForever()
|
runForever()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue