Skip to content

Commit d5e4d6a

Browse files
committed
Clarify issue #253 in the code, add tests
1 parent 06f07d2 commit d5e4d6a

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

aiohttp/connector.py

+4
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,10 @@ def _release(self, key, req, transport, protocol, *, should_close=False):
201201
if should_close or (reader.output and not reader.output.at_eof()):
202202
conns = self._conns.get(key)
203203
if conns is not None and len(conns) == 0:
204+
# Issue #253: An empty array will eventually be
205+
# removed by cleanup, but it's better to pop straight
206+
# away, because cleanup might not get called (e.g. if
207+
# keepalive is False).
204208
self._conns.pop(key, None)
205209
transport.close()
206210
else:

tests/test_connector.py

+34
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,40 @@ def test_release_close(self):
184184
self.assertFalse(conn._conns)
185185
self.assertTrue(tr.close.called)
186186

187+
def test_release_dont_clean_conns(self):
188+
# see issue #253
189+
conn = aiohttp.BaseConnector(loop=self.loop)
190+
req = unittest.mock.Mock()
191+
resp = unittest.mock.Mock()
192+
resp.message.should_close = True
193+
req.response = resp
194+
195+
key = ('127.0.0.1', 80, False)
196+
197+
tr, proto = unittest.mock.Mock(), unittest.mock.Mock()
198+
conn._conns[key] = [(tr, proto, 123)]
199+
200+
conn._release(key, req, tr, proto)
201+
self.assertEqual({key: [(tr, proto, 123)]}, conn._conns)
202+
self.assertTrue(tr.close.called)
203+
204+
def test_release_pop_empty_conns(self):
205+
# see issue #253
206+
conn = aiohttp.BaseConnector(loop=self.loop)
207+
req = unittest.mock.Mock()
208+
resp = unittest.mock.Mock()
209+
resp.message.should_close = True
210+
req.response = resp
211+
212+
key = ('127.0.0.1', 80, False)
213+
214+
conn._conns[key] = []
215+
216+
tr, proto = unittest.mock.Mock(), unittest.mock.Mock()
217+
conn._release(key, req, tr, proto)
218+
self.assertEqual({}, conn._conns)
219+
self.assertTrue(tr.close.called)
220+
187221
def test_release_close_do_not_delete_existing_connections(self):
188222
key = 1
189223
tr1, proto1 = unittest.mock.Mock(), unittest.mock.Mock()

0 commit comments

Comments
 (0)