openzeppelin_relayer/utils/
url.rs1pub fn mask_url(url: &str) -> String {
17 let Some(scheme_end) = url.find("://") else {
19 return "***".to_string();
21 };
22
23 let host_start = scheme_end + 3; let rest = &url[host_start..];
26
27 if let Some(path_start) = rest.find('/') {
29 let path_and_beyond = &rest[path_start..];
31 if path_and_beyond.len() > 1 || url.contains('?') {
32 let host_end = host_start + path_start;
34 format!("{}/***", &url[..host_end])
35 } else {
36 url.to_string()
38 }
39 } else if url.contains('?') {
40 let query_start = url.find('?').unwrap();
42 format!("{}?***", &url[..query_start])
43 } else {
44 url.to_string()
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn test_mask_url_alchemy_with_api_key() {
55 let url = "https://eth-mainnet.g.alchemy.com/v2/abc123xyz";
56 let masked = mask_url(url);
57 assert_eq!(masked, "https://eth-mainnet.g.alchemy.com/***");
58 }
59
60 #[test]
61 fn test_mask_url_infura_with_project_id() {
62 let url = "https://mainnet.infura.io/v3/my-project-id";
63 let masked = mask_url(url);
64 assert_eq!(masked, "https://mainnet.infura.io/***");
65 }
66
67 #[test]
68 fn test_mask_url_quicknode_with_api_key() {
69 let url = "https://my-node.quiknode.pro/secret-api-key/";
70 let masked = mask_url(url);
71 assert_eq!(masked, "https://my-node.quiknode.pro/***");
72 }
73
74 #[test]
75 fn test_mask_url_localhost_no_path() {
76 let url = "http://localhost:8545";
78 let masked = mask_url(url);
79 assert_eq!(masked, "http://localhost:8545");
80 }
81
82 #[test]
83 fn test_mask_url_localhost_with_trailing_slash() {
84 let url = "http://localhost:8545/";
86 let masked = mask_url(url);
87 assert_eq!(masked, "http://localhost:8545/");
88 }
89
90 #[test]
91 fn test_mask_url_with_query_params() {
92 let url = "https://rpc.example.com/v1?api_key=secret123&network=mainnet";
93 let masked = mask_url(url);
94 assert_eq!(masked, "https://rpc.example.com/***");
95 }
96
97 #[test]
98 fn test_mask_url_query_params_no_path() {
99 let url = "https://rpc.example.com?api_key=secret123";
100 let masked = mask_url(url);
101 assert_eq!(masked, "https://rpc.example.com?***");
102 }
103
104 #[test]
105 fn test_mask_url_invalid_url_no_scheme() {
106 let url = "invalid-url";
108 let masked = mask_url(url);
109 assert_eq!(masked, "***");
110 }
111
112 #[test]
113 fn test_mask_url_empty_string() {
114 let url = "";
115 let masked = mask_url(url);
116 assert_eq!(masked, "***");
117 }
118
119 #[test]
120 fn test_mask_url_with_port_and_path() {
121 let url = "https://rpc.example.com:8080/api/v1/secret";
122 let masked = mask_url(url);
123 assert_eq!(masked, "https://rpc.example.com:8080/***");
124 }
125
126 #[test]
127 fn test_mask_url_ankr_with_api_key() {
128 let url = "https://rpc.ankr.com/eth/my-api-key-here";
129 let masked = mask_url(url);
130 assert_eq!(masked, "https://rpc.ankr.com/***");
131 }
132}