Skip to content

Commit ac67f5e

Browse files
committed
Fixes req w/ both Content-Length & Connection: close headers.
Also closes the socket when connection is closed to ensure that a new connection is made on any further requests.
1 parent 1dc6cae commit ac67f5e

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

lib/pure/httpclient.nim

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,9 @@ proc recvFull(client: HttpClient | AsyncHttpClient, size: int, timeout: int,
883883
let data = client.socket.recv(sizeToRecv, timeout)
884884
else:
885885
let data = await client.socket.recv(sizeToRecv)
886-
if data == "": break # We've been disconnected.
886+
if data == "":
887+
client.close()
888+
break # We've been disconnected.
887889

888890
readLen.inc(data.len)
889891
if keep:
@@ -950,6 +952,7 @@ proc parseBody(client: HttpClient | AsyncHttpClient,
950952
if length > 0:
951953
let recvLen = await client.recvFull(length, client.timeout, true)
952954
if recvLen == 0:
955+
client.close()
953956
httpError("Got disconnected while trying to read body.")
954957
if recvLen != length:
955958
httpError("Received length doesn't match expected length. Wanted " &
@@ -962,13 +965,20 @@ proc parseBody(client: HttpClient | AsyncHttpClient,
962965
if headers.getOrDefault"Connection" == "close" or httpVersion == "1.0":
963966
while true:
964967
let recvLen = await client.recvFull(4000, client.timeout, true)
965-
if recvLen == 0: break
968+
if recvLen == 0:
969+
client.close()
970+
break
966971

967972
when client is AsyncHttpClient:
968973
client.bodyStream.complete()
969974
else:
970975
client.bodyStream.setPosition(0)
971976

977+
# If the server will close our connection, then no matter the method of
978+
# reading the body, we need to close our socket.
979+
if headers.getOrDefault"Connection" == "close":
980+
client.close()
981+
972982
proc parseResponse(client: HttpClient | AsyncHttpClient,
973983
getBody: bool): Future[Response | AsyncResponse]
974984
{.multisync.} =
@@ -984,7 +994,10 @@ proc parseResponse(client: HttpClient | AsyncHttpClient,
984994
line = await client.socket.recvLine(client.timeout)
985995
else:
986996
line = await client.socket.recvLine()
987-
if line == "": break # We've been disconnected.
997+
if line == "":
998+
# We've been disconnected.
999+
client.close()
1000+
break
9881001
if line == "\c\L":
9891002
fullyRead = true
9901003
break
@@ -1033,7 +1046,8 @@ proc newConnection(client: HttpClient | AsyncHttpClient,
10331046
url: Uri) {.multisync.} =
10341047
if client.currentURL.hostname != url.hostname or
10351048
client.currentURL.scheme != url.scheme or
1036-
client.currentURL.port != url.port:
1049+
client.currentURL.port != url.port or
1050+
(not client.connected):
10371051
let isSsl = url.scheme.toLowerAscii() == "https"
10381052

10391053
if isSsl and not defined(ssl):

0 commit comments

Comments
 (0)