summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsk Solem <ask@celeryproject.org>2013-07-31 14:36:21 +0100
committerAsk Solem <ask@celeryproject.org>2013-07-31 14:38:38 +0100
commit8a38ff3940863dd549c3d42dfe2dbfde908f9894 (patch)
tree18869e722bdb62489f9ca3c6f0682f9761b09e26
parent5855c4a020b68f74c85d9eb494504e21c58c2001 (diff)
downloadpy-amqp-8a38ff3940863dd549c3d42dfe2dbfde908f9894.tar.gz
flakes
-rw-r--r--amqp/transport.py32
1 files changed, 13 insertions, 19 deletions
diff --git a/amqp/transport.py b/amqp/transport.py
index 7b7a65f..71ccbb5 100644
--- a/amqp/transport.py
+++ b/amqp/transport.py
@@ -193,31 +193,27 @@ class SSLTransport(_AbstractTransport):
return
self.sock = unwrap()
- def _read(self, n, initial=False):
- """According to SSL_read(3), the most that an SSL read can return is 16kb.
- Thus, we use the same mechanism as in TCPTransport::_read to get the exact
- number of bytes wanted, using an internal read buffer."""
-
+ def _read(self, n, initial=False,
+ _errnos=(errno.ENOENT, errno.EAGAIN, errno.EINTR)):
+ # According to SSL_read(3), it can at most return 16kb of data.
+ # Thus, we use an internal read buffer like TCPTransport._read
+ # to get the exact number of bytes wanted.
recv = self._quick_recv
- result = EMPTY_BUFFER
rbuf = self._read_buffer
while len(rbuf) < n:
try:
- s = recv(16384)
+ s = recv(16384) # see note above
except socket.error, exc:
- # It seems that ssl.sock.read raises errno.ENOENT when the
- # operation couldn't have been performed, so we also need to
- # catch it here, or we will have issues like
- # https://github.com/celery/celery/issues/1414.
- if not initial and exc.errno in (errno.ENOENT, errno.EAGAIN, errno.EINTR):
+ # ssl.sock.read may cause ENOENT if the
+ # operation couldn't be performed (Issue celery#1414).
+ if not initial and exc.errno in _errnos:
continue
raise exc
if not s:
raise IOError('Socket closed')
rbuf += s
- result = rbuf[:n]
- self._read_buffer = rbuf[n:]
+ result, self._read_buffer = rbuf[:n], rbuf[n:]
return result
def _write(self, s):
@@ -230,7 +226,6 @@ class SSLTransport(_AbstractTransport):
s = s[n:]
-
class TCPTransport(_AbstractTransport):
"""Transport that deals directly with TCP socket."""
@@ -241,7 +236,7 @@ class TCPTransport(_AbstractTransport):
self._read_buffer = EMPTY_BUFFER
self._quick_recv = self.sock.recv
- def _read(self, n, initial=False):
+ def _read(self, n, initial=False, _errnos=(errno.EAGAIN, errno.EINTR)):
"""Read exactly n bytes from the socket"""
recv = self._quick_recv
rbuf = self._read_buffer
@@ -249,15 +244,14 @@ class TCPTransport(_AbstractTransport):
try:
s = recv(65536)
except socket.error, exc:
- if not initial and exc.errno in (errno.EAGAIN, errno.EINTR):
+ if not initial and exc.errno in _errnos:
continue
raise
if not s:
raise IOError('Socket closed')
rbuf += s
- result = rbuf[:n]
- self._read_buffer = rbuf[n:]
+ result, self._read_buffer = rbuf[:n], rbuf[n:]
return result