Skip to content

Commit 41f25ce

Browse files
committed
http: add forwarded_for to WebSocketOpen for proxy IP support
1 parent 2453cc6 commit 41f25ce

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

src/http/server.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)