def close(self):
"""
close all http connections.
returns a deferred that fires once they're all closed.
"""
def validate_client(client):
"""
Validate that the connection is for the current client
:param client:
:return:
"""
host, port = client.addr
parsed_url = urlparse(self._hostname)
return host == parsed_url.hostname and port == parsed_url.port
# read https://github.com/twisted/treq/issues/86
# to understand the following...
def _check_fds(_):
fds = set(reactor.getReaders() + reactor.getReaders())
if not [fd for fd in fds if isinstance(fd, Client) and validate_client(fd)]:
return
return deferLater(reactor, 0, _check_fds, None)
pool = self._async_http_client_params["pool"]
return pool.closeCachedConnections().addBoth(_check_fds)
python类getReaders()的实例源码
def test_pauseProducingInConnectionMade(self):
"""
In C{connectionMade} of a client protocol, C{pauseProducing} used to be
ignored: this test is here to ensure it's not ignored.
"""
server = MyServerFactory()
client = MyClientFactory()
client.protocolConnectionMade = defer.Deferred()
port = reactor.listenTCP(0, server, interface='127.0.0.1')
self.addCleanup(port.stopListening)
connector = reactor.connectTCP(
port.getHost().host, port.getHost().port, client)
self.addCleanup(connector.disconnect)
def checkInConnectionMade(proto):
tr = proto.transport
# The transport should already be monitored
self.assertIn(tr, reactor.getReaders() +
reactor.getWriters())
proto.transport.pauseProducing()
self.assertNotIn(tr, reactor.getReaders() +
reactor.getWriters())
d = defer.Deferred()
d.addCallback(checkAfterConnectionMade)
reactor.callLater(0, d.callback, proto)
return d
def checkAfterConnectionMade(proto):
tr = proto.transport
# The transport should still not be monitored
self.assertNotIn(tr, reactor.getReaders() +
reactor.getWriters())
client.protocolConnectionMade.addCallback(checkInConnectionMade)
return client.protocolConnectionMade