diff options
author | Lucian Petrut <lpetrut@cloudbasesolutions.com> | 2019-02-04 08:02:36 +0200 |
---|---|---|
committer | Omer Katz <omer.drow@gmail.com> | 2019-02-04 08:02:36 +0200 |
commit | 2356f42f4775aae167c7a50b22ca4b2ffb43f413 (patch) | |
tree | 2aef7d29d8c4ac37db2844d1e2e710b6f845e402 | |
parent | bf122a05a21a8cc5bca314b0979f32c8026fc66e (diff) | |
download | py-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.py | 4 | ||||
-rw-r--r-- | t/unit/test_transport.py | 18 |
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: |