1#![warn(missing_docs)]
4#![forbid(unsafe_code)]
5
6pub use awc;
7
8use awc::http::{HeaderName, HeaderValue};
9use awc::Client as AClient;
10use pretend::client::{async_trait, Bytes, LocalClient, Method};
11use pretend::http::header::{HeaderName as PHeaderName, HeaderValue as PHeaderValue};
12use pretend::{Error, HeaderMap, Response, Result, Url};
13
14#[derive(Clone, Default)]
16pub struct Client {
17 client: AClient,
18}
19
20impl Client {
21 pub fn new(client: AClient) -> Self {
26 Client { client }
27 }
28}
29
30#[async_trait(?Send)]
31impl LocalClient for Client {
32 async fn execute(
33 &self,
34 method: Method,
35 url: Url,
36 headers: HeaderMap,
37 body: Option<Bytes>,
38 ) -> Result<Response<Bytes>> {
39 let mut request = self.client.request(method, url.as_str());
40 for (name, value) in headers.iter() {
41 request = request.set_header(name, value.as_bytes());
42 }
43
44 let future = if let Some(body) = body {
45 request.send_body(body.to_vec())
46 } else {
47 request.send()
48 };
49
50 let mut response = future.await.map_err(Error::response)?;
51 let status = response.status();
52 let headers = response.headers();
53 let headers = headers.iter().map(create_header).collect::<HeaderMap>();
54 let future = response.body();
55 let result = future.await.map_err(Error::body)?;
56 Ok(Response::new(status, headers, Bytes::from(result.to_vec())))
57 }
58}
59
60fn create_header((name, value): (&HeaderName, &HeaderValue)) -> (PHeaderName, PHeaderValue) {
61 (PHeaderName::from(name), PHeaderValue::from(value))
62}