[Twisted-Python] How to get the Python socket object for an TLS connection?

Michael Schlenker msc at contact.de
Wed Dec 12 08:56:50 EST 2012


answering my own post at least a bit...

It seems the issue is that TLSMemoryBIOProtocol shadows the getHandle()
method from the original TCPTransport, if i rename it to getHandle2() in
TLSMemoryBIOProtocol all works fine (but obviously other stuff will break).

Looks like Ticket #5182 is only fixed 95% of the way if one needs to
access getHandle() of the underlying TCPTransport.

Are there any easy workarounds to get the socket handle anyway?


Am 12.12.2012 14:22, schrieb Michael Schlenker:
> Hi,
> i use twisted for some volume streaming over fat pipes (10 GE) and need
> to tweak the rcv and send buffer sizes when streaming via
> socket.setsockopt(). Otherwise Twisted spends lots of time calling the
> producer with tiny blocksizes and writing those tiny buffers to the tiny
> OS buffer. Speedup for streaming was around 40x when using a large
> buffer instead of default block and buffer sizes, so this is really needed.
> I'm using Twisted 12.2.
> It works fine when using reactor.listenTCP(), but fails when using
> reactor.listenSSL() because transport.getHandle() does not return a
> socket object in that case (i get some SSL.Connection object instead).
> I already saw the TLSMemoryBIOProtocol, so there should be some way to
> get at the real socket object. Do i just need to skip the listenSSL()
> step and use the steps outlined in
> http://twistedmatrix.com/documents/12.2.0/api/twisted.protocols.tls.html ?
> import os
> import socket
> from twisted.internet import reactor
> from twisted.web import server, http, resource
> from twisted.internet.ssl import DefaultOpenSSLContextFactory
> port = 2000
> bufsize = 4*1024*1024
> class HTTPChannel(http.HTTPChannel):
>   def connectionMade(self):
>       sock = self.transport.getHandle()
>       # this fails, but works when using listenTCP()
>       sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
> def main():
>     keyfile = os.path.join('certs', 'server-key.pem')
>     certfile = os.path.join('certs', 'server.pem')
>     ctx = DefaultOpenSSLContextFactory(keyfile, certfile)
>     site = server.Site(resource.NoResource())
>     site.protocol = HTTPChannel
>     reactor.listenSSL(port, site, ctx)
>     reactor.run()
> Michael

Michael Schlenker
Software Architect

CONTACT Software GmbH           Tel.:   +49 (421) 20153-80
Wiener Straße 1-3               Fax:    +49 (421) 20153-41
28359 Bremen
http://www.contact.de/          E-Mail: msc at contact.de

Sitz der Gesellschaft: Bremen
Geschäftsführer: Karl Heinz Zachries, Ralf Holtgrefe
Eingetragen im Handelsregister des Amtsgerichts Bremen unter HRB 13215

More information about the Twisted-Python mailing list