use objectstore_types::metadata::Metadata;
use reqwest::StatusCode;
use crate::response::ResponseExt as _;
use crate::{ObjectKey, Session};
pub type HeadResponse = Option<Metadata>;
impl Session {
pub fn head(&self, key: &str) -> HeadBuilder {
HeadBuilder {
session: self.clone(),
key: key.to_owned(),
}
}
}
#[derive(Debug)]
pub struct HeadBuilder {
pub(crate) session: Session,
pub(crate) key: ObjectKey,
}
impl HeadBuilder {
pub async fn send(self) -> crate::Result<HeadResponse> {
let response = self
.session
.request(reqwest::Method::HEAD, &self.key)?
.send()
.await?;
if response.status() == StatusCode::NOT_FOUND {
response.drain_body().await;
return Ok(None);
}
let response = response.error_for_status_and_drain().await?;
let metadata = Metadata::from_headers(response.headers(), "");
response.drain_body().await;
Ok(Some(metadata?))
}
}