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>
This commit is contained in:
parent
bebfbaa439
commit
2d0cb18b9f
2 changed files with 12 additions and 4 deletions
|
|
@ -832,14 +832,16 @@ proc parseResponse(client: HttpClient | AsyncHttpClient,
|
||||||
if not fullyRead:
|
if not fullyRead:
|
||||||
httpError("Connection was closed before full request has been made")
|
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:
|
if getBody and result.code != Http204:
|
||||||
|
client.bodyStream = result.bodyStream
|
||||||
when client is HttpClient:
|
when client is HttpClient:
|
||||||
client.bodyStream = newStringStream()
|
|
||||||
result.bodyStream = client.bodyStream
|
|
||||||
parseBody(client, result.headers, result.version)
|
parseBody(client, result.headers, result.version)
|
||||||
else:
|
else:
|
||||||
client.bodyStream = newFutureStream[string]("parseResponse")
|
|
||||||
result.bodyStream = client.bodyStream
|
|
||||||
assert(client.parseBodyFut.isNil or client.parseBodyFut.finished)
|
assert(client.parseBodyFut.isNil or client.parseBodyFut.finished)
|
||||||
# do not wait here for the body request to complete
|
# do not wait here for the body request to complete
|
||||||
client.parseBodyFut = parseBody(client, result.headers, result.version)
|
client.parseBodyFut = parseBody(client, result.headers, result.version)
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,12 @@ proc syncTest() =
|
||||||
|
|
||||||
client.close()
|
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:
|
when false:
|
||||||
# Disabled for now because it causes troubles with AppVeyor
|
# Disabled for now because it causes troubles with AppVeyor
|
||||||
# Timeout test.
|
# Timeout test.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue