cloudillo_proxy/
protocol.rs1use std::net::SocketAddr;
4
5pub fn proxy_protocol_v1_header(client_addr: &SocketAddr, server_addr: &SocketAddr) -> String {
10 let proto = if client_addr.is_ipv4() { "TCP4" } else { "TCP6" };
11 format!(
12 "PROXY {} {} {} {} {}\r\n",
13 proto,
14 client_addr.ip(),
15 server_addr.ip(),
16 client_addr.port(),
17 server_addr.port(),
18 )
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24 use std::net::{Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6};
25
26 #[test]
27 fn test_proxy_protocol_v1_ipv4() {
28 let client = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 1, 100), 12345));
29 let server = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(10, 0, 0, 1), 8080));
30 let header = proxy_protocol_v1_header(&client, &server);
31 assert_eq!(header, "PROXY TCP4 192.168.1.100 10.0.0.1 12345 8080\r\n");
32 }
33
34 #[test]
35 fn test_proxy_protocol_v1_ipv6() {
36 let client = SocketAddr::V6(SocketAddrV6::new(Ipv6Addr::LOCALHOST, 12345, 0, 0));
37 let server = SocketAddr::V6(SocketAddrV6::new(Ipv6Addr::LOCALHOST, 8080, 0, 0));
38 let header = proxy_protocol_v1_header(&client, &server);
39 assert_eq!(header, "PROXY TCP6 ::1 ::1 12345 8080\r\n");
40 }
41}
42
43