use http::header::{HeaderName, HeaderValue};
use serde::{Deserialize, Serialize};
use tower_http::set_header::{SetRequestHeaderLayer, SetResponseHeaderLayer};
use super::ApplyLayer;
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct Header {
name: String,
value: String,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(tag = "set_header_mode")]
pub enum SetHeaderConfig {
Overriding(Header),
Appending(Header),
IfNotPresent(Header),
}
pub fn response_from_config(config: SetHeaderConfig) -> anyhow::Result<impl ApplyLayer> {
Ok(match config {
SetHeaderConfig::Overriding(Header { name, value }) => SetResponseHeaderLayer::overriding(
HeaderName::try_from(name)?,
HeaderValue::try_from(value)?,
),
SetHeaderConfig::Appending(Header { name, value }) => SetResponseHeaderLayer::appending(
HeaderName::try_from(name)?,
HeaderValue::try_from(value)?,
),
SetHeaderConfig::IfNotPresent(Header { name, value }) => {
SetResponseHeaderLayer::if_not_present(
HeaderName::try_from(name)?,
HeaderValue::try_from(value)?,
)
}
})
}
pub fn request_from_config(config: SetHeaderConfig) -> anyhow::Result<impl ApplyLayer> {
Ok(match config {
SetHeaderConfig::Overriding(Header { name, value }) => SetRequestHeaderLayer::overriding(
HeaderName::try_from(name)?,
HeaderValue::try_from(value)?,
),
SetHeaderConfig::Appending(Header { name, value }) => SetRequestHeaderLayer::appending(
HeaderName::try_from(name)?,
HeaderValue::try_from(value)?,
),
SetHeaderConfig::IfNotPresent(Header { name, value }) => {
SetRequestHeaderLayer::if_not_present(
HeaderName::try_from(name)?,
HeaderValue::try_from(value)?,
)
}
})
}