diff options
author | Daehee <hello@daehee.com> | 2021-01-22 07:04:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-22 15:04:52 +0100 |
commit | 2d0cb18b9f092fad54abefed475218ae92fc846c (patch) | |
tree | 1b6fadeff534eaab8a41cf429520ef50609c07d4 | |
parent | bebfbaa439194a15a9630d0e86ed677dde27c372 (diff) | |
download | Nim-2d0cb18b9f092fad54abefed475218ae92fc846c.tar.gz |
Fix SIGSEGV in httpclient response body (#16766)
* initialize httpclient response bodyStream; prevent SIGSEGV when getBody is false * Update lib/pure/httpclient.nim * Update lib/pure/httpclient.nim Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
-rw-r--r-- | lib/pure/httpclient.nim | 10 | ||||
-rw-r--r-- | tests/stdlib/thttpclient.nim | 6 |
2 files changed, 12 insertions, 4 deletions
diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index bcd10803e..0ca3ca97b 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -832,14 +832,16 @@ proc parseResponse(client: HttpClient | AsyncHttpClient, if not fullyRead: httpError("Connection was closed before full request has been made") + when client is HttpClient: + result.bodyStream = newStringStream() + else: + result.bodyStream = newFutureStream[string]("parseResponse") + if getBody and result.code != Http204: + client.bodyStream = result.bodyStream when client is HttpClient: - client.bodyStream = newStringStream() - result.bodyStream = client.bodyStream parseBody(client, result.headers, result.version) else: - client.bodyStream = newFutureStream[string]("parseResponse") - result.bodyStream = client.bodyStream assert(client.parseBodyFut.isNil or client.parseBodyFut.finished) # do not wait here for the body request to complete client.parseBodyFut = parseBody(client, result.headers, result.version) diff --git a/tests/stdlib/thttpclient.nim b/tests/stdlib/thttpclient.nim index 0cef10e6d..e81590d95 100644 --- a/tests/stdlib/thttpclient.nim +++ b/tests/stdlib/thttpclient.nim @@ -148,6 +148,12 @@ proc syncTest() = client.close() + # SIGSEGV on HEAD body read: issue #16743 + block: + let client = newHttpClient() + let resp = client.head("http://httpbin.org/head") + doAssert(resp.body == "") + when false: # Disabled for now because it causes troubles with AppVeyor # Timeout test. |