@@ -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