summaryrefslogtreecommitdiff
path: root/websocket
diff options
context:
space:
mode:
authorTrygve Aaberge <trygveaa@gmail.com>2019-02-19 23:55:59 +0100
committerTrygve Aaberge <trygveaa@gmail.com>2019-02-20 00:07:21 +0100
commit9a146e32e153fa1e0111b216f32c4b0e35ec9c12 (patch)
treeb9e248ee246e34b84d7348337d48a809612bf8cd /websocket
parent2c18d28f3596acfd269fa568fbf85ff9ca2b97fb (diff)
downloadwebsocket-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.py38
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