| 345 | return None, None |
| 346 | |
| 347 | def _release(self, key, req, transport, protocol, *, should_close=False): |
| 348 | if self._closed: |
| 349 | # acquired connection is already released on connector closing |
| 350 | return |
| 351 | |
| 352 | acquired = self._acquired[key] |
| 353 | try: |
| 354 | acquired.remove(transport) |
| 355 | except KeyError: # pragma: no cover |
| 356 | # this may be result of undetermenistic order of objects |
| 357 | # finalization due garbage collection. |
| 358 | pass |
| 359 | else: |
| 360 | if self._limit is not None and len(acquired) < self._limit: |
| 361 | waiters = self._waiters[key] |
| 362 | while waiters: |
| 363 | waiter = waiters.pop(0) |
| 364 | if not waiter.done(): |
| 365 | waiter.set_result(None) |
| 366 | break |
| 367 | |
| 368 | resp = req.response |
| 369 | |
| 370 | if not should_close: |
| 371 | if self._force_close: |
| 372 | should_close = True |
| 373 | elif resp is not None: |
| 374 | should_close = resp._should_close |
| 375 | |
| 376 | reader = protocol.reader |
| 377 | if should_close or (reader.output and not reader.output.at_eof()): |
| 378 | transport.close() |
| 379 | else: |
| 380 | conns = self._conns.get(key) |
| 381 | if conns is None: |
| 382 | conns = self._conns[key] = [] |
| 383 | conns.append((transport, protocol, self._loop.time())) |
| 384 | reader.unset_parser() |
| 385 | |
| 386 | self._start_cleanup_task() |
| 387 | |
| 388 | @asyncio.coroutine |
| 389 | def _create_connection(self, req): |