Issue #10272: The ssl module now raises socket.timeout instead of a generic

SSLError on socket timeouts.
This commit is contained in:
Antoine Pitrou 2010-12-03 19:59:41 +00:00
parent 500be24a64
commit c4df784514
5 changed files with 15 additions and 9 deletions

View File

@ -1499,7 +1499,7 @@ else:
c.settimeout(0.2) c.settimeout(0.2)
c.connect((host, port)) c.connect((host, port))
# Will attempt handshake and time out # Will attempt handshake and time out
self.assertRaisesRegex(ssl.SSLError, "timed out", self.assertRaisesRegex(socket.timeout, "timed out",
ssl.wrap_socket, c) ssl.wrap_socket, c)
finally: finally:
c.close() c.close()
@ -1508,7 +1508,7 @@ else:
c = ssl.wrap_socket(c) c = ssl.wrap_socket(c)
c.settimeout(0.2) c.settimeout(0.2)
# Will attempt handshake and time out # Will attempt handshake and time out
self.assertRaisesRegex(ssl.SSLError, "timed out", self.assertRaisesRegex(socket.timeout, "timed out",
c.connect, (host, port)) c.connect, (host, port))
finally: finally:
c.close() c.close()

View File

@ -35,6 +35,9 @@ Core and Builtins
Library 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 - Issue #10528: Allow translators to reorder placeholders in localizable
messages from argparse. messages from argparse.

View File

@ -370,7 +370,7 @@ static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self)
sockstate = SOCKET_OPERATION_OK; sockstate = SOCKET_OPERATION_OK;
} }
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySocketModule.timeout_error,
ERRSTR("The handshake operation timed out")); ERRSTR("The handshake operation timed out"));
goto error; goto error;
} else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { } 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); sockstate = check_socket_and_wait_for_timeout(sock, 1);
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySocketModule.timeout_error,
"The write operation timed out"); "The write operation timed out");
goto error; goto error;
} else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
@ -1104,7 +1104,7 @@ static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args)
sockstate = SOCKET_OPERATION_OK; sockstate = SOCKET_OPERATION_OK;
} }
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySocketModule.timeout_error,
"The write operation timed out"); "The write operation timed out");
goto error; goto error;
} else if (sockstate == SOCKET_HAS_BEEN_CLOSED) { } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
@ -1211,7 +1211,7 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args)
if (!count) { if (!count) {
sockstate = check_socket_and_wait_for_timeout(sock, 0); sockstate = check_socket_and_wait_for_timeout(sock, 0);
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySocketModule.timeout_error,
"The read operation timed out"); "The read operation timed out");
goto error; goto error;
} else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) { } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
@ -1245,7 +1245,7 @@ static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args)
sockstate = SOCKET_OPERATION_OK; sockstate = SOCKET_OPERATION_OK;
} }
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySocketModule.timeout_error,
"The read operation timed out"); "The read operation timed out");
goto error; goto error;
} else if (sockstate == SOCKET_IS_NONBLOCKING) { } else if (sockstate == SOCKET_IS_NONBLOCKING) {
@ -1340,10 +1340,10 @@ static PyObject *PySSL_SSLshutdown(PySSLSocket *self)
break; break;
if (sockstate == SOCKET_HAS_TIMED_OUT) { if (sockstate == SOCKET_HAS_TIMED_OUT) {
if (ssl_err == SSL_ERROR_WANT_READ) if (ssl_err == SSL_ERROR_WANT_READ)
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySocketModule.timeout_error,
"The read operation timed out"); "The read operation timed out");
else else
PyErr_SetString(PySSLErrorObject, PyErr_SetString(PySocketModule.timeout_error,
"The write operation timed out"); "The write operation timed out");
goto error; goto error;
} }

View File

@ -4358,6 +4358,7 @@ static
PySocketModule_APIObject PySocketModuleAPI = PySocketModule_APIObject PySocketModuleAPI =
{ {
&sock_type, &sock_type,
NULL,
NULL NULL
}; };
@ -4425,6 +4426,7 @@ PyInit__socket(void)
socket_error, NULL); socket_error, NULL);
if (socket_timeout == NULL) if (socket_timeout == NULL)
return NULL; return NULL;
PySocketModuleAPI.timeout_error = socket_timeout;
Py_INCREF(socket_timeout); Py_INCREF(socket_timeout);
PyModule_AddObject(m, "timeout", socket_timeout); PyModule_AddObject(m, "timeout", socket_timeout);
Py_INCREF((PyObject *)&sock_type); Py_INCREF((PyObject *)&sock_type);

View File

@ -196,6 +196,7 @@ typedef struct {
typedef struct { typedef struct {
PyTypeObject *Sock_Type; PyTypeObject *Sock_Type;
PyObject *error; PyObject *error;
PyObject *timeout_error;
} PySocketModule_APIObject; } PySocketModule_APIObject;
#define PySocketModule_ImportModuleAndAPI() PyCapsule_Import(PySocket_CAPSULE_NAME, 1) #define PySocketModule_ImportModuleAndAPI() PyCapsule_Import(PySocket_CAPSULE_NAME, 1)