use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
use reqwest_middleware::RequestBuilder;
use crate::error::{Error, Result};
#[derive(Debug, Clone, Default)]
pub(crate) struct Headers {
map: HeaderMap,
error: Option<String>,
}
impl Headers {
pub(crate) fn insert(&mut self, name: impl AsRef<str>, value: impl AsRef<str>) {
if self.error.is_some() {
return;
}
let name = match HeaderName::from_bytes(name.as_ref().as_bytes()) {
Ok(name) => name,
Err(e) => {
self.error = Some(format!("{:?}: {e}", name.as_ref()));
return;
}
};
match HeaderValue::from_str(value.as_ref()) {
Ok(value) => {
self.map.insert(name, value);
}
Err(e) => self.error = Some(format!("{name}: {e}")),
}
}
#[cfg(feature = "tracing")]
pub(crate) fn request_id(&self) -> Option<&str> {
self.map.get("x-request-id").and_then(|v| v.to_str().ok())
}
pub(crate) fn apply(&self, mut req: RequestBuilder) -> Result<RequestBuilder> {
if let Some(error) = &self.error {
return Err(Error::invalid_message(format!("invalid header {error}")));
}
for (name, value) in &self.map {
req = req.header(name.clone(), value.clone());
}
Ok(req)
}
pub(crate) fn into_map(self) -> Result<HeaderMap> {
match self.error {
Some(error) => Err(Error::invalid_message(format!("invalid header {error}"))),
None => Ok(self.map),
}
}
}