Commit 1b3f6bb8 authored by Denis Bilenko's avatar Denis Bilenko

ssl: raise SSLError in case of timeout, never raise socket.timeout (this is...

ssl: raise SSLError in case of timeout, never raise socket.timeout (this is how standard ssl behaves)
parent e995af01
...@@ -107,7 +107,7 @@ class SSLSocket(socket): ...@@ -107,7 +107,7 @@ class SSLSocket(socket):
raise raise
sys.exc_clear() sys.exc_clear()
try: try:
wait_read(self.fileno(), timeout=self.timeout, event=self._read_event) wait_read(self.fileno(), timeout=self.timeout, timeout_exc=_SSLErrorReadTimeout, event=self._read_event)
except socket_error, ex: except socket_error, ex:
if ex[0] == EBADF: if ex[0] == EBADF:
return '' return ''
...@@ -117,7 +117,8 @@ class SSLSocket(socket): ...@@ -117,7 +117,8 @@ class SSLSocket(socket):
raise raise
sys.exc_clear() sys.exc_clear()
try: try:
wait_write(self.fileno(), timeout=self.timeout, event=self._write_event) # note: using _SSLErrorReadTimeout rather than _SSLErrorWriteTimeout below is intentional
wait_write(self.fileno(), timeout=self.timeout, timeout_exc=_SSLErrorReadTimeout, event=self._write_event)
except socket_error, ex: except socket_error, ex:
if ex[0] == EBADF: if ex[0] == EBADF:
return '' return ''
...@@ -137,7 +138,7 @@ class SSLSocket(socket): ...@@ -137,7 +138,7 @@ class SSLSocket(socket):
raise raise
sys.exc_clear() sys.exc_clear()
try: try:
wait_read(self.fileno(), timeout=self.timeout, event=self._read_event) wait_read(self.fileno(), timeout=self.timeout, timeout_exc=_SSLErrorWriteTimeout, event=self._read_event)
except socket_error, ex: except socket_error, ex:
if ex[0] == EBADF: if ex[0] == EBADF:
return 0 return 0
...@@ -147,7 +148,7 @@ class SSLSocket(socket): ...@@ -147,7 +148,7 @@ class SSLSocket(socket):
raise raise
sys.exc_clear() sys.exc_clear()
try: try:
wait_write(self.fileno(), timeout=self.timeout, event=self._write_event) wait_write(self.fileno(), timeout=self.timeout, timeout_exc=_SSLErrorWriteTimeout, event=self._write_event)
except socket_error, ex: except socket_error, ex:
if ex[0] == EBADF: if ex[0] == EBADF:
return 0 return 0
...@@ -246,7 +247,7 @@ class SSLSocket(socket): ...@@ -246,7 +247,7 @@ class SSLSocket(socket):
if x.args[0] == SSL_ERROR_WANT_READ: if x.args[0] == SSL_ERROR_WANT_READ:
sys.exc_clear() sys.exc_clear()
if self.timeout == 0.0: if self.timeout == 0.0:
raise timeout(str(x)) raise
try: try:
wait_read(self.fileno(), timeout=self.timeout, event=self._read_event) wait_read(self.fileno(), timeout=self.timeout, event=self._read_event)
except socket_error, ex: except socket_error, ex:
...@@ -308,12 +309,12 @@ class SSLSocket(socket): ...@@ -308,12 +309,12 @@ class SSLSocket(socket):
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
wait_read(self.fileno(), timeout=self.timeout, event=self._read_event) wait_read(self.fileno(), timeout=self.timeout, timeout_exc=_SSLErrorHandshakeTimeout, event=self._read_event)
elif ex.args[0] == SSL_ERROR_WANT_WRITE: elif ex.args[0] == SSL_ERROR_WANT_WRITE:
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
wait_write(self.fileno(), timeout=self.timeout, event=self._write_event) wait_write(self.fileno(), timeout=self.timeout, timeout_exc=_SSLErrorHandshakeTimeout, event=self._write_event)
else: else:
raise raise
...@@ -357,6 +358,11 @@ class SSLSocket(socket): ...@@ -357,6 +358,11 @@ class SSLSocket(socket):
return _fileobject(self, mode, bufsize, close=True) return _fileobject(self, mode, bufsize, close=True)
_SSLErrorReadTimeout = SSLError('The read operation timed out')
_SSLErrorWriteTimeout = SSLError('The write operation timed out')
_SSLErrorHandshakeTimeout = SSLError('The handshake operation timed out')
def wrap_socket(sock, keyfile=None, certfile=None, def wrap_socket(sock, keyfile=None, certfile=None,
server_side=False, cert_reqs=CERT_NONE, server_side=False, cert_reqs=CERT_NONE,
ssl_version=PROTOCOL_SSLv23, ca_certs=None, ssl_version=PROTOCOL_SSLv23, ca_certs=None,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment