http_pool/http1/
sender.rs1use crate::body::VariantBody;
2use hyper::client::conn::http1;
3use hyper::http::uri::InvalidUri;
4use hyper::{Method, Request, Uri, Version, http};
5use std::fmt::Debug;
6use std::ops::{Deref, DerefMut};
7use std::sync::Arc;
8
9pub type SendRequest = http1::SendRequest<VariantBody>;
10
11#[derive(Debug)]
12pub struct Sender {
13 sender: Arc<SendRequest>,
14 base_url: String,
15}
16
17impl Sender {
18 pub fn new(sender: Arc<SendRequest>, base_url: String) -> Self {
19 Sender { sender, base_url }
20 }
21
22 pub fn base_url(&self) -> &String {
23 &self.base_url
24 }
25
26 pub fn new_uri(&self, uri: &Uri) -> Result<Uri, InvalidUri> {
27 crate::utils::new_uri(self.base_url.clone(), uri)
28 }
29
30 fn sender(&self) -> &SendRequest {
31 &self.sender
32 }
33
34 fn sender_mut(&mut self) -> &mut SendRequest {
35 unsafe { &mut *(Arc::as_ptr(&self.sender) as *mut _) }
37 }
38}
39
40impl Deref for Sender {
41 type Target = SendRequest;
42
43 fn deref(&self) -> &Self::Target {
44 self.sender()
45 }
46}
47
48impl DerefMut for Sender {
49 fn deref_mut(&mut self) -> &mut Self::Target {
50 self.sender_mut()
51 }
52}
53
54pub fn request_builder<T>(uri: T, method: Method) -> http::request::Builder
56where
57 T: TryInto<Uri>,
58 <T as TryInto<Uri>>::Error: Into<http::Error>,
59{
60 let uri = TryInto::<Uri>::try_into(uri).unwrap_or(Uri::from_static("/"));
61 let host = uri.host().unwrap_or("").to_string();
62
63 Request::builder()
64 .version(Version::HTTP_11)
65 .method(method)
66 .uri(uri)
67 .header(hyper::header::USER_AGENT, "proxy/0.1")
68 .header(hyper::header::HOST, host)
69}