So, I'm not sure if anyone is interested, but I patched stacklesssocket to support TLSLite, and it seems to be working. It uses the normal<br>socket.ssl() interface.<br><br>Arnar: passing a stacklesssocket to socket.ssl
() didn't work, since socket.ssl wraps a socket with a blocking interface from _ssl.c.<br><br>Stacklesssocket likes to be on top ;-)<br><br>I just gave stacklesssocket a ssl() function which replaces the default dispatcher with one inheriting the
tlslite.integration.TLSAsyncDispatcherMixin.<br>I wish I wasn't instantiating a dispatcher, killing it, and instantiating another for every tls connection, but it was a quick way to get urllib (and therefore, <a href="http://code.google.com/p/boto/">
boto</a>) to work. This little inefficiency can be avoided, of course, with a little more effort, i.e. building it by hand, instead of using ssl().<br><br>___Here are the additions:________________________________________________________
<br><br># TLSLite Optional<br>try:<br> from tlslite.api import *<br> tls_enabled = True<br>except ImportError:<br> tls_enabled = False<br><br>#<br># Replace a stacklessocket's dispatcher with one inheriting <br>
# tlslite.integration.TLSDispatcherMixIn<br>#<br>def ssl(sock, keyfile=None, certfile=None):<br> if tls_enabled:<br> sock.dispatcher = TLSDispatcher(self.sock, keyfile, certfile)<br> return sock<br> else:
<br> print "SSL Support requires TLSLite!"<br> return None<br><br><br>#<br># Adds TLSAsyncDispatcherMixIn methods to the stacklesssocket dispatcher.<br>#<br>class TLSDispatcher(TLSAsyncDispatcherMixIn, dispatcher):
<br> def __init__(self, sock, keyfile, certfile):<br> dispatcher.__init__(self, sock)<br> TLSAsyncDispatcherMixIn.__init__(self, sock)<br> <br> # Do I want this?<br> self.tlsConnection.ignoreAbruptClose
= True<br> <br> if keyfile and certfile:<br> x509 = X509()<br> key = file(keyfile).read()<br> cert = file(certfile).read()<br> x509.parse(cert)<br> certChain = X509CertChain([x509])
<br> privateKey = parsePEMKey(key, private=True)<br> self.setHandshakeOp(handshakeClientCert(certChain=certChain,<br> privateKey=privateKey,<br> async=True))
<br> else:<br> self.setHandshakeOp(handshakeClientUnknown(async=True))<br>________________________________________________________________________________<br><br>____Here's a test script:________________________________________________________
<br><br>import sys<br>import stacklesssocket<br>import stackless<br><br>sys.modules["socket"] = stacklesssocket<br><br>import urllib<br>import time<br><br>url = "<a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">
https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi</a>"<br><br>def download(uri):<br> t1 = time.time()<br> f = urllib.urlopen(uri)<br> s = f.read()<br> t2 = time.time
()<br> print "Downloaded", uri, "in", "%.1f" % (t2-t1), "seconds"<br> return t2-t1<br><br><br>print " === Serial === "<br><br>t1 = time.time()<br><br>for d in xrange(10):
<br> download(url)<br><br>t2 = time.time()<br>print " --->", t2-t1<br><br><br>print " === Parallel === "<br><br>for d in xrange(10):<br> stackless.tasklet(download)(url)<br><br>t1 = time.time()
<br><br>stackless.run()<br><br>t2 = time.time()<br>print " --->", t2-t1<br><br>______________________________________________________________________<br><br>root@domU-12-31-36-00-2D-01:/usr/local/legion# stackless ssl_test.py
<br> === Serial === <br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.5 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.7 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.1 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.0 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.7 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.9 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.3 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.5 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.6 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.3 seconds<br> ---> 10.5861570835<br> === Parallel === <br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.7 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.6 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.4 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.6 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.1 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.0 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 0.7 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.0 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.2 seconds<br>Downloaded <a href="https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi">https://addons.mozilla.org/en-US/firefox/downloads/file/16347/web_developer-1.1.4-fx+fl.xpi
</a> in 1.4 seconds<br> ---> 8.78113698959<br><br>______________________________________________________________________________________________________________<br><br>I also tested X509 Certificate Authentication (with boto, which also uses urllib).
<br><br>It works on my cloud.<br><br>Much Respect,<br>Phoenix Sol<br>