arminius_lib_component/
request_source.rs1mod tests;
8
9use std::net::IpAddr;
10
11use crate::error::{InternalServerError, ResultExt as _};
12
13#[derive(Debug)]
15pub struct RequestSource(pub Option<IpAddr>);
16
17impl<S> axum::extract::FromRequestParts<S> for RequestSource
18where
19 S: Send + Sync,
20{
21 type Rejection = InternalServerError;
26
27 async fn from_request_parts(
28 parts: &mut axum::http::request::Parts,
29 _: &S,
30 ) -> Result<Self, InternalServerError> {
31 let Some(forwarded_for) = parts.headers.get("X-Forwarded-For") else {
32 return Ok(Self(None));
33 };
34 let addr: IpAddr = forwarded_for
35 .to_str()
36 .unrecoverable_error("Could not parse X-Forwarded-For header as ASCII")?
37 .parse()
38 .unrecoverable_error("Could not parse X-Forwarded-For header as address")?;
39 Ok(Self(Some(addr)))
40 }
41}