Skip to content

Commit 8e5bcc3

Browse files
Add retry mechanism on server errors
1 parent 9fdfc6a commit 8e5bcc3

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

ipregistry/request.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import sys
1919
import urllib.parse
2020
from abc import ABC, abstractmethod
21+
22+
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception
23+
2124
from typing import Union
2225

2326
import requests
@@ -72,7 +75,21 @@ def _build_base_url(self, resource, options):
7275
return result
7376

7477

78+
def is_server_error(exception):
79+
return isinstance(exception, ApiError) and (exception.code == 'INTERNAL')
80+
81+
82+
retry_on_server_error = retry(
83+
stop=stop_after_attempt(3),
84+
wait=wait_exponential(multiplier=1, min=0.5, max=3),
85+
retry=retry_if_exception(is_server_error),
86+
reraise=True
87+
)
88+
89+
7590
class DefaultRequestHandler(IpregistryRequestHandler):
91+
92+
@retry_on_server_error
7693
def batch_lookup_asns(self, asns, options):
7794
response = None
7895
try:
@@ -96,6 +113,7 @@ def batch_lookup_asns(self, asns, options):
96113
except Exception as e:
97114
raise ClientError(e)
98115

116+
@retry_on_server_error
99117
def batch_lookup_ips(self, ips, options):
100118
response = None
101119
try:
@@ -119,6 +137,7 @@ def batch_lookup_ips(self, ips, options):
119137
except Exception as e:
120138
raise ClientError(e)
121139

140+
@retry_on_server_error
122141
def batch_parse_user_agents(self, user_agents, options):
123142
response = None
124143
try:
@@ -142,6 +161,7 @@ def batch_parse_user_agents(self, user_agents, options):
142161
except Exception as e:
143162
raise ClientError(e)
144163

164+
@retry_on_server_error
145165
def lookup_asn(self, asn, options):
146166
response = None
147167
try:
@@ -163,6 +183,7 @@ def lookup_asn(self, asn, options):
163183
except Exception as err:
164184
raise ClientError(err)
165185

186+
@retry_on_server_error
166187
def lookup_ip(self, ip, options):
167188
response = None
168189
try:
@@ -184,9 +205,11 @@ def lookup_ip(self, ip, options):
184205
except Exception as err:
185206
raise ClientError(err)
186207

208+
@retry_on_server_error
187209
def origin_lookup_ip(self, options):
188210
return self.lookup_ip('', options)
189211

212+
@retry_on_server_error
190213
def origin_parse_user_agent(self, options):
191214
response = None
192215
try:
@@ -259,3 +282,4 @@ def __headers(self):
259282
python_version +
260283
"; +https://github.com/ipregistry/ipregistry-python)"
261284
}
285+

poetry.lock

Lines changed: 16 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ cachetools = '^5.3.3'
2525
pydantic = "^2.7.3"
2626
python = '>=3.8'
2727
requests = '^2.32.3'
28+
tenacity = "^8.3.0"
2829

2930
[tool.poetry.dev-dependencies]
3031
pytest = '>=6.2.5'

0 commit comments

Comments
 (0)