Skip to content

Commit dd2bbf1

Browse files
authored
Merge pull request #55 from smartystreets/eric/fix-retry-logic
Eric/fix retry logic
2 parents 2772737 + 7296c52 commit dd2bbf1

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

smartystreets_python_sdk/retry_sender.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
class RetrySender:
77
MAX_BACKOFF_DURATION = 10
8-
STATUS_OK = 200
98
TOO_MANY_REQUESTS = 429
9+
STATUS_TO_RETRY = [408, 500, 502, 503, 504]
10+
1011

1112
def __init__(self, max_retries, inner):
1213
self.inner = inner
@@ -16,9 +17,6 @@ def send(self, request):
1617
response = self.inner.send(request)
1718

1819
for i in range(self.max_retries):
19-
if response.status_code == RetrySender.STATUS_OK:
20-
break
21-
2220
if response.status_code == RetrySender.TOO_MANY_REQUESTS:
2321
backoff_seconds = 10
2422
retry_after = response.getHeader("Retry-After")
@@ -27,8 +25,10 @@ def send(self, request):
2725
backoff_seconds = int(retry_after)
2826

2927
backoff(backoff_seconds, True)
30-
else:
28+
elif response.status_code in RetrySender.STATUS_TO_RETRY:
3129
backoff(i)
30+
else:
31+
break
3232

3333
response = self.inner.send(request)
3434

test/retry_sender_test.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,17 @@ def test_success_does_not_retry(self, mocked):
2222

2323
self.assertEqual(1, inner.current_status_code_index)
2424

25+
@patch('smartystreets_python_sdk.retry_sender.backoff', side_effect=mock_backoff)
26+
def test_payment_required_does_not_retry(self, mocked):
27+
inner = FailingSender([402])
28+
29+
send_with_retry(5, inner)
30+
31+
self.assertEqual(1, inner.current_status_code_index)
32+
2533
@patch('smartystreets_python_sdk.retry_sender.backoff', side_effect=mock_backoff)
2634
def test_retry_until_success(self, mocked):
27-
inner = FailingSender([401, 402, 400, 200, 500])
35+
inner = FailingSender([408, 500, 502, 200, 504])
2836

2937
send_with_retry(10, inner)
3038

@@ -43,7 +51,7 @@ def test_return_response_if_retry_limit_exceeded(self, mocked):
4351

4452
@patch('smartystreets_python_sdk.retry_sender.backoff', side_effect=mock_backoff)
4553
def test_backoff_does_not_exceed_max(self, mocked):
46-
inner = FailingSender([401, 402, 400, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 200])
54+
inner = FailingSender([408, 408, 408, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 200])
4755

4856
send_with_retry(20, inner)
4957

0 commit comments

Comments
 (0)