hafas_rs/requester/
hyper.rs1use 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}