summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucian Petrut <lpetrut@cloudbasesolutions.com>2019-02-04 08:02:36 +0200
committerOmer Katz <omer.drow@gmail.com>2019-02-04 08:02:36 +0200
commit2356f42f4775aae167c7a50b22ca4b2ffb43f413 (patch)
tree2aef7d29d8c4ac37db2844d1e2e710b6f845e402
parentbf122a05a21a8cc5bca314b0979f32c8026fc66e (diff)
downloadpy-amqp-2356f42f4775aae167c7a50b22ca4b2ffb43f413.tar.gz
Treat EWOULDBLOCK as timeout (#253)
py-amqp 2.4.0 caused a regression on Windows. Reading from a non-blocking socket having the timeout set to 0 might raise a WSAEWOULDBLOCK socket error instead of a timeout, which we're not properly handling. This change will make sure that we're just handling this as a timeout.
-rw-r--r--amqp/transport.py4
-rw-r--r--t/unit/test_transport.py18
2 files changed, 22 insertions, 0 deletions
diff --git a/amqp/transport.py b/amqp/transport.py
index 898dbe6..131ccad 100644
--- a/amqp/transport.py
+++ b/amqp/transport.py
@@ -112,6 +112,10 @@ class _AbstractTransport(object):
# Non-blocking SSL sockets can throw SSLError
raise socket.timeout()
raise
+ except socket.error as exc:
+ if get_errno(exc) == errno.EWOULDBLOCK:
+ raise socket.timeout()
+ raise
finally:
if timeout != prev:
sock.settimeout(prev)
diff --git a/t/unit/test_transport.py b/t/unit/test_transport.py
index dfc398c..763435d 100644
--- a/t/unit/test_transport.py
+++ b/t/unit/test_transport.py
@@ -424,6 +424,24 @@ class test_AbstractTransport:
sock_mock.gettimeout.assert_called()
sock_mock.settimeout.assert_not_called()
+ def test_set_timeout_ewouldblock_exc(self):
+ # We expect EWOULDBLOCK to be handled as a timeout.
+ with patch.object(self.t, 'sock') as sock_mock:
+ sock_mock.gettimeout.return_value = 3
+ with pytest.raises(socket.timeout):
+ with self.t.having_timeout(5):
+ err = socket.error()
+ err.errno = errno.EWOULDBLOCK
+ raise err
+
+ class DummySocketError(socket.error):
+ pass
+
+ # Other socket errors shouldn't be converted.
+ with pytest.raises(DummySocketError):
+ with self.t.having_timeout(5):
+ raise DummySocketError()
+
class test_AbstractTransport_connect: