From 784cf3f3254d34cc4c9bd93a199056b281f28d4c Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Wed, 5 Nov 2008 00:05:32 +0600 Subject: [PATCH] added twistedutil.protocol.BufferCreator (synchronous version of twisted.protocol.ClientCreator) --- eventlet/twistedutil/protocol.py | 83 +++++++++++++++++++------------- examples/twisted_basic_client.py | 4 +- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/eventlet/twistedutil/protocol.py b/eventlet/twistedutil/protocol.py index 5a01134..389a85d 100644 --- a/eventlet/twistedutil/protocol.py +++ b/eventlet/twistedutil/protocol.py @@ -9,36 +9,6 @@ from eventlet.channel import channel from eventlet.twistedutil import block_on -def connectTCP(*args, **kwargs): - from twisted.internet import reactor - buffer_class = kwargs.pop('buffer_class', DEFAULT_BUFFER) - cc = ClientCreator(reactor, buffer_class.protocol_class) - protocol = block_on(cc.connectTCP(*args, **kwargs)) - chan = protocol.channel = channel() - return buffer_class(protocol, chan) - -def connectSSL(*args, **kwargs): - from twisted.internet import reactor - buffer_class = kwargs.pop('buffer_class', DEFAULT_BUFFER) - cc = ClientCreator(reactor, buffer_class.protocol_class) - protocol = block_on(cc.connectSSL(*args, **kwargs)) - chan = protocol.channel = channel() - return buffer_class(protocol, chan) - -def _connectTLS(protocol, host, port, *args, **kwargs): - from twisted.internet import reactor - d = defer.Deferred() - f = _InstanceFactory(reactor, protocol, d) - reactor.connectTLS(host, port, f, *args, **kwargs) - return d - -def connectTLS(host, port, *args, **kwargs): - buffer_class = kwargs.pop('buffer_class', DEFAULT_BUFFER) - protocol = block_on(_connectTLS(buffer_class.protocol_class(), host, port, *args, **kwargs)) - chan = protocol.channel = channel() - return buffer_class(protocol, chan) - - class BaseBuffer(object): def __init__(self, protocol, channel): @@ -108,7 +78,7 @@ class Unbuffered(BaseBuffer): except Exception: self.channel = None raise - + # iterator protocol: def __iter__(self): @@ -130,7 +100,7 @@ class Unbuffered(BaseBuffer): class Buffer(BaseBuffer): - + protocol_class = Protocol def __init__(self, *args): @@ -153,7 +123,7 @@ class Buffer(BaseBuffer): '' >>> print buf.channel None - + >>> PORT = setup_server_tcp(exit='clean') >>> buf = connectTCP('127.0.0.1', PORT) >>> buf.write('world') @@ -275,8 +245,53 @@ class Buffer(BaseBuffer): DEFAULT_BUFFER = Buffer +def connectXXX(reactor, connect_func, protocol_instance, address_args, *args, **kwargs): + d = defer.Deferred() + f = _InstanceFactory(reactor, protocol_instance, d) + connect_func(*(address_args + (f,) + args), **kwargs) + protocol = block_on(d) + chan = protocol.channel = channel() + return (protocol, chan) + +class BufferCreator(object): + + buffer_class = DEFAULT_BUFFER + + def __init__(self, buffer_class=None, reactor=None, protocol_args=None, protocol_kwargs=None): + if reactor is None: + from twisted.internet import reactor + self.reactor = reactor + if buffer_class is not None: + self.buffer_class = buffer_class + self.protocol_args = protocol_args or () + self.protocol_kwargs = protocol_kwargs or {} + + def connectTCP(self, host, port, *args, **kwargs): + protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) + protocol, chan = connectXXX(self.reactor, self.reactor.connectTCP, + protocol, (host, port), *args, **kwargs) + return self.buffer_class(protocol, chan) + + def connectSSL(self, host, port, *args, **kwargs): + protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) + protocol, chan = connectXXX(self.reactor, self.reactor.connectSSL, + protocol, (host, port), *args, **kwargs) + return self.buffer_class(protocol, chan) + + def connectTLS(self, host, port, *args, **kwargs): + protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) + protocol, chan = connectXXX(self.reactor, self.reactor.connectTLS, + protocol, (host, port), *args, **kwargs) + return self.buffer_class(protocol, chan) + + def connectUNIX(self, address, *args, **kwargs): + protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) + protocol, chan = connectXXX(self.reactor, self.reactor.connectTCP, + protocol, (address, ), *args, **kwargs) + return self.buffer_class(protocol, chan) + class SpawnFactory(Factory): - + buffer_class = DEFAULT_BUFFER def __init__(self, handler, buffer_class=None): diff --git a/examples/twisted_basic_client.py b/examples/twisted_basic_client.py index a619063..2ef51d7 100644 --- a/examples/twisted_basic_client.py +++ b/examples/twisted_basic_client.py @@ -1,7 +1,7 @@ -from eventlet.twistedutil.protocol import connectTCP +from eventlet.twistedutil.protocol import BufferCreator from eventlet.twistedutil.protocols.basic import LineOnlyReceiverBuffer -conn = connectTCP('www.google.com', 80, buffer_class=LineOnlyReceiverBuffer) +conn = BufferCreator(LineOnlyReceiverBuffer).connectTCP('www.google.com', 80) conn.write('GET / HTTP/1.0\r\n\r\n') for line in conn: print line