Skip to main content

secure_exec_sidecar_core/
net.rs

1use serde_json::{json, Value};
2use std::net::SocketAddr;
3
4pub fn socket_addr_family(addr: &SocketAddr) -> &'static str {
5    match addr {
6        SocketAddr::V4(_) => "IPv4",
7        SocketAddr::V6(_) => "IPv6",
8    }
9}
10
11pub fn socket_address_value(addr: &SocketAddr) -> Value {
12    json!({
13        "address": addr.ip().to_string(),
14        "family": socket_addr_family(addr),
15        "port": addr.port(),
16    })
17}
18
19pub fn local_endpoint_value(addr: &SocketAddr) -> Value {
20    json!({
21        "localAddress": addr.ip().to_string(),
22        "localPort": addr.port(),
23        "family": socket_addr_family(addr),
24    })
25}
26
27pub fn remote_endpoint_value(addr: &SocketAddr, port: u16) -> Value {
28    json!({
29        "remoteAddress": addr.ip().to_string(),
30        "remotePort": port,
31        "remoteFamily": socket_addr_family(addr),
32    })
33}
34
35pub fn tcp_socket_info_value(local: &SocketAddr, remote: &SocketAddr) -> Value {
36    json!({
37        "localAddress": local.ip().to_string(),
38        "localPort": local.port(),
39        "localFamily": socket_addr_family(local),
40        "remoteAddress": remote.ip().to_string(),
41        "remotePort": remote.port(),
42        "remoteFamily": socket_addr_family(remote),
43    })
44}
45
46pub fn unix_socket_info_value(local_path: Option<&str>, remote_path: Option<&str>) -> Value {
47    json!({
48        "localPath": local_path,
49        "remotePath": remote_path,
50    })
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56    use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
57
58    #[test]
59    fn formats_socket_families() {
60        assert_eq!(
61            socket_addr_family(&SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 1)),
62            "IPv4"
63        );
64        assert_eq!(
65            socket_addr_family(&SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 1)),
66            "IPv6"
67        );
68    }
69
70    #[test]
71    fn formats_tcp_socket_info() {
72        let local = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 1234);
73        let remote = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(10, 0, 0, 1)), 80);
74
75        assert_eq!(
76            tcp_socket_info_value(&local, &remote),
77            json!({
78                "localAddress": "127.0.0.1",
79                "localPort": 1234,
80                "localFamily": "IPv4",
81                "remoteAddress": "10.0.0.1",
82                "remotePort": 80,
83                "remoteFamily": "IPv4",
84            })
85        );
86    }
87
88    #[test]
89    fn formats_unix_socket_info() {
90        assert_eq!(
91            unix_socket_info_value(Some("/tmp/server.sock"), Some("/tmp/client.sock")),
92            json!({
93                "localPath": "/tmp/server.sock",
94                "remotePath": "/tmp/client.sock",
95            })
96        );
97    }
98}