11import requests
22import json
33import time
4+ import logging
45from typing import List
56from urllib .parse import urljoin
7+ from requests .adapters import HTTPAdapter
8+ from requests .packages .urllib3 .util .retry import Retry
9+ requests .packages .urllib3 .add_stderr_logger (logging .WARNING )
610
711from .config import (
812 api_search_endpoint ,
913 api_results_endpoint ,
10- status_check_delay_s
14+ status_check_delay_s ,
15+ http_backoff_factor ,
16+ http_retries ,
17+ http_retries_on_connect
1118)
1219
1320
@@ -41,6 +48,7 @@ def __init__(
4148 self .search_id = search_id
4249 self .base_url = base_url
4350 self .headers = headers
51+ self .http = self .__prepare_http ()
4452 if self .search_id is None :
4553 new_search = self .__run (
4654 targets = targets ,
@@ -59,9 +67,23 @@ def __prepare_payload(self, targets, parameters, starting_materials) -> dict:
5967
6068 return payload
6169
70+ def __prepare_http (self ):
71+ retry_strategy = Retry (
72+ total = http_retries ,
73+ connect = http_retries_on_connect ,
74+ backoff_factor = http_backoff_factor ,
75+ status_forcelist = [104 , 111 , 429 , 500 , 502 , 503 , 504 ],
76+ method_whitelist = ["HEAD" , "GET" , "OPTIONS" , "POST" , "DELETE" , "PUT" ]
77+ )
78+ adapter = HTTPAdapter (max_retries = retry_strategy )
79+ http = requests .Session ()
80+ http .mount ("https://" , adapter )
81+ http .mount ("http://" , adapter )
82+ return http
83+
6284 def __run (self , targets , parameters , starting_materials ):
6385 payload = self .__prepare_payload (targets , parameters , starting_materials )
64- response = requests .post (
86+ response = self . http .post (
6587 urljoin (self .base_url , api_search_endpoint ),
6688 data = json .dumps (payload ),
6789 headers = self .headers ,
@@ -74,7 +96,7 @@ def from_id(cls, base_url, headers, search_id):
7496 return cls (base_url , headers , search_id )
7597
7698 def get_status (self ):
77- response = requests .get (
99+ response = self . http .get (
78100 urljoin (self .base_url , f'{ api_search_endpoint } /{ self .search_id } ' ),
79101 headers = self .headers ,
80102 )
@@ -100,7 +122,7 @@ def get_partial_results(
100122 precision : int = None ,
101123 only : List [str ] = None
102124 ):
103- response = requests .get (
125+ response = self . http .get (
104126 urljoin (self .base_url , f'{ api_results_endpoint } /{ self .search_id } ' ),
105127 headers = self .headers ,
106128 params = {
@@ -112,7 +134,7 @@ def get_partial_results(
112134 return response .json ()
113135
114136 def delete (self ):
115- response = requests .delete (
137+ response = self . http .delete (
116138 urljoin (self .base_url , f'{ api_search_endpoint } /{ self .search_id } ' ),
117139 headers = self .headers ,
118140 )
0 commit comments