Cache the sucessful protocols
And avoid doing too many failed handshakes.
This commit is contained in:
parent
085c784691
commit
99f8a03895
1 changed files with 14 additions and 6 deletions
|
|
@ -710,19 +710,27 @@ ssl.wrap_socket = mywrap_socket
|
||||||
|
|
||||||
|
|
||||||
class HTTPSConnection2(httplib.HTTPSConnection):
|
class HTTPSConnection2(httplib.HTTPSConnection):
|
||||||
|
_HOSTS = {}
|
||||||
|
_PROTOCOLS = [ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv3]
|
||||||
|
|
||||||
def _create_connection(self):
|
def _create_connection(self):
|
||||||
sock = socket.create_connection((self.host, self.port), self.timeout)
|
sock = socket.create_connection((self.host, self.port), self.timeout)
|
||||||
if self._tunnel_host:
|
if self._tunnel_host:
|
||||||
self._tunnel()
|
self._tunnel()
|
||||||
return sock
|
return sock
|
||||||
|
|
||||||
|
def _get_protocols(self):
|
||||||
|
return self._HOSTS.get('%s:%s' % (self.host, self.port), self._PROTOCOLS)
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
sock = self._create_connection()
|
for proto in self._get_protocols():
|
||||||
try:
|
|
||||||
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1)
|
|
||||||
except ssl.SSLError:
|
|
||||||
sock.close()
|
|
||||||
sock = self._create_connection()
|
sock = self._create_connection()
|
||||||
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv3)
|
try:
|
||||||
|
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=proto)
|
||||||
|
self._HOSTS['%s:%s' % (self.host, self.port)] = [proto]
|
||||||
|
return
|
||||||
|
except ssl.SSLError, e:
|
||||||
|
sock.close()
|
||||||
|
raise e
|
||||||
|
|
||||||
httplib.HTTPSConnection = HTTPSConnection2
|
httplib.HTTPSConnection = HTTPSConnection2
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue