@@ -1717,3 +1717,103 @@ def socket_handler(listener):
1717
1717
timeout = (10 , 0.5 ))
1718
1718
1719
1719
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