@@ -22,6 +22,9 @@ pub enum HttpServerRequest {
2222 channel_id : u32 ,
2323 #[ serde( default ) ]
2424 source_socket_addr : Option < String > ,
25+ /// IP address from proxy headers (X-Forwarded-For, X-Real-IP, Cf-Connecting-Ip)
26+ #[ serde( default ) ]
27+ forwarded_for : Option < String > ,
2528 } ,
2629 /// Processes can both SEND and RECEIVE this kind of [`crate::Request`]
2730 /// (send as [`HttpServerAction::WebSocketPush`]).
@@ -993,13 +996,16 @@ impl HttpServer {
993996 path : & str ,
994997 channel_id : u32 ,
995998 source_socket_addr : Option < String > ,
999+ forwarded_for : Option < String > ,
9961000 ) {
9971001 self . ws_channels
9981002 . entry ( path. to_string ( ) )
9991003 . or_insert ( HashSet :: new ( ) )
10001004 . insert ( channel_id) ;
1001- if let Some ( addr) = source_socket_addr {
1002- self . ws_channel_addrs . insert ( channel_id, addr) ;
1005+ // Store the client IP, preferring forwarded_for (from proxy headers) over socket addr
1006+ let client_ip = forwarded_for. or ( source_socket_addr) ;
1007+ if let Some ( ip) = client_ip {
1008+ self . ws_channel_addrs . insert ( channel_id, ip) ;
10031009 }
10041010 }
10051011
@@ -1047,8 +1053,9 @@ impl HttpServer {
10471053 path,
10481054 channel_id,
10491055 source_socket_addr,
1056+ forwarded_for,
10501057 } => {
1051- self . handle_websocket_open ( & path, channel_id, source_socket_addr) ;
1058+ self . handle_websocket_open ( & path, channel_id, source_socket_addr, forwarded_for ) ;
10521059 }
10531060 HttpServerRequest :: WebSocketClose ( channel_id) => {
10541061 self . handle_websocket_close ( channel_id) ;
0 commit comments