Skip to main content

cloudillo_proxy/
protocol.rs

1//! PROXY protocol v1 framing
2
3use std::net::SocketAddr;
4
5/// Build a PROXY protocol v1 header line.
6///
7/// Format: `PROXY TCP4 <src_ip> <dst_ip> <src_port> <dst_port>\r\n`
8/// or `PROXY TCP6` for IPv6.
9pub 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// vim: ts=4