1111import time
1212
1313import requests
14+ from requests .adapters import HTTPAdapter
15+ from urllib3 .util .retry import Retry
1416
1517from SoftLayer import consts
1618from SoftLayer import exceptions
3840}
3941
4042
43+ def get_session (user_agent ):
44+ """Sets up urllib sessions"""
45+
46+ client = requests .Session ()
47+ client .headers .update ({
48+ 'Content-Type' : 'application/json' ,
49+ 'User-Agent' : user_agent ,
50+ })
51+ retry = Retry (connect = 3 , backoff_factor = 3 )
52+ adapter = HTTPAdapter (max_retries = retry )
53+ client .mount ('https://' , adapter )
54+ return client
55+
56+
4157class Request (object ):
4258 """Transport request object."""
4359
@@ -107,6 +123,15 @@ def __init__(self, endpoint_url=None, timeout=None, proxy=None, user_agent=None,
107123 self .proxy = proxy
108124 self .user_agent = user_agent or consts .USER_AGENT
109125 self .verify = verify
126+ self ._client = None
127+
128+ @property
129+ def client (self ):
130+ """Returns client session object"""
131+
132+ if self ._client is None :
133+ self ._client = get_session (self .user_agent )
134+ return self ._client
110135
111136 def __call__ (self , request ):
112137 """Makes a SoftLayer API call against the XML-RPC endpoint.
@@ -154,13 +179,13 @@ def __call__(self, request):
154179 LOGGER .debug (payload )
155180
156181 try :
157- resp = requests .request ('POST' , url ,
158- data = payload ,
159- headers = request .transport_headers ,
160- timeout = self .timeout ,
161- verify = verify ,
162- cert = request .cert ,
163- proxies = _proxies_dict (self .proxy ))
182+ resp = self . client .request ('POST' , url ,
183+ data = payload ,
184+ headers = request .transport_headers ,
185+ timeout = self .timeout ,
186+ verify = verify ,
187+ cert = request .cert ,
188+ proxies = _proxies_dict (self .proxy ))
164189 LOGGER .debug ("=== RESPONSE ===" )
165190 LOGGER .debug (resp .headers )
166191 LOGGER .debug (resp .content )
@@ -208,6 +233,15 @@ def __init__(self, endpoint_url=None, timeout=None, proxy=None, user_agent=None,
208233 self .proxy = proxy
209234 self .user_agent = user_agent or consts .USER_AGENT
210235 self .verify = verify
236+ self ._client = None
237+
238+ @property
239+ def client (self ):
240+ """Returns client session object"""
241+
242+ if self ._client is None :
243+ self ._client = get_session (self .user_agent )
244+ return self ._client
211245
212246 def __call__ (self , request ):
213247 """Makes a SoftLayer API call against the REST endpoint.
@@ -217,9 +251,6 @@ def __call__(self, request):
217251
218252 :param request request: Request object
219253 """
220- request .transport_headers .setdefault ('Content-Type' , 'application/json' )
221- request .transport_headers .setdefault ('User-Agent' , self .user_agent )
222-
223254 params = request .headers .copy ()
224255 if request .mask :
225256 params ['objectMask' ] = _format_object_mask (request .mask )
@@ -275,15 +306,15 @@ def __call__(self, request):
275306 LOGGER .debug (request .transport_headers )
276307 LOGGER .debug (raw_body )
277308 try :
278- resp = requests .request (method , url ,
279- auth = auth ,
280- headers = request .transport_headers ,
281- params = params ,
282- data = raw_body ,
283- timeout = self .timeout ,
284- verify = verify ,
285- cert = request .cert ,
286- proxies = _proxies_dict (self .proxy ))
309+ resp = self . client .request (method , url ,
310+ auth = auth ,
311+ headers = request .transport_headers ,
312+ params = params ,
313+ data = raw_body ,
314+ timeout = self .timeout ,
315+ verify = verify ,
316+ cert = request .cert ,
317+ proxies = _proxies_dict (self .proxy ))
287318 LOGGER .debug ("=== RESPONSE ===" )
288319 LOGGER .debug (resp .headers )
289320 LOGGER .debug (resp .text )
@@ -339,13 +370,11 @@ def __call__(self, call):
339370 module_path = 'SoftLayer.fixtures.%s' % call .service
340371 module = importlib .import_module (module_path )
341372 except ImportError :
342- raise NotImplementedError ('%s fixture is not implemented'
343- % call .service )
373+ raise NotImplementedError ('%s fixture is not implemented' % call .service )
344374 try :
345375 return getattr (module , call .method )
346376 except AttributeError :
347- raise NotImplementedError ('%s::%s fixture is not implemented'
348- % (call .service , call .method ))
377+ raise NotImplementedError ('%s::%s fixture is not implemented' % (call .service , call .method ))
349378
350379
351380def _proxies_dict (proxy ):
0 commit comments