@@ -118,7 +118,14 @@ async def getDetails(self, ip_address=None):
118118
119119 return Details (details )
120120
121- async def getBatchDetails (self , ip_addresses , batch_size = None ):
121+ async def getBatchDetails (
122+ self ,
123+ ip_addresses ,
124+ batch_size = None ,
125+ timeout_per_batch = BATCH_REQ_TIMEOUT_DEFAULT ,
126+ timeout_total = None ,
127+ raise_on_fail = True ,
128+ ):
122129 """
123130 Get details for a batch of IP addresses at once.
124131
@@ -158,31 +165,48 @@ async def getBatchDetails(self, ip_addresses, batch_size=None):
158165 else :
159166 lookup_addresses .append (ip_address )
160167
168+ # all in cache - return early.
169+ if len (lookup_addresses ) == 0 :
170+ return result
171+
172+ # do start timer if necessary
173+ if timeout_total is not None :
174+ start_time = time .time ()
175+
161176 # loop over batch chunks and prepare coroutines for each.
177+ url = API_URL + "/batch"
178+ headers = handler_utils .get_headers (self .access_token )
179+ headers ["content-type" ] = "application/json"
162180 reqs = []
163- for i in range (0 , len (ip_addresses ), batch_size ):
164- chunk = ip_addresses [i : i + batch_size ]
165-
166- # all in cache - return early.
167- if len (lookup_addresses ) == 0 :
168- return result
181+ for i in range (0 , len (lookup_addresses ), batch_size ):
182+ chunk = lookup_addresses [i : i + batch_size ]
169183
170184 # do http req
171- url = API_URL + "/batch"
172- headers = handler_utils .get_headers (self .access_token )
173- headers ["content-type" ] = "application/json"
174185 reqs .append (
175186 self .httpsess .post (
176- url , data = json .dumps (lookup_addresses ), headers = headers
187+ url ,
188+ data = json .dumps (chunk ),
189+ headers = headers ,
190+ timeout = timeout_per_batch ,
177191 )
178192 )
179193
180- resps = await asyncio .gather (* reqs )
194+ resps = await asyncio .wait_for (
195+ asyncio .gather (* reqs , return_exceptions = raise_on_fail ),
196+ timeout_total
197+ )
181198 for resp in resps :
182199 # gather data
183- if resp .status == 429 :
184- raise RequestQuotaExceededError ()
185- resp .raise_for_status ()
200+ try :
201+ if resp .status == 429 :
202+ raise RequestQuotaExceededError ()
203+ resp .raise_for_status ()
204+ except Exception as e :
205+ if raise_on_fail :
206+ raise e
207+ else :
208+ return result
209+
186210 json_resp = await resp .json ()
187211
188212 # format & fill up cache
0 commit comments