changed BufferCreator arguments to match ClientCreator's (with protocol replaced by buffer);

moved binding of protocol,buffer and channel to BufferBase.build_protocol
This commit is contained in:
Denis Bilenko
2008-11-05 17:09:57 +06:00
parent 80d36400aa
commit 35d9abf786
2 changed files with 47 additions and 48 deletions

View File

@@ -11,9 +11,10 @@ from eventlet.twistedutil import block_on
class BaseBuffer(object): class BaseBuffer(object):
def __init__(self, protocol, channel): def build_protocol(self):
self.protocol = protocol self.protocol = self.protocol_class()
self.channel = channel self.channel = self.protocol.channel = channel()
return self.protocol
@property @property
def transport(self): def transport(self):
@@ -44,7 +45,7 @@ class Unbuffered(BaseBuffer):
in a non clean fashion. After that all successive calls return ''. in a non clean fashion. After that all successive calls return ''.
>>> PORT = setup_server_tcp(exit='clean') >>> PORT = setup_server_tcp(exit='clean')
>>> buf = BufferCreator(Unbuffered).connectTCP('127.0.0.1', PORT) >>> buf = BufferCreator(reactor, Unbuffered).connectTCP('127.0.0.1', PORT)
>>> buf.write('hello') >>> buf.write('hello')
>>> buf.recv() >>> buf.recv()
'you said hello. ' 'you said hello. '
@@ -54,7 +55,7 @@ class Unbuffered(BaseBuffer):
'' ''
#>>> PORT = setup_server_tcp(exit='reset') #>>> PORT = setup_server_tcp(exit='reset')
#>>> buf = BufferCreator(Unbuffered).connectTCP('127.0.0.1', PORT) #>>> buf = BufferCreator(reactor, Unbuffered).connectTCP('127.0.0.1', PORT)
#>>> buf.write('hello') #>>> buf.write('hello')
#>>> buf.recv() #>>> buf.recv()
#'you said hello. ' #'you said hello. '
@@ -87,7 +88,7 @@ class Unbuffered(BaseBuffer):
def next(self): def next(self):
""" """
>>> PORT = setup_server_tcp(exit='clean') >>> PORT = setup_server_tcp(exit='clean')
>>> buf = BufferCreator(Unbuffered).connectTCP('127.0.0.1', PORT) >>> buf = BufferCreator(reactor, Unbuffered).connectTCP('127.0.0.1', PORT)
>>> buf.write('hello') >>> buf.write('hello')
>>> for data in buf: >>> for data in buf:
... print `data` ... print `data`
@@ -104,15 +105,14 @@ class Buffer(BaseBuffer):
protocol_class = Protocol protocol_class = Protocol
def __init__(self, *args): def __init__(self):
BaseBuffer.__init__(self, *args)
self.buf = '' self.buf = ''
def read(self, size=-1): def read(self, size=-1):
"""Like file's read(). """Like file's read().
>>> PORT = setup_server_tcp(exit='clean') >>> PORT = setup_server_tcp(exit='clean')
>>> buf = BufferCreator(Buffer).connectTCP('127.0.0.1', PORT) >>> buf = BufferCreator(reactor, Buffer).connectTCP('127.0.0.1', PORT)
>>> buf.write('hello') >>> buf.write('hello')
>>> buf.read(9) >>> buf.read(9)
'you said ' 'you said '
@@ -126,7 +126,7 @@ class Buffer(BaseBuffer):
None None
>>> PORT = setup_server_tcp(exit='clean') >>> PORT = setup_server_tcp(exit='clean')
>>> buf = BufferCreator(Buffer).connectTCP('127.0.0.1', PORT) >>> buf = BufferCreator(reactor, Buffer).connectTCP('127.0.0.1', PORT)
>>> buf.write('world') >>> buf.write('world')
>>> buf.read() >>> buf.read()
'you said world. BYE' 'you said world. BYE'
@@ -134,7 +134,7 @@ class Buffer(BaseBuffer):
'' ''
#>>> PORT = setup_server_tcp(exit='reset') #>>> PORT = setup_server_tcp(exit='reset')
#>>> buf = BufferCreator(Buffer).connectTCP('127.0.0.1', PORT) #>>> buf = BufferCreator(reactor, Buffer).connectTCP('127.0.0.1', PORT)
#>>> buf.write('whoa') #>>> buf.write('whoa')
#>>> buf.read(4) #>>> buf.read(4)
#'you ' #'you '
@@ -170,7 +170,7 @@ class Buffer(BaseBuffer):
"""Like socket's recv(). """Like socket's recv().
>>> PORT = setup_server_tcp(exit='clean') >>> PORT = setup_server_tcp(exit='clean')
>>> buf = BufferCreator(Buffer).connectTCP('127.0.0.1', PORT) >>> buf = BufferCreator(reactor, Buffer).connectTCP('127.0.0.1', PORT)
>>> buf.write('hello') >>> buf.write('hello')
>>> buf.recv() >>> buf.recv()
'you said hello. ' 'you said hello. '
@@ -182,7 +182,7 @@ class Buffer(BaseBuffer):
'' ''
>>> PORT = setup_server_tcp(exit='clean') >>> PORT = setup_server_tcp(exit='clean')
>>> buf = BufferCreator(Buffer).connectTCP('127.0.0.1', PORT) >>> buf = BufferCreator(reactor, Buffer).connectTCP('127.0.0.1', PORT)
>>> buf.write('whoa') >>> buf.write('whoa')
>>> buf.recv(9) >>> buf.recv(9)
'you said ' 'you said '
@@ -194,7 +194,7 @@ class Buffer(BaseBuffer):
'' ''
#>>> PORT = setup_server_tcp(exit='reset') #>>> PORT = setup_server_tcp(exit='reset')
#>>> buf = BufferCreator(Buffer).connectTCP('127.0.0.1', PORT) #>>> buf = BufferCreator(reactor, Buffer).connectTCP('127.0.0.1', PORT)
#>>> buf.write('whoa') #>>> buf.write('whoa')
#>>> buf.recv() #>>> buf.recv()
#'you said whoa. ' #'you said whoa. '
@@ -233,7 +233,7 @@ class Buffer(BaseBuffer):
def next(self): def next(self):
""" """
>>> PORT = setup_server_tcp(exit='clean') >>> PORT = setup_server_tcp(exit='clean')
>>> buf = BufferCreator(Buffer).connectTCP('127.0.0.1', PORT) >>> buf = BufferCreator(reactor, Buffer).connectTCP('127.0.0.1', PORT)
>>> buf.write('hello') >>> buf.write('hello')
>>> for data in buf: >>> for data in buf:
... print `data` ... print `data`
@@ -246,66 +246,63 @@ class Buffer(BaseBuffer):
return res return res
def connectXXX(reactor, connect_func, protocol_instance, address_args, *args, **kwargs): def sync_connect(reactor, connect_func, protocol_instance, address_args, *args, **kwargs):
d = defer.Deferred() d = defer.Deferred()
f = _InstanceFactory(reactor, protocol_instance, d) f = _InstanceFactory(reactor, protocol_instance, d)
connect_func(*(address_args + (f,) + args), **kwargs) connect_func(*(address_args + (f,) + args), **kwargs)
protocol = block_on(d) protocol = block_on(d)
chan = protocol.channel = channel()
return (protocol, chan)
class BufferCreator(object): class BufferCreator(object):
buffer_class = Buffer buffer_class = Buffer
def __init__(self, buffer_class=None, reactor=None, protocol_args=None, protocol_kwargs=None): def __init__(self, reactor, buffer_class=None, *args, **kwargs):
if reactor is None:
from twisted.internet import reactor
self.reactor = reactor self.reactor = reactor
if buffer_class is not None: if buffer_class is not None:
self.buffer_class = buffer_class self.buffer_class = buffer_class
self.protocol_args = protocol_args or () self.args = args
self.protocol_kwargs = protocol_kwargs or {} self.kwargs = kwargs
def connectTCP(self, host, port, *args, **kwargs): def connectTCP(self, host, port, *args, **kwargs):
protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) buffer = self.buffer_class(*self.args, **self.kwargs)
protocol, chan = connectXXX(self.reactor, self.reactor.connectTCP, protocol = buffer.build_protocol()
protocol, (host, port), *args, **kwargs) sync_connect(self.reactor, self.reactor.connectTCP, protocol, (host, port), *args, **kwargs)
return self.buffer_class(protocol, chan) return buffer
def connectSSL(self, host, port, *args, **kwargs): def connectSSL(self, host, port, *args, **kwargs):
protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) buffer = self.buffer_class(*self.args, **self.kwargs)
protocol, chan = connectXXX(self.reactor, self.reactor.connectSSL, protocol = buffer.build_protocol()
protocol, (host, port), *args, **kwargs) sync_connect(self.reactor, self.reactor.connectSSL, protocol, (host, port), *args, **kwargs)
return self.buffer_class(protocol, chan) return buffer
def connectTLS(self, host, port, *args, **kwargs): def connectTLS(self, host, port, *args, **kwargs):
protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) buffer = self.buffer_class(*self.args, **self.kwargs)
protocol, chan = connectXXX(self.reactor, self.reactor.connectTLS, protocol = buffer.build_protocol()
protocol, (host, port), *args, **kwargs) sync_connect(self.reactor, self.reactor.connectTLS, protocol, (host, port), *args, **kwargs)
return self.buffer_class(protocol, chan) return buffer
def connectUNIX(self, address, *args, **kwargs): def connectUNIX(self, address, *args, **kwargs):
protocol = self.buffer_class.protocol_class(*self.protocol_args, **self.protocol_kwargs) buffer = self.buffer_class(*self.args, **self.kwargs)
protocol, chan = connectXXX(self.reactor, self.reactor.connectTCP, protocol = buffer.build_protocol()
protocol, (address, ), *args, **kwargs) sync_connect(self.reactor, self.reactor.connectUNIX, protocol, (address,), *args, **kwargs)
return self.buffer_class(protocol, chan) return buffer
class SpawnFactory(Factory): class SpawnFactory(Factory):
buffer_class = Buffer buffer_class = Buffer
def __init__(self, handler, buffer_class=None): def __init__(self, handler, buffer_class=None, *args, **kwargs):
self.handler = handler self.handler = handler
if buffer_class is not None: if buffer_class is not None:
self.buffer_class = buffer_class self.buffer_class = buffer_class
self.protocol = self.buffer_class.protocol_class self.args = args
self.kwargs = kwargs
def buildProtocol(self, addr): def buildProtocol(self, addr):
protocol = self.protocol() buffer = self.buffer_class(*self.args, **self.kwargs)
chan = protocol.channel = channel() protocol = buffer.build_protocol()
protocol.factory = self protocol.factory = self
spawn(self.handler, self.buffer_class(protocol, chan)) spawn(self.handler, buffer)
return protocol return protocol

View File

@@ -1,8 +1,10 @@
from eventlet.twistedutil.protocol import BufferCreator from eventlet.twistedutil.protocol import BufferCreator
from eventlet.twistedutil.protocols.basic import LineOnlyReceiverBuffer from eventlet.twistedutil.protocols.basic import LineOnlyReceiverBuffer
conn = BufferCreator(LineOnlyReceiverBuffer).connectTCP('www.google.com', 80) from twisted.internet import reactor
conn.write('GET / HTTP/1.0\r\n\r\n')
for line in conn: # read from TCP connection using default Buffer
print line conn = BufferCreator(reactor).connectTCP('www.google.com', 80)
conn.write('GET / HTTP/1.0\r\n\r\n')
print conn.read()