Merge pull request #5373 from nim-lang/feature/async-streams

Async streams and HTTP client streaming downloads support
This commit is contained in:
Andreas Rumpf 2017-02-26 17:35:08 +01:00 • committed by GitHub
commit e5341a391d
11 changed files with 387 additions and 94 deletions

View file

@ -0,0 +1,53 @@
discard """
file: "tfuturestream.nim"
exitcode: 0
output: '''
0
1
2
3
4
5
Done
Finished
'''
"""
import asyncdispatch
var fs = newFutureStream[int]()
proc alpha() {.async.} =
for i in 0 .. 5:
await sleepAsync(1000)
await fs.write(i)
echo("Done")
fs.complete()
proc beta() {.async.} =
while not fs.finished:
let (hasValue, value) = await fs.read()
if hasValue:
echo(value)
echo("Finished")
asyncCheck alpha()
waitFor beta()
# TODO: Something like this should work eventually.
# proc delta(): FutureStream[string] {.async.} =
# for i in 0 .. 5:
# await sleepAsync(1000)
# result.put($i)
# return ""
# proc omega() {.async.} =
# let fut = delta()
# while not fut.finished():
# echo(await fs.takeAsync())
# echo("Finished")
# waitFor omega()

View file

@ -13,7 +13,9 @@ proc asyncTest() {.async.} =
var client = newAsyncHttpClient()
var resp = await client.request("http://example.com/")
doAssert(resp.code.is2xx)
doAssert("<title>Example Domain</title>" in resp.body)
var body = await resp.body
body = await resp.body # Test caching
doAssert("<title>Example Domain</title>" in body)
resp = await client.request("http://example.com/404")
doAssert(resp.code.is4xx)
@ -47,7 +49,8 @@ proc asyncTest() {.async.} =
echo("Downloaded ", progress, " of ", total)
echo("Current rate: ", speed div 1000, "kb/s")
client.onProgressChanged = onProgressChanged
discard await client.getContent("http://speedtest-ams2.digitalocean.com/100mb.test")
await client.downloadFile("http://speedtest-ams2.digitalocean.com/100mb.test",
"100mb.test")
client.close()
@ -94,7 +97,8 @@ proc syncTest() =
echo("Downloaded ", progress, " of ", total)
echo("Current rate: ", speed div 1000, "kb/s")
client.onProgressChanged = onProgressChanged
discard client.getContent("http://speedtest-ams2.digitalocean.com/100mb.test")
client.downloadFile("http://speedtest-ams2.digitalocean.com/100mb.test",
"100mb.test")
client.close()