Refactored createCb in asyncdispatch.

This commit is contained in:
Dominik Picheta 2014-04-02 21:28:45 +01:00
commit e4e87f1cb2
2 changed files with 14 additions and 35 deletions

View file

@ -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)

View file

@ -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()