use std::{convert::Infallible, net::IpAddr};
use actix_web::{
error,
http::header::{self, Header, HeaderName, HeaderValue, TryIntoHeaderValue},
HttpMessage,
};
#[allow(clippy::declare_interior_mutable_const)]
pub const CF_CONNECTING_IP: HeaderName = HeaderName::from_static("cf-connecting-ip");
#[derive(Debug, Clone)]
pub enum CfConnectingIp {
Trusted(IpAddr),
Untrusted(IpAddr),
}
impl CfConnectingIp {
pub fn ip(&self) -> IpAddr {
match self {
Self::Trusted(ip) => *ip,
Self::Untrusted(ip) => *ip,
}
}
}
impl_more::impl_display_enum!(
CfConnectingIp,
Trusted(ip) => "{ip}",
Untrusted(ip) => "{ip}",
);
impl TryIntoHeaderValue for CfConnectingIp {
type Error = Infallible;
fn try_into_value(self) -> Result<HeaderValue, Self::Error> {
Ok(self.ip().to_string().parse().unwrap())
}
}
impl Header for CfConnectingIp {
fn name() -> HeaderName {
CF_CONNECTING_IP
}
fn parse<M: HttpMessage>(msg: &M) -> Result<Self, error::ParseError> {
let ip = header::from_one_raw_str(msg.headers().get(Self::name()))?;
Ok(Self::Untrusted(ip))
}
}