mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-06 20:04:18 +00:00
AsyncHttpClient: return from requests before body completion
Store the body completion future at the client and wait for it to complete before issuing additional requests. This allows the body FutureStream reader to drain the stream and read buffers to be freed asynchronously. Fix #8109
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user