From c4df7845143f9afe0d20f4421a41904f3cbb991a Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 3 Dec 2010 19:59:41 +0000 Subject: [PATCH] Issue #10272: The ssl module now raises socket.timeout instead of a generic SSLError on socket timeouts. --- Lib/test/test_ssl.py | 4 ++-- Misc/NEWS | 3 +++ Modules/_ssl.c | 14 +++++++------- Modules/socketmodule.c | 2 ++ Modules/socketmodule.h | 1 + 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index c9f03c751dd..e5a07a3e9f2 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1499,7 +1499,7 @@ else: c.settimeout(0.2) c.connect((host, port)) # Will attempt handshake and time out - self.assertRaisesRegex(ssl.SSLError, "timed out", + self.assertRaisesRegex(socket.timeout, "timed out", ssl.wrap_socket, c) finally: c.close() @@ -1508,7 +1508,7 @@ else: c = ssl.wrap_socket(c) c.settimeout(0.2) # Will attempt handshake and time out - self.assertRaisesRegex(ssl.SSLError, "timed out", + self.assertRaisesRegex(socket.timeout, "timed out", c.connect, (host, port)) finally: c.close() diff --git a/Misc/NEWS b/Misc/NEWS index 4576fb38b70..cab89de95a4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -35,6 +35,9 @@ Core and Builtins Library ------- +- Issue #10272: The ssl module now raises socket.timeout instead of a generic + SSLError on socket timeouts. + - Issue #10528: Allow translators to reorder placeholders in localizable messages from argparse. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index c2b976a843c..a5145552e84 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -370,7 +370,7 @@ static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self) sockstate = SOCKET_OPERATION_OK; } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, ERRSTR("The handshake operation timed out")); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -1075,7 +1075,7 @@ static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args) sockstate = check_socket_and_wait_for_timeout(sock, 1); if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The write operation timed out"); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -1104,7 +1104,7 @@ static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args) sockstate = SOCKET_OPERATION_OK; } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The write operation timed out"); goto error; } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { @@ -1211,7 +1211,7 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args) if (!count) { sockstate = check_socket_and_wait_for_timeout(sock, 0); if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The read operation timed out"); goto error; } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { @@ -1245,7 +1245,7 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args) sockstate = SOCKET_OPERATION_OK; } if (sockstate == SOCKET_HAS_TIMED_OUT) { - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The read operation timed out"); goto error; } else if (sockstate == SOCKET_IS_NONBLOCKING) { @@ -1340,10 +1340,10 @@ static PyObject *PySSL_SSLshutdown(PySSLSocket *self) break; if (sockstate == SOCKET_HAS_TIMED_OUT) { if (ssl_err == SSL_ERROR_WANT_READ) - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The read operation timed out"); else - PyErr_SetString(PySSLErrorObject, + PyErr_SetString(PySocketModule.timeout_error, "The write operation timed out"); goto error; } diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index e24bf546c7d..abdd1b2b47a 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -4358,6 +4358,7 @@ static PySocketModule_APIObject PySocketModuleAPI = { &sock_type, + NULL, NULL }; @@ -4425,6 +4426,7 @@ PyInit__socket(void) socket_error, NULL); if (socket_timeout == NULL) return NULL; + PySocketModuleAPI.timeout_error = socket_timeout; Py_INCREF(socket_timeout); PyModule_AddObject(m, "timeout", socket_timeout); Py_INCREF((PyObject *)&sock_type); diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 4f426f5d85c..f064795b80f 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -196,6 +196,7 @@ typedef struct { typedef struct { PyTypeObject *Sock_Type; PyObject *error; + PyObject *timeout_error; } PySocketModule_APIObject; #define PySocketModule_ImportModuleAndAPI() PyCapsule_Import(PySocket_CAPSULE_NAME, 1)