hafas_rs/requester/
hyper.rs

1use crate::{Requester, Result};
2use async_trait::async_trait;
3use hyper::client::HttpConnector;
4use hyper::{Body, Method, Request};
5use hyper_rustls::{HttpsConnector, HttpsConnectorBuilder};
6use std::collections::HashMap;
7
8pub struct HyperRustlsRequester(hyper::Client<HttpsConnector<HttpConnector>, Body>);
9
10#[cfg_attr(feature = "rt-multi-thread", async_trait)]
11#[cfg_attr(not(feature = "rt-multi-thread"), async_trait(?Send))]
12impl Requester for HyperRustlsRequester {
13    async fn request(
14        &self,
15        url: String,
16        body: String,
17        headers: HashMap<&str, &str>,
18    ) -> Result<Vec<u8>> {
19        log::trace!(
20            "Request: URL: {}, Body: {}, Headers: {:?}",
21            url,
22            body,
23            headers
24        );
25        let mut req = Request::builder().method(Method::POST).uri(url);
26
27        for (k, v) in headers {
28            req = req.header(k, v);
29        }
30
31        let req = req.body(Body::from(body)).unwrap();
32
33        let (_parts, resp_body) = self.0.request(req).await?.into_parts();
34        let bytes = hyper::body::to_bytes(resp_body).await?;
35        Ok(bytes.to_vec())
36    }
37}
38
39impl HyperRustlsRequester {
40    pub fn new() -> Self {
41        let https = HttpsConnectorBuilder::new()
42            .with_native_roots()
43            .https_or_http()
44            .enable_http1()
45            .build();
46        let client = hyper::Client::builder().build(https);
47        Self(client)
48    }
49}
50
51impl Default for HyperRustlsRequester {
52    fn default() -> Self {
53        Self::new()
54    }
55}