Skip to content

Commit

Permalink
Fix retrying sender (#333)
Browse files Browse the repository at this point in the history
  • Loading branch information
felix-hilden committed Dec 4, 2024
1 parent c20692b commit 114ddd7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
2 changes: 2 additions & 0 deletions docs/src/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ Added
Fixed
*****
- Avoid constructing query params manually (:issue:`332`)
- Fix :class:`RetryingSender` to not return ``None``` in
complex retry scenarios (:issue:`333`)

5.5.1 (2024-09-09)
------------------
Expand Down
30 changes: 14 additions & 16 deletions src/tekore/_sender/extending.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,47 +81,45 @@ def __repr__(self):
contains = f"(retries={self.retries}, sender={self.sender!r})"
return type(self).__name__ + contains

def send(
self, request: Request
) -> Response | Coroutine[None, None, Response] | None:
def send(self, request: Request) -> Response | Coroutine[None, None, Response]:
"""Delegate request to underlying sender and retry if failed."""
if self.is_async:
return self._async_send(request)

tries = self.retries + 1
retries = max(self.retries, 0)
delay_seconds = 1

while tries > 0:
while True:
r = self.sender.send(request)

if r.status_code == 429:
seconds = r.headers.get("Retry-After", 1)
time.sleep(int(seconds) + 1)
elif r.status_code >= 500 and tries > 1:
tries -= 1
elif r.status_code >= 500 and retries > 0:
retries -= 1
time.sleep(delay_seconds)
delay_seconds *= 2
else:
return r
return None
break
return r

async def _async_send(self, request: Request) -> Response | None:
tries = self.retries + 1
async def _async_send(self, request: Request) -> Response:
retries = max(self.retries, 0)
delay_seconds = 1

while tries > 0:
while True:
r = await self.sender.send(request)

if r.status_code == 429:
seconds = r.headers.get("Retry-After", 1)
await asyncio.sleep(int(seconds) + 1)
elif r.status_code >= 500 and tries > 1:
tries -= 1
elif r.status_code >= 500 and retries > 0:
retries -= 1
await asyncio.sleep(delay_seconds)
delay_seconds *= 2
else:
return r
return None
break
return r


class CachingSender(ExtendingSender):
Expand Down

0 comments on commit 114ddd7

Please sign in to comment.