diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2018-08-08 12:27:20 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-08 12:27:20 +0100 |
commit | af4f4425e2d461f7b2b6ec88cf60816f671fa435 (patch) | |
tree | e3f06d202121063020b4be53305fee854b000997 | |
parent | a45faf2dd60f6474aa01b7cddd35d09ce329d6ce (diff) | |
parent | 817e4bb2fe0538a60f169d37e254b30e3dc3ab1d (diff) | |
download | Nim-af4f4425e2d461f7b2b6ec88cf60816f671fa435.tar.gz |
Merge pull request #8559 from ehmry/fix_8109
AsyncHttpClient: return from requests before body completion
-rw-r--r-- | lib/pure/httpclient.nim | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 8b4fb0f8c..72de72718 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -807,6 +807,7 @@ type lastProgressReport: float when SocketType is AsyncSocket: bodyStream: FutureStream[string] + parseBodyFut: Future[void] else: bodyStream: Stream getBody: bool ## When `false`, the body is never read in requestAux. @@ -1066,10 +1067,14 @@ proc parseResponse(client: HttpClient | AsyncHttpClient, if getBody: when client is HttpClient: client.bodyStream = newStringStream() + result.bodyStream = client.bodyStream + parseBody(client, result.headers, result.version) else: client.bodyStream = newFutureStream[string]("parseResponse") - await parseBody(client, result.headers, result.version) - result.bodyStream = client.bodyStream + result.bodyStream = client.bodyStream + assert(client.parseBodyFut.isNil or client.parseBodyFut.finished) + client.parseBodyFut = parseBody(client, result.headers, result.version) + # do not wait here for the body request to complete proc newConnection(client: HttpClient | AsyncHttpClient, url: Uri) {.multisync.} = @@ -1159,6 +1164,12 @@ proc requestAux(client: HttpClient | AsyncHttpClient, url: string, # Helper that actually makes the request. Does not handle redirects. let requestUrl = parseUri(url) + when client is AsyncHttpClient: + if not client.parseBodyFut.isNil: + # let the current operation finish before making another request + await client.parseBodyFut + client.parseBodyFut = nil + await newConnection(client, requestUrl) let effectiveHeaders = client.headers.override(headers) |