use bytes::Bytes;
use http::{HeaderMap, Method, Uri};
use reqwest::Client;
use std::sync::Arc;
pub struct HedgedRequest {
method: Arc<Method>,
url: Arc<Uri>,
url_str: Arc<String>,
headers: Arc<HeaderMap>,
body: Bytes,
}
impl Clone for HedgedRequest {
fn clone(&self) -> Self {
Self {
method: Arc::clone(&self.method),
url: Arc::clone(&self.url),
url_str: Arc::clone(&self.url_str),
headers: Arc::clone(&self.headers),
body: self.body.clone(),
}
}
}
impl HedgedRequest {
pub fn new(method: Method, url: Uri, headers: HeaderMap, body: Bytes) -> Self {
let url_str = url.to_string();
Self {
method: Arc::new(method),
url: Arc::new(url),
url_str: Arc::new(url_str),
headers: Arc::new(headers),
body,
}
}
pub fn method(&self) -> &Method {
&self.method
}
pub fn url(&self) -> &Uri {
&self.url
}
pub fn headers(&self) -> &HeaderMap {
&self.headers
}
pub fn body(&self) -> &Bytes {
&self.body
}
pub fn to_reqwest(&self, client: &Client) -> Result<reqwest::Request, reqwest::Error> {
client
.request(self.method.as_ref().clone(), self.url_str.as_str())
.headers(self.headers.as_ref().clone())
.body(self.body.clone())
.build()
}
}