88import platform
99from json import JSONDecodeError
1010from requests .adapters import HTTPAdapter
11- from requests . packages . urllib3 .util . retry import Retry
11+ from urllib3 .util import Retry
1212import requests
1313from requests .exceptions import Timeout , HTTPError
14-
14+ import logging
1515import contentstack
1616
17+ log = logging .getLogger (__name__ )
18+
1719
18- def get_os_platform ():
20+ def __get_os_platform ():
1921 """ returns client platform """
2022 os_platform = platform .system ()
2123 if os_platform == 'Darwin' :
@@ -31,38 +33,54 @@ def get_os_platform():
3133def user_agents ():
3234 """User Agents for the Https"""
3335 header = {'sdk' : dict (name = contentstack .__package__ , version = contentstack .__version__ ),
34- 'os' : get_os_platform ,
36+ 'os' : __get_os_platform ,
3537 'Content-Type' : 'application/json' }
3638 package = "contentstack-python/{}" .format (contentstack .__version__ )
3739 return {'User-Agent' : str (header ), "X-User-Agent" : package }
3840
3941
4042class HTTPSConnection : # R0903: Too few public methods
4143 """Make Https Request to fetch the result as per requested url"""
44+ # BACKOFF_MAX = 120
4245
43- def __init__ (self , endpoint , headers ):
46+ def __init__ (self , endpoint , headers , timeout , retry_strategy ):
4447 if None not in (endpoint , headers ):
4548 self .payload = None
4649 self .endpoint = endpoint
4750 self .headers = headers
48- self .default_timeout = 10
51+ self .timeout = timeout
52+ self .retry_strategy = retry_strategy # default timeout (period=30) seconds
4953
5054 def get (self , url ):
5155 """
52- Here we create a response object ‘ response’ which will store the request-response.
56+ Here we create a response object, ` response` which will store the request-response.
5357 We use requests.get method since we are sending a GET request.
5458 The four arguments we pass are url, verify(ssl), timeout, headers
5559 """
5660 try :
5761 self .headers .update (user_agents ())
62+
63+ # Setting up custom retry adapter
5864 session = requests .Session ()
59- retry = Retry (connect = 3 , backoff_factor = 0.5 )
60- adapter = HTTPAdapter (max_retries = retry )
65+ # retry on 429 rate limit exceeded
66+ # Diagnosing a 408 request timeout
67+ # backoff_factor works on algorithm {backoff factor} * (2 ** ({number of total retries} - 1))
68+ # This value is by default 0, meaning no exponential backoff will be set and
69+ # retries will immediately execute. Make sure to set this to 1 in to avoid hammering your servers!.
70+ # retries = Retry(total=5, backoff_factor=1, status_forcelist=[408, 429], allowed_methods=["GET"])
71+
72+ adapter = HTTPAdapter (max_retries = self .retry_strategy )
6173 session .mount ('https://' , adapter )
62- response = session .get (url , verify = True , headers = self .headers )
63- # response = requests.get(url, verify=True, headers=self.headers)
64- response .encoding = 'utf-8'
65- return response .json ()
74+ log .info ('url: %s' , url )
75+ response = session .get (url , verify = True , headers = self .headers , timeout = self .timeout )
76+ if response .encoding is None :
77+ response .encoding = 'utf-8'
78+
79+ if response is not None :
80+ return response .json ()
81+ else :
82+ return {"error" : "Unknown error" , "error_code" : 000 , "error_message" : "Unknown error" }
83+
6684 except Timeout :
6785 raise TimeoutError ('The request timed out' )
6886 except ConnectionError :
@@ -72,6 +90,3 @@ def get(self, url):
7290 except HTTPError :
7391 raise HTTPError ('Http Error Occurred' )
7492
75- def update_connection_timeout (self , timeout : int ):
76- """Facilitate to update timeout for the https request"""
77- self .default_timeout = timeout
0 commit comments