@@ -71,27 +71,35 @@ def set_api_key(self, host, api_key, param_name=u'api_key'):
7171 raise NotImplementedError (
7272 u"%s: Method not implemented" , self .__class__ .__name__ )
7373
74- def setup (self , request_params ):
75- """Store the request params for calling later.
76-
74+ def start_request (self , request_params ):
75+ """
7776 :param request_params: Complete request data.
7877 :type request_params: dict
78+
79+ :returns: The client's request object
7980 """
8081 raise NotImplementedError (
8182 u"%s: Method not implemented" , self .__class__ .__name__ )
8283
83- def wait (self , timeout ):
84+ def wait (self , timeout , request ):
8485 """Calls the API with request_params and waits till timeout.
8586
8687 :param timeout: time in seconds to wait for response.
8788 :type timeout: float
89+ :param request: request object from the client
90+ In the Sync client this is a requests.Request
91+ In the Async client this is a crochet.EventualResult
8892 :return: Implementation specific response
8993 """
9094 raise NotImplementedError (
9195 u"%s: Method not implemented" , self .__class__ .__name__ )
9296
93- def cancel (self ):
97+ def cancel (self , request ):
9498 """Cancels the API call
99+
100+ :param request: request object from the client
101+ In the Sync client this is a requests.Request
102+ In the Async client this is a crochet.EventualResult
95103 """
96104 raise NotImplementedError (
97105 u"%s: Method not implemented" , self .__class__ .__name__ )
@@ -143,6 +151,8 @@ def __init__(self, host, username, password):
143151 def apply (self , request ):
144152 request .auth = self .auth
145153
154+ return request
155+
146156
147157# noinspection PyDocstring
148158class ApiKeyAuthenticator (Authenticator ):
@@ -162,6 +172,7 @@ def __init__(self, host, api_key, param_name=u'api_key'):
162172
163173 def apply (self , request ):
164174 request .params [self .param_name ] = self .api_key
175+ return request
165176
166177
167178class SynchronousHttpClient (HttpClient ):
@@ -175,14 +186,21 @@ def __init__(self):
175186 def close (self ):
176187 self .session .close ()
177188
178- def setup (self , request_params ):
189+ def start_request (self , request_params ):
190+ """
191+ :return: request
192+ :rtype: requests.Request
193+ """
179194 # if files in request_params OR
180195 # if content-type is x-www-form-urlencoded, no need to stringify
181196 if ('files' not in request_params and
182197 request_params ['headers' ].get ('content-type' ) != APP_FORM ):
183198 stringify_body (request_params )
184- self .request_params = request_params
185- self .purge_content_types_if_file_present ()
199+ request_params = self .purge_content_types_if_file_present (
200+ request_params ,
201+ )
202+
203+ return self .authenticated_request (request_params )
186204
187205 def set_basic_auth (self , host , username , password ):
188206 self .authenticator = BasicAuthenticator (
@@ -192,31 +210,35 @@ def set_api_key(self, host, api_key, param_name=u'api_key'):
192210 self .authenticator = ApiKeyAuthenticator (
193211 host = host , api_key = api_key , param_name = param_name )
194212
195- def wait (self , timeout ):
213+ def wait (self , timeout , request ):
196214 """Requests based implemention with timeout.
197215
198216 :param timeout: time in seconds to wait for response
217+ :param request: requests.Request
218+
199219 :return: Requests response
200220 :rtype: requests.Response
201221 """
202- log .info (u"%s %s(%r)" , self .request_params ['method' ],
203- self .request_params ['url' ],
204- self .request_params ['params' ])
205- req = requests .Request (** self .request_params )
206- self .apply_authentication (req )
207- return self .session .send (self .session .prepare_request (req ),
208- timeout = timeout )
222+ log .info (u"%s %s(%r)" , request .method , request .url , request .params )
223+ return self .session .send (
224+ self .session .prepare_request (request ),
225+ timeout = timeout ,
226+ )
209227
210- def purge_content_types_if_file_present (self ):
228+ def purge_content_types_if_file_present (self , request_params ):
211229 """'Requests' adds 'multipart/form-data' to content-type if
212230 files are in the request. Hence, any existing content-type
213231 like application/x-www-form... should be removed
214232 """
215- if 'files' in self . request_params :
216- self . request_params ['headers' ].pop ('content-type' , '' )
233+ if 'files' in request_params :
234+ request_params ['headers' ].pop ('content-type' , '' )
217235
218- def cancel (self ):
236+ return request_params
237+
238+ def cancel (self , request ):
219239 """Nothing to be done for Synchronous client
240+
241+ :param request: requests.Request
220242 """
221243
222244 def request (self , method , url , params = None , data = None , headers = None ):
@@ -227,16 +249,20 @@ def request(self, method, url, params=None, data=None, headers=None):
227249 """
228250 if not headers :
229251 headers = {}
230- kwargs = {}
252+ request_params = {}
231253 for i in ('method' , 'url' , 'params' , 'data' , 'headers' ):
232- kwargs [i ] = locals ()[i ]
233- req = requests .Request (** kwargs )
234- self .apply_authentication (req )
235- return self .session .send (self .session .prepare_request (req ))
236-
237- def apply_authentication (self , req ):
238- if self .authenticator and self .authenticator .matches (req .url ):
239- self .authenticator .apply (req )
254+ request_params [i ] = locals ()[i ]
255+ request = self .authenticated_request (request_params )
256+ return self .session .send (self .session .prepare_request (request ))
257+
258+ def authenticated_request (self , request_params ):
259+ return self .apply_authentication (requests .Request (** request_params ))
260+
261+ def apply_authentication (self , request ):
262+ if self .authenticator and self .authenticator .matches (request .url ):
263+ return self .authenticator .apply (request )
264+
265+ return request
240266
241267
242268def stringify_body (request_params ):
0 commit comments