Skip to content

Commit db7af5f

Browse files
nburlettauvipy
authored andcommitted
fix AbstractTransport repr socket error (#361)
If AbstractTransport's self.sock is disconnected, then self.sock.getpeername() will raise an error in __repr__, which shows up in backtraces for other upstream errors. Fix this by catching socket.error in __repr__ and putting the error info in to the returned repr string. Fixes #361
1 parent ec138c2 commit db7af5f

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

amqp/transport.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,10 @@ def __init__(self, host, connect_timeout=None,
116116
def __repr__(self):
117117
if self.sock:
118118
src = f'{self.sock.getsockname()[0]}:{self.sock.getsockname()[1]}'
119-
dst = f'{self.sock.getpeername()[0]}:{self.sock.getpeername()[1]}'
119+
try:
120+
dst = f'{self.sock.getpeername()[0]}:{self.sock.getpeername()[1]}'
121+
except (socket.error) as e:
122+
dst = f'ERROR: {e}'
120123
return f'<{type(self).__name__}: {src} -> {dst} at {id(self):#x}>'
121124
else:
122125
return f'<{type(self).__name__}: (disconnected) at {id(self):#x}>'

t/unit/test_transport.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ def getsockname(self):
5959
return ('127.0.0.1', 1234)
6060

6161
def getpeername(self):
62-
return ('1.2.3.4', 5671)
62+
if self.connected:
63+
return ('1.2.3.4', 5671)
64+
else:
65+
raise socket.error
6366

6467

6568
TCP_KEEPIDLE = 4
@@ -237,6 +240,17 @@ def test_set_sockopt_opts_timeout(self):
237240
assert expected_sndtimeo == self.socket.getsockopt(socket.SOL_TCP,
238241
socket.SO_SNDTIMEO)
239242

243+
def test_transport_repr_issue_361(self):
244+
"Regression test for https://github.com/celery/py-amqp/issues/361"
245+
self.t = transport.Transport(self.host)
246+
self.t.sock = MockSocket()
247+
self.t.sock.connect(None)
248+
assert '127.0.0.1:1234 -> 1.2.3.4:5671' in repr(self.t)
249+
250+
self.t.sock.connected = False
251+
self.t.sock.close()
252+
assert '127.0.0.1:1234 -> ERROR:' in repr(self.t)
253+
240254

241255
class test_AbstractTransport:
242256
class Transport(transport._AbstractTransport):

0 commit comments

Comments
 (0)