httproxide 0.2.0

Rusted HTTP router reverse-proxy
Documentation
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)?,
            )
        }
    })
}