diff options
author | Ask Solem <ask@celeryproject.org> | 2013-10-25 12:31:49 +0100 |
---|---|---|
committer | Ask Solem <ask@celeryproject.org> | 2013-10-25 12:31:49 +0100 |
commit | 840ba58a39fbc737a77be4b4c62aa3b9828c936d (patch) | |
tree | 3000ee334905c26449b76b76a77dda8267680ae5 | |
parent | c92b68368e2e9cecc53f072f5b17848f5697860d (diff) | |
download | py-amqp-840ba58a39fbc737a77be4b4c62aa3b9828c936d.tar.gz |
Do not set disconnected on EGAIN/EINTR
-rw-r--r-- | amqp/transport.py | 21 | ||||
-rw-r--r-- | amqp/utils.py | 15 |
2 files changed, 28 insertions, 8 deletions
diff --git a/amqp/transport.py b/amqp/transport.py index c867caa..21d293a 100644 --- a/amqp/transport.py +++ b/amqp/transport.py @@ -49,7 +49,9 @@ except: from struct import pack, unpack from .exceptions import UnexpectedFrame -from .utils import set_cloexec +from .utils import get_errno, set_cloexec + +_UNAVAIL = errno.EAGAIN, errno.EINTR AMQP_PORT = 5672 @@ -67,6 +69,7 @@ class _AbstractTransport(object): connected = False def __init__(self, host, connect_timeout): + self.connected = True msg = None port = AMQP_PORT @@ -104,7 +107,6 @@ class _AbstractTransport(object): if not self.sock: # Didn't connect, return the most recent error message raise socket.error(last_err) - self.connected = True try: self.sock.settimeout(None) @@ -114,8 +116,9 @@ class _AbstractTransport(object): self._setup_transport() self._write(AMQP_PROTOCOL_HEADER) - except (OSError, IOError, socket.error): - self.connected = False + except (OSError, IOError, socket.error) as exc: + if get_errno(exc) not in _UNAVAIL: + self.connected = False raise def __del__(self): @@ -162,8 +165,9 @@ class _AbstractTransport(object): ch = ord(read(1)) except socket.timeout: raise - except (OSError, IOError, socket.error): - self.connected = False + except (OSError, IOError, socket.error) as exc: + if get_errno(exc) not in _UNAVAIL: + self.connected = False raise if ch == 206: # '\xce' return frame_type, channel, payload @@ -180,8 +184,9 @@ class _AbstractTransport(object): )) except socket.timeout: raise - except (OSError, IOError, socket.error): - self.connected = False + except (OSError, IOError, socket.error) as exc: + if get_errno(exc) not in _UNAVAIL: + self.connected = False raise diff --git a/amqp/utils.py b/amqp/utils.py index 429ac0d..994030b 100644 --- a/amqp/utils.py +++ b/amqp/utils.py @@ -82,3 +82,18 @@ except ImportError: else: flags &= ~FD_CLOEXEC return fcntl.fcntl(fd, fcntl.F_SETFD, flags) + + +def get_errno(exc): + """:exc:`socket.error` and :exc:`IOError` first got + the ``.errno`` attribute in Py2.7""" + try: + return exc.errno + except AttributeError: + try: + # e.args = (errno, reason) + if isinstance(exc.args, tuple) and len(exc.args) == 2: + return exc.args[0] + except AttributeError: + pass + return 0 |