diff options
Diffstat (limited to 'paste/webkit/FakeWebware/MiscUtils/M2PickleRPC.py')
| -rw-r--r-- | paste/webkit/FakeWebware/MiscUtils/M2PickleRPC.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/paste/webkit/FakeWebware/MiscUtils/M2PickleRPC.py b/paste/webkit/FakeWebware/MiscUtils/M2PickleRPC.py new file mode 100644 index 0000000..2976f7f --- /dev/null +++ b/paste/webkit/FakeWebware/MiscUtils/M2PickleRPC.py @@ -0,0 +1,67 @@ +""" +M2Crypto-enhanced transport for PickleRPC + +This lets you use M2Crypto for SSL encryption. + +Based on m2xmlrpclib.py which is + Copyright (c) 1999-2002 Ng Pheng Siong. All rights reserved +""" + +from PickleRPC import Transport +import base64, string, sys +from M2Crypto import SSL, httpslib, m2urllib +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +__version__ = 1 # version of M2PickleRPC + +class M2Transport(Transport): + user_agent = "M2PickleRPC.py/%s - %s" % (__version__, Transport.user_agent) + + def __init__(self, ssl_context=None): + if ssl_context is None: + self.ssl_ctx=SSL.Context('sslv23') + else: + self.ssl_ctx=ssl_context + + def make_connection(self, host): + _host, _port = m2urllib.splitport(host) + if sys.version[0] == '2': + return httpslib.HTTPS(_host, int(_port), ssl_context=self.ssl_ctx) + elif sys.version[:3] == '1.5': + return httpslib.HTTPS(self.ssl_ctx, _host, int(_port)) + else: + raise RuntimeError, 'unsupported Python version' + + # @@ workarounds below are necessary because M2Crypto seems to + # return from fileobject.read() early! So we have to call it + # over and over to get the full data. + + def parse_response(self, f): + """ + Workaround M2Crypto issue mentioned above + """ + sio = StringIO() + while 1: + chunk = f.read() + if not chunk: + break + sio.write(chunk) + sio.seek(0) + return Transport.parse_response(self, sio) + + def parse_response_gzip(self, f): + """ + Workaround M2Crypto issue mentioned above + """ + sio = StringIO() + while 1: + chunk = f.read() + if not chunk: + break + sio.write(chunk) + sio.seek(0) + return Transport.parse_response_gzip(self, sio) + |
