|
|
@@ -97,6 +97,17 @@ pub struct AddrMangle();
|
|
97
|
97
|
|
|
98
|
98
|
impl AddrMangle {
|
|
99
|
99
|
pub fn encode(addr: SocketAddr) -> Vec<u8> {
|
|
|
100
|
+ // not work with [:1]:<port>
|
|
|
101
|
+ let addr = match addr {
|
|
|
102
|
+ SocketAddr::V6(v6) => {
|
|
|
103
|
+ if let Some(v4) = v6.ip().to_ipv4() {
|
|
|
104
|
+ SocketAddr::new(IpAddr::V4(v4), addr.port())
|
|
|
105
|
+ } else {
|
|
|
106
|
+ addr
|
|
|
107
|
+ }
|
|
|
108
|
+ }
|
|
|
109
|
+ _ => addr,
|
|
|
110
|
+ };
|
|
100
|
111
|
match addr {
|
|
101
|
112
|
SocketAddr::V4(addr_v4) => {
|
|
102
|
113
|
let tm = (SystemTime::now()
|
|
|
@@ -269,9 +280,29 @@ pub fn get_time() -> i64 {
|
|
269
|
280
|
.unwrap_or(0) as _
|
|
270
|
281
|
}
|
|
271
|
282
|
|
|
|
283
|
+#[inline]
|
|
|
284
|
+pub fn is_ipv4_str(id: &str) -> bool {
|
|
|
285
|
+ regex::Regex::new(r"^\d+\.\d+\.\d+\.\d+(:\d+)?$")
|
|
|
286
|
+ .unwrap()
|
|
|
287
|
+ .is_match(id)
|
|
|
288
|
+}
|
|
|
289
|
+
|
|
|
290
|
+#[inline]
|
|
|
291
|
+pub fn is_ipv6_str(id: &str) -> bool {
|
|
|
292
|
+ regex::Regex::new(r"^((([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4})|(\[([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4}\]:\d+))$")
|
|
|
293
|
+ .unwrap()
|
|
|
294
|
+ .is_match(id)
|
|
|
295
|
+}
|
|
|
296
|
+
|
|
|
297
|
+#[inline]
|
|
|
298
|
+pub fn is_ip_str(id: &str) -> bool {
|
|
|
299
|
+ is_ipv4_str(id) || is_ipv6_str(id)
|
|
|
300
|
+}
|
|
|
301
|
+
|
|
272
|
302
|
#[cfg(test)]
|
|
273
|
|
-mod tests {
|
|
|
303
|
+mod test {
|
|
274
|
304
|
use super::*;
|
|
|
305
|
+
|
|
275
|
306
|
#[test]
|
|
276
|
307
|
fn test_mangle() {
|
|
277
|
308
|
let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 16, 32), 21116));
|
|
|
@@ -293,30 +324,6 @@ mod tests {
|
|
293
|
324
|
"failed"
|
|
294
|
325
|
);
|
|
295
|
326
|
}
|
|
296
|
|
-}
|
|
297
|
|
-
|
|
298
|
|
-#[inline]
|
|
299
|
|
-pub fn is_ipv4_str(id: &str) -> bool {
|
|
300
|
|
- regex::Regex::new(r"^\d+\.\d+\.\d+\.\d+(:\d+)?$")
|
|
301
|
|
- .unwrap()
|
|
302
|
|
- .is_match(id)
|
|
303
|
|
-}
|
|
304
|
|
-
|
|
305
|
|
-#[inline]
|
|
306
|
|
-pub fn is_ipv6_str(id: &str) -> bool {
|
|
307
|
|
- regex::Regex::new(r"^((([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4})|(\[([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4}\]:\d+))$")
|
|
308
|
|
- .unwrap()
|
|
309
|
|
- .is_match(id)
|
|
310
|
|
-}
|
|
311
|
|
-
|
|
312
|
|
-#[inline]
|
|
313
|
|
-pub fn is_ip_str(id: &str) -> bool {
|
|
314
|
|
- is_ipv4_str(id) || is_ipv6_str(id)
|
|
315
|
|
-}
|
|
316
|
|
-
|
|
317
|
|
-#[cfg(test)]
|
|
318
|
|
-mod test_lib {
|
|
319
|
|
- use super::*;
|
|
320
|
327
|
|
|
321
|
328
|
#[test]
|
|
322
|
329
|
fn test_ipv6() {
|
|
|
@@ -333,4 +340,18 @@ mod test_lib {
|
|
333
|
340
|
assert_eq!(is_ipv6_str("[1:2::0]:"), false);
|
|
334
|
341
|
assert_eq!(is_ipv6_str("1:2::0]:1"), false);
|
|
335
|
342
|
}
|
|
|
343
|
+
|
|
|
344
|
+ #[test]
|
|
|
345
|
+ fn test_mangle2() {
|
|
|
346
|
+ let addr = "[::ffff:127.0.0.1]:8080".parse().unwrap();
|
|
|
347
|
+ let addr_v4 = "127.0.0.1:8080".parse().unwrap();
|
|
|
348
|
+ assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr)), addr_v4);
|
|
|
349
|
+ assert_eq!(
|
|
|
350
|
+ AddrMangle::decode(&AddrMangle::encode("[::127.0.0.1]:8080".parse().unwrap())),
|
|
|
351
|
+ addr_v4
|
|
|
352
|
+ );
|
|
|
353
|
+ assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr_v4)), addr_v4);
|
|
|
354
|
+ let addr_v6 = "[ef::fe]:8080".parse().unwrap();
|
|
|
355
|
+ assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr_v6)), addr_v6);
|
|
|
356
|
+ }
|
|
336
|
357
|
}
|