@@ -55,11 +55,12 @@ class HTTP(object):
5555
5656 log = log .getChild ("http" )
5757
58- def __init__ (self , request_client : Any = None , is_httpx : bool = False ):
58+ def __init__ (self , sync_client : Any = None , async_client : Any = None , is_httpx : bool = False ):
5959 """Initialize a test instance.
6060 request_client can be any system matching `requests` interfaces
6161 """
62- self .__client = request_client or requests
62+ self .__client = sync_client or requests
63+ self .__async_client = async_client
6364 self .__support_session = hasattr (self .__client , "Session" )
6465 self .__is_httpx = is_httpx
6566
@@ -204,7 +205,146 @@ def options(self, address, **kwargs):
204205 def connect (self , address , ** kwargs ):
205206 return self .request ("CONNECT" , address , ** kwargs )
206207
208+ async def async_request (
209+ self ,
210+ method ,
211+ address ,
212+ session = None ,
213+ params = None ,
214+ headers = None ,
215+ cookies = None ,
216+ data = None ,
217+ json = None ,
218+ files = None ,
219+ encrypted_cert = None ,
220+ allow_redirects = True ,
221+ timeout = 30 ,
222+ ):
223+ """
224+
225+ :param method: str
226+ :param address: str
227+ :return: response
228+ :rtype: HTTPResponse
229+ """
230+ if not self .__async_client :
231+ raise ValueError ("No async client defined" )
232+
233+ http .log .info ("Request: %s %s" , method , address )
234+ msg = "Request: params=%r, headers=%r, cookies=%r, data=%r, json=%r, files=%r, allow_redirects=%r, timeout=%r"
235+ http .log .debug (
236+ msg , params , headers , cookies , data , json , files , allow_redirects , timeout
237+ )
238+
239+ if headers is None :
240+ headers = {}
241+
242+ if "User-Agent" not in headers :
243+ headers ["User-Agent" ] = "Apiritif"
244+
245+ prepared = None
246+
247+ # if session is None and self.__support_session:
248+ # session = requests.Session()
249+
250+ # if session:
251+ # request = requests.Request(
252+ # method,
253+ # address,
254+ # params=params,
255+ # headers=headers,
256+ # cookies=cookies,
257+ # json=json,
258+ # data=data,
259+ # files=files,
260+ # )
261+
262+ # if encrypted_cert is not None:
263+ # certificate_file_path, passphrase = encrypted_cert
264+ # adapter = SSLAdapter(
265+ # certificate_file_path=certificate_file_path,
266+ # passphrase=passphrase,
267+ # )
268+ # session.mount("https://", adapter)
269+
270+ # prepared = session.prepare_request(request)
271+ # settings = session.merge_environment_settings(
272+ # prepared.url, {}, False, False, None
273+ # )
274+
275+ try :
276+ # if session:
277+ # response = session.send(
278+ # prepared, allow_redirects=allow_redirects, timeout=timeout, **settings
279+ # )
280+ # else:
281+ response = await self .__client .request (
282+ method ,
283+ address ,
284+ params = params ,
285+ headers = headers ,
286+ cookies = cookies ,
287+ json = json ,
288+ data = data ,
289+ files = files ,
290+ )
291+ except requests .exceptions .Timeout as exc :
292+ recorder .record_http_request_failure (
293+ method , address , prepared , exc , session
294+ )
295+ raise TimeoutError ("Connection to %s timed out" % address )
296+ except requests .exceptions .ConnectionError as exc :
297+ recorder .record_http_request_failure (
298+ method , address , prepared , exc , session
299+ )
300+ raise ConnectionError ("Connection to %s failed" % address )
301+ except BaseException as exc :
302+ recorder .record_http_request_failure (
303+ method , address , prepared , exc , session
304+ )
305+ raise
306+
307+ http .log .info ("Response: %s %s" , response .status_code , response .reason if not self .__is_httpx else response .reason_phrase )
308+ http .log .debug ("Response headers: %r" , response .headers )
309+ http .log .debug (
310+ "Response cookies: %r" ,
311+ {x : response .cookies .get (x ) for x in response .cookies },
312+ )
313+ http .log .debug ("Response content: \n %s" , response .content )
314+
315+ wrapped_response = HTTPResponse (response , self .__is_httpx )
316+
317+ recorder .record_http_request (
318+ method , address , prepared , wrapped_response , session
319+ )
320+
321+ return wrapped_response
322+
323+ async def get (self , address , ** kwargs ):
324+ return await self .request ("GET" , address , ** kwargs )
325+
326+ async def post (self , address , ** kwargs ):
327+ return await self .request ("POST" , address , ** kwargs )
328+
329+ async def put (self , address , ** kwargs ):
330+ return await self .request ("PUT" , address , ** kwargs )
331+
332+ async def delete (self , address , ** kwargs ):
333+ return await self .request ("DELETE" , address , ** kwargs )
334+
335+ async def patch (self , address , ** kwargs ):
336+ return await self .request ("PATCH" , address , ** kwargs )
337+
338+ async def head (self , address , ** kwargs ):
339+ return await self .request ("HEAD" , address , ** kwargs )
340+
341+ async def options (self , address , ** kwargs ):
342+ return await self .request ("OPTIONS" , address , ** kwargs )
343+
344+ async def connect (self , address , ** kwargs ):
345+ return await self .request ("CONNECT" , address , ** kwargs )
207346
347+
208348http = HTTP ()
209349
210350
0 commit comments