Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Commit 669253f

Browse files
KostyaEsmukovLukasa
authored andcommitted
HTTP20Adapter.close tests (supersedes #307) (#344)
* Implement HTTP20Adapter.close to close connections * Make requests adapter close() tests integrational * Ensure that connections are actually closed on closing requests adapter * Split an assertion in requests adapter close() tests
1 parent 75f25f7 commit 669253f

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

hyper/contrib.py

+5
Original file line numberDiff line numberDiff line change
@@ -196,3 +196,8 @@ def getheaders(self, name):
196196
orig.msg = FakeOriginalResponse(resp.headers.iter_raw())
197197

198198
return response
199+
200+
def close(self):
201+
for connection in self.connections.values():
202+
connection.close()
203+
self.connections.clear()

test/test_integration.py

+100
Original file line numberDiff line numberDiff line change
@@ -1717,3 +1717,103 @@ def socket_handler(listener):
17171717
timeout=(10, 0.5))
17181718

17191719
self.tear_down()
1720+
1721+
def test_adapter_close(self):
1722+
self.set_up(secure=False)
1723+
1724+
def socket_handler(listener):
1725+
sock = listener.accept()[0]
1726+
1727+
# We should get the initial request.
1728+
data = b''
1729+
while not data.endswith(b'\r\n\r\n'):
1730+
data += sock.recv(65535)
1731+
1732+
# We need to send back a response.
1733+
resp = (
1734+
b'HTTP/1.1 201 No Content\r\n'
1735+
b'Server: socket-level-server\r\n'
1736+
b'Content-Length: 0\r\n'
1737+
b'Connection: close\r\n'
1738+
b'\r\n'
1739+
)
1740+
sock.send(resp)
1741+
sock.close()
1742+
1743+
self._start_server(socket_handler)
1744+
1745+
a = HTTP20Adapter()
1746+
s = requests.Session()
1747+
s.mount('http://', a)
1748+
r = s.get('http://%s:%s' % (self.host, self.port))
1749+
connections_before_close = list(a.connections.values())
1750+
1751+
# ensure that we have at least 1 connection
1752+
assert connections_before_close
1753+
1754+
s.close()
1755+
1756+
# check that connections cache is empty
1757+
assert not a.connections
1758+
1759+
# check that all connections are actually closed
1760+
assert all(conn._sock is None for conn in connections_before_close)
1761+
1762+
assert r.status_code == 201
1763+
assert len(r.headers) == 3
1764+
assert r.headers['server'] == 'socket-level-server'
1765+
assert r.headers['content-length'] == '0'
1766+
assert r.headers['connection'] == 'close'
1767+
1768+
assert r.content == b''
1769+
1770+
self.tear_down()
1771+
1772+
def test_adapter_close_context_manager(self):
1773+
self.set_up(secure=False)
1774+
1775+
def socket_handler(listener):
1776+
sock = listener.accept()[0]
1777+
1778+
# We should get the initial request.
1779+
data = b''
1780+
while not data.endswith(b'\r\n\r\n'):
1781+
data += sock.recv(65535)
1782+
1783+
# We need to send back a response.
1784+
resp = (
1785+
b'HTTP/1.1 201 No Content\r\n'
1786+
b'Server: socket-level-server\r\n'
1787+
b'Content-Length: 0\r\n'
1788+
b'Connection: close\r\n'
1789+
b'\r\n'
1790+
)
1791+
sock.send(resp)
1792+
sock.close()
1793+
1794+
self._start_server(socket_handler)
1795+
1796+
with requests.Session() as s:
1797+
a = HTTP20Adapter()
1798+
s.mount('http://', a)
1799+
r = s.get('http://%s:%s' % (self.host, self.port))
1800+
connections_before_close = list(a.connections.values())
1801+
1802+
# ensure that we have at least 1 connection
1803+
assert connections_before_close
1804+
1805+
# check that connections cache is empty
1806+
assert not a.connections
1807+
1808+
# check that all connections are actually closed
1809+
assert all(conn._sock is None for conn in connections_before_close)
1810+
1811+
assert r.status_code == 201
1812+
assert len(r.headers) == 3
1813+
assert r.headers['server'] == 'socket-level-server'
1814+
assert r.headers['content-length'] == '0'
1815+
assert r.headers['connection'] == 'close'
1816+
1817+
assert r.content == b''
1818+
1819+
self.tear_down()

0 commit comments

Comments
 (0)