4545MAX_API_KEY_LENGTH = 500
4646
4747
48+ class RequestOptions :
49+ HEADERS = {
50+ 'forwardedFor' : 'X-Forwarded-For' ,
51+ 'algoliaUserID' : 'X-Algolia-User-ID'
52+ }
53+
54+ def __init__ (self , options ):
55+ self .headers = {}
56+ self .parameters = {}
57+
58+ for k , v in options .items ():
59+ if k in self .HEADERS :
60+ self .headers [self .HEADERS [k ]] = v
61+ else :
62+ self .parameters [k ] = v
63+
64+
4865class Client (object ):
4966 """
5067 Entry point in the Python Client API.
@@ -214,7 +231,8 @@ def multipleQueries(self, queries, index_name_key='indexName'):
214231
215232 def multiple_queries (self , queries ,
216233 index_name_key = 'indexName' ,
217- strategy = 'none' ):
234+ strategy = 'none' ,
235+ request_options = None ):
218236 """This method allows to query multiple indexes with one API call."""
219237 path = '/1/indexes/*/queries'
220238
@@ -228,48 +246,48 @@ def multiple_queries(self, queries,
228246 })
229247
230248 data = {'requests' : requests , 'strategy' : strategy }
231- return self ._req (True , path , 'POST' , data = data )
249+ return self ._req (True , path , 'POST' , request_options , data = data )
232250
233- def batch (self , requests ):
251+ def batch (self , requests , request_options = None ):
234252 """Send a batch request targeting multiple indices."""
235253 if isinstance (requests , (list , tuple )):
236254 requests = {'requests' : requests }
237255
238256 path = '/1/indexes/*/batch'
239- return self ._req (False , path , 'POST' , data = requests )
257+ return self ._req (False , path , 'POST' , request_options , data = requests )
240258
241259 @deprecated
242260 def listIndexes (self ):
243261 return self .list_indexes ()
244262
245- def list_indexes (self ):
263+ def list_indexes (self , request_options = None ):
246264 """
247265 List all existing indexes.
248266 Return an object of the form:
249267 {'items': [{ 'name': 'contacts', 'created_at': '2013-01-18T15:33:13.556Z'},
250268 {'name': 'notes', 'created_at': '2013-01-18T15:33:13.556Z'}]}
251269 """
252- return self ._req (True , '/1/indexes' , 'GET' )
270+ return self ._req (True , '/1/indexes' , 'GET' , request_options )
253271
254272 @deprecated
255273 def deleteIndex (self , index_name ):
256274 return self .delete_index (index_name )
257275
258- def delete_index (self , index_name ):
276+ def delete_index (self , index_name , request_options = None ):
259277 """
260278 Delete an index.
261279 Return an object of the form: {'deleted_at': '2013-01-18T15:33:13.556Z'}
262280
263281 @param index_name the name of index to delete
264282 """
265283 path = '/1/indexes/%s' % safe (index_name )
266- return self ._req (False , path , 'DELETE' )
284+ return self ._req (False , path , 'DELETE' , request_options )
267285
268286 @deprecated
269287 def moveIndex (self , src_index_name , dst_index_name ):
270288 return self .move_index (src_index_name , dst_index_name )
271289
272- def move_index (self , src_index_name , dst_index_name ):
290+ def move_index (self , src_index_name , dst_index_name , request_options = None ):
273291 """
274292 Move an existing index.
275293
@@ -279,13 +297,13 @@ def move_index(self, src_index_name, dst_index_name):
279297 """
280298 path = '/1/indexes/%s/operation' % safe (src_index_name )
281299 request = {'operation' : 'move' , 'destination' : dst_index_name }
282- return self ._req (False , path , 'POST' , data = request )
300+ return self ._req (False , path , 'POST' , request_options , data = request )
283301
284302 @deprecated
285303 def copyIndex (self , src_index_name , dst_index_name ):
286304 return self .copy_index (src_index_name , dst_index_name )
287305
288- def copy_index (self , src_index_name , dst_index_name ):
306+ def copy_index (self , src_index_name , dst_index_name , request_options = None ):
289307 """
290308 Copy an existing index.
291309
@@ -295,13 +313,13 @@ def copy_index(self, src_index_name, dst_index_name):
295313 """
296314 path = '/1/indexes/%s/operation' % safe (src_index_name )
297315 request = {'operation' : 'copy' , 'destination' : dst_index_name }
298- return self ._req (False , path , 'POST' , data = request )
316+ return self ._req (False , path , 'POST' , request_options , data = request )
299317
300318 @deprecated
301319 def getLogs (self , offset = 0 , length = 10 , type = 'all' ):
302320 return self .get_logs (offset , length , type )
303321
304- def get_logs (self , offset = 0 , length = 10 , type = 'all' ):
322+ def get_logs (self , offset = 0 , length = 10 , type = 'all' , request_options = None ):
305323 """
306324 Return last logs entries.
307325
@@ -311,7 +329,7 @@ def get_logs(self, offset=0, length=10, type='all'):
311329 starting at offset. Maximum allowed value: 1000.
312330 """
313331 params = {'offset' : offset , 'length' : length , 'type' : type }
314- return self ._req (False , '/1/logs' , 'GET' , params )
332+ return self ._req (False , '/1/logs' , 'GET' , request_options , params )
315333
316334 @deprecated
317335 def initIndex (self , index_name ):
@@ -335,9 +353,9 @@ def list_user_keys(self):
335353 """Use `list_api_keys`"""
336354 return self .list_api_keys ()
337355
338- def list_api_keys (self ):
356+ def list_api_keys (self , request_options = None ):
339357 """List all existing api keys with their associated ACLs."""
340- return self ._req (True , '/1/keys' , 'GET' )
358+ return self ._req (True , '/1/keys' , 'GET' , request_options )
341359
342360 @deprecated
343361 def getUserKeyACL (self , key ):
@@ -348,10 +366,10 @@ def get_user_key_acl(self, key):
348366 """Use `get_api_key_acl`"""
349367 return self .get_api_key_acl (key )
350368
351- def get_api_key_acl (self , key ):
369+ def get_api_key_acl (self , key , request_options = None ):
352370 """'Get ACL of an api key."""
353371 path = '/1/keys/%s' % key
354- return self ._req (True , path , 'GET' )
372+ return self ._req (True , path , 'GET' , request_options )
355373
356374 @deprecated
357375 def deleteUserKey (self , key ):
@@ -362,10 +380,10 @@ def delete_user_key(self, key):
362380 """Use `delete_api_key`"""
363381 return self .delete_api_key (key )
364382
365- def delete_api_key (self , key ):
383+ def delete_api_key (self , key , request_options = None ):
366384 """Delete an existing api key."""
367385 path = '/1/keys/%s' % key
368- return self ._req (False , path , 'DELETE' )
386+ return self ._req (False , path , 'DELETE' , request_options )
369387
370388 @deprecated
371389 def addUserKey (self , obj ,
@@ -392,7 +410,8 @@ def add_api_key(self, obj,
392410 validity = 0 ,
393411 max_queries_per_ip_per_hour = 0 ,
394412 max_hits_per_query = 0 ,
395- indexes = None ):
413+ indexes = None ,
414+ request_options = None ):
396415 """
397416 Create a new api key.
398417
@@ -435,7 +454,7 @@ def add_api_key(self, obj,
435454 if indexes :
436455 obj ['indexes' ] = indexes
437456
438- return self ._req (False , '/1/keys' , 'POST' , data = obj )
457+ return self ._req (False , '/1/keys' , 'POST' , request_options , data = obj )
439458
440459 @deprecated
441460 def update_user_key (self , key , obj ,
@@ -454,7 +473,8 @@ def update_api_key(self, key, obj,
454473 validity = None ,
455474 max_queries_per_ip_per_hour = None ,
456475 max_hits_per_query = None ,
457- indexes = None ):
476+ indexes = None ,
477+ request_options = None ):
458478 """
459479 Update a api key.
460480
@@ -500,7 +520,7 @@ def update_api_key(self, key, obj,
500520 obj ['indexes' ] = indexes
501521
502522 path = '/1/keys/%s' % key
503- return self ._req (False , path , 'PUT' , data = obj )
523+ return self ._req (False , path , 'PUT' , request_options , data = obj )
504524
505525 @deprecated
506526 def generateSecuredApiKey (self , private_api_key , tag_filters ,
@@ -534,16 +554,16 @@ def generate_secured_api_key(self, private_api_key, queryParameters,
534554 securedKey = hmac .new (private_api_key .encode ('utf-8' ), queryParameters .encode ('utf-8' ), hashlib .sha256 ).hexdigest ()
535555 return str (base64 .b64encode (("%s%s" % (securedKey , queryParameters )).encode ('utf-8' )).decode ('utf-8' ))
536556
537- def is_alive (self ):
557+ def is_alive (self , request_options = None ):
538558 """
539559 Test if the server is alive.
540560 This performs a simple application-level ping. If up and running, the server answers with a basic message.
541561 """
542- return self ._req (True , '/1/isalive' , 'GET' )
562+ return self ._req (True , '/1/isalive' , 'GET' , request_options )
543563
544- def _req (self , is_search , path , meth , params = None , data = None ):
564+ def _req (self , is_search , path , meth , request_options , params = None , data = None ):
545565 if len (self .api_key ) > MAX_API_KEY_LENGTH :
546566 if data is None :
547567 data = {}
548568 data ['apiKey' ] = self .api_key
549- return self ._transport .req (is_search , path , meth , params , data )
569+ return self ._transport .req (is_search , path , meth , params , data , request_options )
0 commit comments