Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion b2sdk/_internal/exception.py
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,12 @@ class ServiceError(TransientErrorMixin, B2Error):
Used for HTTP status codes 500 through 599.
"""

def __init__(self, *args, retry_after_seconds=None):
super().__init__(*args)

if retry_after_seconds is not None:
self.retry_after_seconds = int(retry_after_seconds)


class CapExceeded(B2Error):
def __str__(self):
Expand Down Expand Up @@ -753,5 +759,8 @@ def interpret_b2_error(
elif status == 429:
return TooManyRequests(retry_after_seconds=response_headers.get('retry-after'))
elif 500 <= status < 600:
return ServiceError('%d %s %s' % (status, code, message))
return ServiceError(
'%d %s %s' % (status, code, message),
retry_after_seconds=response_headers.get('retry-after'),
)
return UnknownError('%d %s %s' % (status, code, message))
1 change: 1 addition & 0 deletions changelog.d/606.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed honoring the Retry-After header on 5xx service errors.
9 changes: 9 additions & 0 deletions test/unit/test_exception.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,15 @@ def test_too_many_requests_without_retry_after_header(self):
error = self._check_one(TooManyRequests, 429, '', '', {})
assert error.retry_after_seconds is None

def test_service_error_with_retry_after_header(self):
retry_after = 200
error = self._check_one(ServiceError, 503, '', '', {'retry-after': retry_after})
assert error.retry_after_seconds == retry_after

def test_service_error_without_retry_after_header(self):
error = self._check_one(ServiceError, 503, '', '', {})
assert error.retry_after_seconds is None

@pytest.mark.apiver(
from_ver=3
) # previous apivers throw this as well, but BucketIdNotFound is a different class in them
Expand Down
Loading