Skip to content

Commit 1fa3700

Browse files
author
Titouan
committed
feat: Support async client (Without Session)
1 parent 22ee811 commit 1fa3700

1 file changed

Lines changed: 142 additions & 2 deletions

File tree

apiritif/http.py

Lines changed: 142 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
208348
http = HTTP()
209349

210350

0 commit comments

Comments
 (0)