summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsk Solem <ask@celeryproject.org>2013-10-25 12:31:49 +0100
committerAsk Solem <ask@celeryproject.org>2013-10-25 12:31:49 +0100
commit840ba58a39fbc737a77be4b4c62aa3b9828c936d (patch)
tree3000ee334905c26449b76b76a77dda8267680ae5
parentc92b68368e2e9cecc53f072f5b17848f5697860d (diff)
downloadpy-amqp-840ba58a39fbc737a77be4b4c62aa3b9828c936d.tar.gz
Do not set disconnected on EGAIN/EINTR
-rw-r--r--amqp/transport.py21
-rw-r--r--amqp/utils.py15
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