use crate::body::VariantBody;
use hyper::body::Incoming;
use hyper::client::conn::{TrySendError, http2};
use hyper::http::uri::InvalidUri;
use hyper::{Method, Request, Response, Uri, Version, http};
use std::fmt::Debug;
use std::sync::Arc;
pub type SendRequest = http2::SendRequest<VariantBody>;
#[derive(Debug)]
pub struct Sender {
sender: SendRequest,
base_url: String,
_ref_cnt: Arc<()>,
}
impl Sender {
pub(crate) fn new(sender: SendRequest, base_url: String, ref_cnt: Arc<()>) -> Self {
Sender {
sender,
base_url,
_ref_cnt: ref_cnt,
}
}
pub fn base_url(&self) -> &String {
&self.base_url
}
pub fn new_uri(&self, uri: &Uri) -> Result<Uri, InvalidUri> {
crate::utils::new_uri(self.base_url.clone(), uri)
}
pub fn is_ready(&self) -> bool {
self.sender.is_ready()
}
pub fn is_closed(&self) -> bool {
self.sender.is_closed()
}
pub fn send_request(
&mut self,
req: Request<VariantBody>,
) -> impl Future<Output = hyper::Result<Response<Incoming>>> {
self.sender.send_request(req)
}
pub fn try_send_request(
&mut self,
req: Request<VariantBody>,
) -> impl Future<Output = Result<Response<Incoming>, TrySendError<Request<VariantBody>>>> {
self.sender.try_send_request(req)
}
}
pub fn request_builder<T>(uri: T, method: Method) -> http::request::Builder
where
T: TryInto<Uri>,
<T as TryInto<Uri>>::Error: Into<http::Error>,
{
Request::builder()
.version(Version::HTTP_2)
.method(method)
.uri(uri)
.header(hyper::header::USER_AGENT, "proxy/0.1")
}