@@ -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+
972982proc 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