diff options
Diffstat (limited to 'lib/pure/httpclient.nim')
-rw-r--r-- | lib/pure/httpclient.nim | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 84f66b6dc..4d8400af6 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -131,7 +131,7 @@ type version*: string status*: string headers*: HttpHeaders - body: string # TODO: here for compatibility with old httpclient procs. + body: string bodyStream*: Stream AsyncResponse* = ref object @@ -163,19 +163,6 @@ proc `body=`*(response: Response, value: string) {.deprecated.} = ## **This is deprecated and should not be used**. response.body = value -proc readAll*(future: FutureStream[string]): Future[string] {.async.} = - ## Returns a future that will complete when all the string data from the - ## specified future stream is retrieved. - - # TODO: Move this to asyncfutures. - result = "" - while true: - let (hasValue, value) = await future.take() - if hasValue: - result.add(value) - else: - break - proc body*(response: AsyncResponse): Future[string] {.async.} = ## Reads the response's body and caches it. The read is performed only ## once. @@ -650,7 +637,7 @@ proc post*(url: string, extraHeaders = "", body = "", ## **Deprecated since version 0.15.0**: use ``HttpClient.post`` instead. let (mpHeaders, mpBody) = format(multipart) - template withNewLine(x): expr = + template withNewLine(x): untyped = if x.len > 0 and not x.endsWith("\c\L"): x & "\c\L" else: @@ -891,10 +878,7 @@ proc recvFull(client: HttpClient | AsyncHttpClient, size: int, timeout: int, readLen.inc(data.len) if keep: - when client.socket is Socket: - client.bodyStream.write(data) - else: - await client.bodyStream.put(data) + await client.bodyStream.write(data) await reportProgress(client, data.len) @@ -1253,11 +1237,15 @@ proc downloadFile*(client: HttpClient | AsyncHttpClient, parseBody(client, resp.headers, resp.version) client.bodyStream.close() else: - client.bodyStream = newFutureStream[string]() - var f = openAsync(filename, fmWrite) + client.bodyStream = newFutureStream[string]("downloadFile") + var file = openAsync(filename, fmWrite) + # Let `parseBody` write response data into client.bodyStream in the + # background. asyncCheck parseBody(client, resp.headers, resp.version) - await f.setWriteStream(client.bodyStream) - f.close() + # The `writeFromStream` proc will complete once all the data in the + # `bodyStream` has been written to the file. + await file.writeFromStream(client.bodyStream) + file.close() if resp.code.is4xx or resp.code.is5xx: raise newException(HttpRequestError, resp.status) |