diff options
author | Trygve Aaberge <trygveaa@gmail.com> | 2019-02-19 23:55:59 +0100 |
---|---|---|
committer | Trygve Aaberge <trygveaa@gmail.com> | 2019-02-20 00:07:21 +0100 |
commit | 9a146e32e153fa1e0111b216f32c4b0e35ec9c12 (patch) | |
tree | b9e248ee246e34b84d7348337d48a809612bf8cd /websocket | |
parent | 2c18d28f3596acfd269fa568fbf85ff9ca2b97fb (diff) | |
download | websocket-client-9a146e32e153fa1e0111b216f32c4b0e35ec9c12.tar.gz |
Retry connect on "Interrupted system call"
When connecting to a socket, EINTR ("Interrupted system call") may be
raised if the application receives a signal at the same time. Prior to
Python 3.5, applications has to handle this themselves by retrying the
connection. For more details, see https://www.python.org/dev/peps/pep-0475/
Fixes #527
Diffstat (limited to 'websocket')
-rw-r--r-- | websocket/_http.py | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/websocket/_http.py b/websocket/_http.py index e7f1e2e..dd982db 100644 --- a/websocket/_http.py +++ b/websocket/_http.py @@ -166,26 +166,32 @@ def _open_socket(addrinfo_list, sockopt, timeout): sock.setsockopt(*opts) address = addrinfo[4] - try: - sock.connect(address) - err = None - except ProxyConnectionError as error: - err = WebSocketProxyException(str(error)) - err.remote_ip = str(address[0]) - continue - except socket.error as error: - error.remote_ip = str(address[0]) + err = None + while not err: try: - eConnRefused = (errno.ECONNREFUSED, errno.WSAECONNREFUSED) - except: - eConnRefused = (errno.ECONNREFUSED, ) - if error.errno in eConnRefused: - err = error + sock.connect(address) + except ProxyConnectionError as error: + err = WebSocketProxyException(str(error)) + err.remote_ip = str(address[0]) continue + except socket.error as error: + error.remote_ip = str(address[0]) + try: + eConnRefused = (errno.ECONNREFUSED, errno.WSAECONNREFUSED) + except: + eConnRefused = (errno.ECONNREFUSED, ) + if error.errno == errno.EINTR: + continue + elif error.errno in eConnRefused: + err = error + continue + else: + raise error else: - raise error + break else: - break + continue + break else: raise err |