1818import sys
1919import urllib .parse
2020from abc import ABC , abstractmethod
21+
22+ from tenacity import retry , stop_after_attempt , wait_exponential , retry_if_exception
23+
2124from typing import Union
2225
2326import 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+
7590class 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+
0 commit comments