From 597a2c09147bd2f1d2f9960e171425d23eb248dc Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Tue, 4 Nov 2008 23:31:54 +0600 Subject: [PATCH] renamed twistedutil/basic.py to twistedutil/protocol.py; removed listenXXX shortcuts: use reactor.listenXXX+SpawnFactory; added buffer_class class attribute to SpawnFactory; twistedutil: converted class names to CamelCase; moved LineOnlyReceiverBuffer to twistedutil.protocols.basic; fixed the examples. --- .../twistedutil/{basic.py => protocol.py} | 86 +++++-------------- eventlet/twistedutil/protocols/__init__.py | 0 eventlet/twistedutil/protocols/basic.py | 34 ++++++++ eventlet/twistedutil/util.py | 33 ------- examples/twisted_basic_client.py | 5 +- examples/twisted_basic_server.py | 7 +- examples/twisted_xcap_proxy.py | 4 +- 7 files changed, 64 insertions(+), 105 deletions(-) rename eventlet/twistedutil/{basic.py => protocol.py} (83%) create mode 100644 eventlet/twistedutil/protocols/__init__.py create mode 100644 eventlet/twistedutil/protocols/basic.py delete mode 100644 eventlet/twistedutil/util.py diff --git a/eventlet/twistedutil/basic.py b/eventlet/twistedutil/protocol.py similarity index 83% rename from eventlet/twistedutil/basic.py rename to eventlet/twistedutil/protocol.py index 88f9602..5a01134 100644 --- a/eventlet/twistedutil/basic.py +++ b/eventlet/twistedutil/protocol.py @@ -1,6 +1,5 @@ """Basic twisted protocols converted to synchronous mode""" -from twisted.internet.protocol import ClientCreator, Protocol as _Protocol -from twisted.protocols import basic +from twisted.internet.protocol import ClientCreator, Protocol as twistedProtocol from twisted.internet.error import ConnectionDone from twisted.internet.protocol import Factory, _InstanceFactory from twisted.internet import defer @@ -39,37 +38,8 @@ def connectTLS(host, port, *args, **kwargs): chan = protocol.channel = channel() return buffer_class(protocol, chan) -def listenTCP(port, handler, *args, **kwargs): - from twisted.internet import reactor - buffer_class = kwargs.pop('buffer_class', DEFAULT_BUFFER) - return reactor.listenTCP(port, SpawnFactory(buffer_class, handler), *args, **kwargs) -def listenSSL(port, handler, *args, **kwargs): - from twisted.internet import reactor - buffer_class = kwargs.pop('buffer_class', DEFAULT_BUFFER) - return reactor.listenSSL(port, SpawnFactory(buffer_class, handler), *args, **kwargs) - -def listenTLS(port, handler, *args, **kwargs): - from twisted.internet import reactor - buffer_class = kwargs.pop('buffer_class', DEFAULT_BUFFER) - return reactor.listenTLS(port, SpawnFactory(buffer_class, handler), *args, **kwargs) - -class SpawnFactory(Factory): - - def __init__(self, buffer_class, handler): - self.handler = handler - self.buffer_class = buffer_class - self.protocol = buffer_class.protocol_class - - def buildProtocol(self, addr): - protocol = self.protocol() - chan = protocol.channel = channel() - protocol.factory = self - spawn(self.handler, self.buffer_class(protocol, chan)) - return protocol - - -class buffer_base(object): +class BaseBuffer(object): def __init__(self, protocol, channel): self.protocol = protocol @@ -83,7 +53,7 @@ class buffer_base(object): return getattr(self.protocol.transport, item) -class Protocol(_Protocol): +class Protocol(twistedProtocol): def dataReceived(self, data): spawn(self.channel.send, data) @@ -93,7 +63,7 @@ class Protocol(_Protocol): self.channel = None # QQQ channel creates a greenlet. does it actually finish and memory is reclaimed? -class unbuffered(buffer_base): +class Unbuffered(BaseBuffer): protocol_class = Protocol @@ -159,12 +129,12 @@ class unbuffered(buffer_base): return result -class buffer(buffer_base): +class Buffer(BaseBuffer): protocol_class = Protocol def __init__(self, *args): - buffer_base.__init__(self, *args) + BaseBuffer.__init__(self, *args) self.buf = '' def read(self, size=-1): @@ -303,38 +273,24 @@ class buffer(buffer_base): raise StopIteration return res -DEFAULT_BUFFER = buffer +DEFAULT_BUFFER = Buffer +class SpawnFactory(Factory): + + buffer_class = DEFAULT_BUFFER -class LineOnlyReceiver(basic.LineOnlyReceiver): + def __init__(self, handler, buffer_class=None): + self.handler = handler + if buffer_class is not None: + self.buffer_class = buffer_class + self.protocol = self.buffer_class.protocol_class - def lineReceived(self, line): - spawn(self.channel.send, line) - - def connectionLost(self, reason): - self.channel.send_exception(reason.value) - - -class line_only_receiver(buffer_base): - - protocol_class = LineOnlyReceiver - - def readline(self): - return self.channel.receive() - - def sendline(self, line): - self.protocol.sendLine(line) - - # iterator protocol: - - def __iter__(self): - return self - - def next(self): - try: - return self.readline() - except ConnectionDone: - raise StopIteration + def buildProtocol(self, addr): + protocol = self.protocol() + chan = protocol.channel = channel() + protocol.factory = self + spawn(self.handler, self.buffer_class(protocol, chan)) + return protocol def __setup_server_tcp(exit='clean', delay=0.1, port=0): diff --git a/eventlet/twistedutil/protocols/__init__.py b/eventlet/twistedutil/protocols/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/eventlet/twistedutil/protocols/basic.py b/eventlet/twistedutil/protocols/basic.py new file mode 100644 index 0000000..325cd71 --- /dev/null +++ b/eventlet/twistedutil/protocols/basic.py @@ -0,0 +1,34 @@ +from twisted.protocols import basic +from twisted.internet.error import ConnectionDone +from eventlet.api import spawn +from eventlet.twistedutil.protocol import BaseBuffer + +class LineOnlyReceiver(basic.LineOnlyReceiver): + + def lineReceived(self, line): + spawn(self.channel.send, line) + + def connectionLost(self, reason): + self.channel.send_exception(reason.value) + +class LineOnlyReceiverBuffer(BaseBuffer): + + protocol_class = LineOnlyReceiver + + def readline(self): + return self.channel.receive() + + def sendline(self, line): + self.protocol.sendLine(line) + + # iterator protocol: + + def __iter__(self): + return self + + def next(self): + try: + return self.readline() + except ConnectionDone: + raise StopIteration + diff --git a/eventlet/twistedutil/util.py b/eventlet/twistedutil/util.py deleted file mode 100644 index 4c43878..0000000 --- a/eventlet/twistedutil/util.py +++ /dev/null @@ -1,33 +0,0 @@ -from twisted.internet import defer -from twisted.python import failure -from eventlet.support.greenlet import greenlet -from eventlet import greenlib -from eventlet.api import get_hub, spawn - -def block_on(deferred): - cur = greenlet.getcurrent() - def cb(value): - greenlib.switch(cur, value) - def eb(err): - greenlib.switch(cur, exc=(err.type, err.value, err.tb)) - deferred.addCallback(cb) - deferred.addErrback(eb) - return get_hub().switch() - -def _putResultInDeferred(deferred, f, args, kwargs): - try: - result = f(*args, **kwargs) - except: - f = failure.Failure() - deferred.errback(f) - else: - deferred.callback(result) - -def deferToGreenThread(func, *args, **kwargs): - d = defer.Deferred() - spawn(_putResultInDeferred, d, func, args, kwargs) - return d - -def callInGreenThread(func, *args, **kwargs): - return spawn(func, *args, **kwargs) - diff --git a/examples/twisted_basic_client.py b/examples/twisted_basic_client.py index 948c214..a619063 100644 --- a/examples/twisted_basic_client.py +++ b/examples/twisted_basic_client.py @@ -1,6 +1,7 @@ -from eventlet.twisteds import basic +from eventlet.twistedutil.protocol import connectTCP +from eventlet.twistedutil.protocols.basic import LineOnlyReceiverBuffer -conn = basic.connectTCP('www.google.com', 80, buffer_class=basic.line_only_receiver) +conn = connectTCP('www.google.com', 80, buffer_class=LineOnlyReceiverBuffer) conn.write('GET / HTTP/1.0\r\n\r\n') for line in conn: print line diff --git a/examples/twisted_basic_server.py b/examples/twisted_basic_server.py index 3b32e79..41f646a 100644 --- a/examples/twisted_basic_server.py +++ b/examples/twisted_basic_server.py @@ -1,5 +1,6 @@ -from eventlet.twisteds import basic -from eventlet.twisteds import join_reactor +from eventlet.twistedutil import join_reactor +from eventlet.twistedutil.protocol import SpawnFactory +from eventlet.twistedutil.protocols.basic import LineOnlyReceiverBuffer class Chat: @@ -24,6 +25,6 @@ class Chat: self.participants.remove(conn) chat = Chat() -basic.listenTCP(8007, chat.handler, 8007, buffer_class=basic.line_only_receiver) from twisted.internet import reactor +reactor.listenTCP(8007, SpawnFactory(chat.handler, LineOnlyReceiverBuffer)) reactor.run() diff --git a/examples/twisted_xcap_proxy.py b/examples/twisted_xcap_proxy.py index a1475e0..77073d7 100644 --- a/examples/twisted_xcap_proxy.py +++ b/examples/twisted_xcap_proxy.py @@ -4,8 +4,8 @@ from twisted.protocols import basic from xcaplib.green import XCAPClient -from eventlet.twisteds.util import deferToGreenThread -from eventlet.twisteds import join_reactor +from eventlet.twistedutil import deferToGreenThread +from eventlet.twistedutil import join_reactor class LineOnlyReceiver(basic.LineOnlyReceiver):