added twistedutil.protocol.BufferCreator (synchronous version of twisted.protocol.ClientCreator)

This commit is contained in:
Denis Bilenko
2008-11-05 00:05:32 +06:00
parent 95adcf6412
commit 784cf3f325
2 changed files with 51 additions and 36 deletions

View File

@@ -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):
@@ -275,6 +245,51 @@ 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

View File

@@ -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