summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Lazar <mlazar@doctorondemand.com>2021-12-15 13:18:11 -0500
committerAsif Saif Uddin <auvipy@gmail.com>2021-12-16 09:53:34 +0600
commitf4fd4f952dded9ea1006e82642f2c15008bb68d3 (patch)
tree1181cc69a0ad3abf25b1054743c81a70b5d8c229
parentbe6b5ededa5654ca43cea67927667456e32523a3 (diff)
downloadpy-amqp-f4fd4f952dded9ea1006e82642f2c15008bb68d3.tar.gz
Add additional error handling around code where an OSError may be raised on failed connections. Fixes #378
-rw-r--r--amqp/transport.py12
-rw-r--r--t/unit/test_transport.py17
2 files changed, 27 insertions, 2 deletions
diff --git a/amqp/transport.py b/amqp/transport.py
index 177fb22..b87f9fe 100644
--- a/amqp/transport.py
+++ b/amqp/transport.py
@@ -272,7 +272,11 @@ class _AbstractTransport:
def close(self):
if self.sock is not None:
- self._shutdown_transport()
+ try:
+ self._shutdown_transport()
+ except OSError:
+ pass
+
# Call shutdown first to make sure that pending messages
# reach the AMQP broker if the program exits after
# calling this method.
@@ -280,7 +284,11 @@ class _AbstractTransport:
self.sock.shutdown(socket.SHUT_RDWR)
except OSError:
pass
- self.sock.close()
+
+ try:
+ self.sock.close()
+ except OSError:
+ pass
self.sock = None
self.connected = False
diff --git a/t/unit/test_transport.py b/t/unit/test_transport.py
index b111497..0c7b0e2 100644
--- a/t/unit/test_transport.py
+++ b/t/unit/test_transport.py
@@ -835,6 +835,23 @@ class test_SSLTransport:
self.t._shutdown_transport()
assert self.t.sock is sock.unwrap()
+ def test_close__unwrap_error(self):
+ # sock.unwrap() can raise an error if the was a connection failure
+ # make sure the socket is properly closed and deallocated
+ sock = self.t.sock = Mock()
+ sock.unwrap.side_effect = OSError
+ self.t.close()
+ assert self.t.sock is None
+
+ def test_close__close_error(self):
+ # sock.close() can raise an error if the fd is invalid
+ # make sure the socket is properly deallocated
+ sock = self.t.sock = Mock()
+ sock.close.side_effect = OSError
+ self.t.close()
+ sock.close.assert_called_with()
+ assert self.t.sock is None and self.t.connected is False
+
def test_read_EOF(self):
self.t.sock = Mock(name='SSLSocket')
self.t.connected = True