ruma_client/http_client/
reqwest.rs

1use std::mem;
2
3use bytes::{Bytes, BytesMut};
4
5use super::{DefaultConstructibleHttpClient, HttpClient};
6
7/// The `reqwest` crate's `Client`.
8pub type Reqwest = reqwest::Client;
9
10impl HttpClient for Reqwest {
11    type RequestBody = BytesMut;
12    type ResponseBody = Bytes;
13    type Error = reqwest::Error;
14
15    async fn send_http_request(
16        &self,
17        req: http::Request<BytesMut>,
18    ) -> Result<http::Response<Bytes>, reqwest::Error> {
19        let req = req.map(|body| body.freeze()).try_into()?;
20        let mut res = self.execute(req).await?;
21
22        let mut http_builder =
23            http::Response::builder().status(res.status()).version(res.version());
24        mem::swap(
25            http_builder.headers_mut().expect("http::response::Builder to be usable"),
26            res.headers_mut(),
27        );
28
29        Ok(http_builder.body(res.bytes().await?).expect("http::Response construction to work"))
30    }
31}
32
33impl DefaultConstructibleHttpClient for Reqwest {
34    fn default() -> Self {
35        reqwest::Client::new()
36    }
37}