@@ -20,7 +20,7 @@ use colored::Colorize;
2020use sentry_tower:: SentryHttpLayer ;
2121use serde_json:: json;
2222use sha1:: Digest ;
23- use std:: { sync:: Arc , time:: Instant } ;
23+ use std:: { net :: IpAddr , sync:: Arc , time:: Instant } ;
2424use tokio:: sync:: RwLock ;
2525use tower:: Layer ;
2626use tower_http:: {
@@ -51,12 +51,9 @@ fn handle_panic(_err: Box<dyn std::any::Any + Send + 'static>) -> Response<Body>
5151}
5252
5353fn handle_request ( req : & Request < Body > , _span : & tracing:: Span ) {
54- let ip = req
55- . headers ( )
56- . get ( "x-real-ip" )
57- . or_else ( || req. headers ( ) . get ( "x-forwarded-for" ) )
58- . map ( |ip| ip. to_str ( ) . unwrap_or_default ( ) )
59- . unwrap_or_default ( ) ;
54+ let ip = extract_ip ( req. headers ( ) )
55+ . map ( |ip| ip. to_string ( ) )
56+ . unwrap_or_else ( || "unknown" . to_string ( ) ) ;
6057
6158 logger:: log (
6259 logger:: LoggerLevel :: Info ,
@@ -105,6 +102,27 @@ async fn handle_etag(req: Request, next: Next) -> Result<Response, StatusCode> {
105102 Ok ( Response :: from_parts ( parts, Body :: from ( body_bytes) ) )
106103}
107104
105+ #[ inline]
106+ pub fn extract_ip ( headers : & HeaderMap ) -> Option < IpAddr > {
107+ let ip = headers
108+ . get ( "x-real-ip" )
109+ . or_else ( || headers. get ( "x-forwarded-for" ) )
110+ . map ( |ip| ip. to_str ( ) . unwrap_or_default ( ) )
111+ . unwrap_or_default ( ) ;
112+
113+ if ip. is_empty ( ) {
114+ return None ;
115+ }
116+
117+ let ip = if ip. contains ( ',' ) {
118+ ip. split ( ',' ) . next ( ) . unwrap_or_default ( ) . trim ( ) . to_string ( )
119+ } else {
120+ ip. to_string ( )
121+ } ;
122+
123+ ip. parse ( ) . ok ( )
124+ }
125+
108126#[ tokio:: main]
109127async fn main ( ) {
110128 let env = env:: Env :: parse ( ) ;
0 commit comments