pretend_awc/
lib.rs

1//! `awc` based `pretend` client
2
3#![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/// `awc` based `pretend` client
15#[derive(Clone, Default)]
16pub struct Client {
17    client: AClient,
18}
19
20impl Client {
21    /// Constructor with custom client
22    ///
23    /// This constructor creates a client implementation
24    /// for `pretend` wrapping the supplied `awc` client.
25    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}