[#2765] Add support for TLS SNI in httpdownloader

This commit is contained in:
Calum Lind 2015-09-24 21:50:24 +01:00
parent 7ca704be72
commit 697c22a46c
1 changed files with 17 additions and 1 deletions

View File

@ -211,7 +211,23 @@ def download_file(url, filename, callback=None, headers=None, force_filename=Fal
factory = HTTPDownloader(url, filename, callback, headers, force_filename, allow_compression) factory = HTTPDownloader(url, filename, callback, headers, force_filename, allow_compression)
if scheme == "https": if scheme == "https":
from twisted.internet import ssl from twisted.internet import ssl
reactor.connectSSL(host, port, factory, ssl.ClientContextFactory()) # ClientTLSOptions in Twisted >= 14, see ticket #2765 for details on this addition.
try:
from twisted.internet._sslverify import ClientTLSOptions
except ImportError:
ctx_factory = ssl.ClientContextFactory()
else:
class TLSSNIContextFactory(ssl.ClientContextFactory):
"""
A custom context factory to add a server name for TLS connections.
"""
def getContext(self, hostname=None, port=None):
ctx = ssl.ClientContextFactory.getContext(self)
ClientTLSOptions(host, ctx)
return ctx
ctx_factory = TLSSNIContextFactory()
reactor.connectSSL(host, port, factory, ctx_factory)
else: else:
reactor.connectTCP(host, port, factory) reactor.connectTCP(host, port, factory)