pub fn get_client_ip(headers: &http::HeaderMap, extensions: &http::Extensions) -> String {
if let Some(forwarded_for) = headers.get("x-forwarded-for")
&& let Ok(value) = forwarded_for.to_str()
&& let Some(client_ip) = value.split(',').next()
{
return client_ip.trim().to_string();
}
if let Some(real_ip) = headers.get("x-real-ip")
&& let Ok(value) = real_ip.to_str()
{
return value.to_string();
}
if let Some(connect_info) = extensions.get::<axum::extract::ConnectInfo<std::net::SocketAddr>>()
{
return connect_info.0.ip().to_string();
}
if let Some(remote_addr) = extensions.get::<std::net::SocketAddr>() {
return remote_addr.ip().to_string();
}
"unknown".to_string()
}