Skip to content

Commit 1af5eb5

Browse files
committed
treat connection error like a timeout
1 parent d1342a7 commit 1af5eb5

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

tests/test_connections.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,31 @@ def test_remote_status_timeout():
5959
assert remote_status["status"].startswith("Unreachable")
6060

6161

62+
def test_remote_status_error():
63+
with mock.patch("umapi_client.connection.requests.Session.get") as mock_get:
64+
mock_get.side_effect = requests.ConnectionError
65+
conn = Connection(**mock_connection_params)
66+
_, remote_status = conn.status(remote=True)
67+
assert remote_status["status"].startswith("Unreachable")
68+
69+
70+
# log_stream fixture defined in conftest.py
71+
def test_remote_status_error_logging(log_stream):
72+
with mock.patch("umapi_client.connection.requests.Session.get") as mock_get:
73+
mock_get.side_effect = requests.ConnectionError
74+
stream, logger = log_stream
75+
params = dict(mock_connection_params)
76+
params["logger"] = logger
77+
conn = Connection(**params)
78+
pytest.raises(UnavailableError, conn.make_call, "")
79+
stream.flush()
80+
log = stream.getvalue() # save as a local so can do pytest -l to see exact log
81+
assert "code Error on try 1" in log
82+
assert "code Error on try 2" in log
83+
assert "code Error on try 3" in log
84+
assert "code Error on try 4" not in log
85+
86+
6287
def test_ua_string():
6388
conn = Connection(**mock_connection_params)
6489
req = conn.session.prepare_request(requests.Request('GET', "http://test.com/"))

umapi_client/connection.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def __init__(self, result=None, success=False, timeout=None):
4444
self.result = result
4545
self.success = success
4646
self.timeout = timeout
47+
self.status_code = result.status_code if hasattr(result, 'status_code') else 'Error'
4748

4849
def check_result(self):
4950
if self.result.status_code in self.success_codes:
@@ -53,7 +54,6 @@ def check_result(self):
5354
self.success = False
5455
self.timeout = self.get_timeout()
5556
return self
56-
print("STATUS", self.result.status_code)
5757
if self.client_error(self.result.status_code):
5858
raise ClientError("Unexpected HTTP Status {:d}: {}".format(self.result.status_code, self.result.text), self.result)
5959
if self.request_error(self.result.status_code):
@@ -485,12 +485,16 @@ def call():
485485
if self.logger: self.logger.warning("UMAPI connection timeout...(%d seconds on try %d)",
486486
self.timeout, num_attempts)
487487
checked_result = APIResult(success=False, timeout=0)
488+
except requests.ConnectionError:
489+
if self.logger: self.logger.warning("UMAPI connection error...(%d seconds on try %d)",
490+
self.timeout, num_attempts)
491+
checked_result = APIResult(success=False, timeout=0)
488492

489493
if checked_result.success:
490494
return result
491495

492-
if self.logger: self.logger.warning("UMAPI timeout...service unavailable (code %d on try %d)",
493-
result.status_code, num_attempts)
496+
if self.logger: self.logger.warning("UMAPI timeout...service unavailable (code %s on try %d)",
497+
checked_result.status_code, num_attempts)
494498

495499
retry_wait = checked_result.timeout
496500
if retry_wait <= 0:
@@ -507,4 +511,4 @@ def call():
507511
total_time = int(time() - start_time)
508512
if self.logger: self.logger.error("UMAPI timeout...giving up after %d attempts (%d seconds).",
509513
self.retry_max_attempts, total_time)
510-
raise UnavailableError(self.retry_max_attempts, total_time, result)
514+
raise UnavailableError(self.retry_max_attempts, total_time, checked_result.result)

0 commit comments

Comments
 (0)