use crate::service::{Layer, Service};
use conjure_error::Error;
use http::header::SERVER;
use http::{HeaderValue, Response};
use witchcraft_server_config::install::InstallConfig;
pub struct ServerHeaderLayer {
value: HeaderValue,
}
impl ServerHeaderLayer {
pub fn new(config: &InstallConfig) -> Result<Self, Error> {
let value = HeaderValue::try_from(format!(
"{}/{}",
config.product_name(),
config.product_version()
))
.map_err(Error::internal_safe)?;
Ok(ServerHeaderLayer { value })
}
}
impl<S> Layer<S> for ServerHeaderLayer {
type Service = ServerHeaderService<S>;
fn layer(self, inner: S) -> Self::Service {
ServerHeaderService {
inner,
value: self.value,
}
}
}
pub struct ServerHeaderService<S> {
inner: S,
value: HeaderValue,
}
impl<S, R, B> Service<R> for ServerHeaderService<S>
where
S: Service<R, Response = Response<B>> + Sync,
R: Send,
{
type Response = S::Response;
async fn call(&self, req: R) -> Self::Response {
let mut response = self.inner.call(req).await;
response.headers_mut().insert(SERVER, self.value.clone());
response
}
}