Remove Transport::nat_traversal and refactor multiaddr. (#1052)

The functionality is available through `Multiaddr::replace`.
What we currently call "nat_traversal" is merley a replacement of an IP
address prefix in a `Multiaddr`, hence it can be done directly on
`Multiaddr` values instead of having to go through a `Transport`.

In addition this PR consolidates changes made to `Multiaddr` in
previous commits which resulted in lots of deprecations. It adds some
more (see below for the complete list of API changes) and removes all
deprecated functionality, requiring a minor version bump.

Here are the changes to `multiaddr` compared to the currently published
version:

1.  Removed `into_bytes` (use `to_vec` instead).
2.  Renamed `to_bytes` to `to_vec`.
3.  Removed `from_bytes` (use the `TryFrom` impl instead).
4.  Added `with_capacity`.
5.  Added `len`.
6.  Removed `as_slice` (use `AsRef` impl instead).
7.  Removed `encapsulate` (use `push` or `with` instead).
8.  Removed `decapsulate` (use `pop` instead).
9.  Renamed `append` to `push`.
10. Added `with`.
11. Added `replace`.
12. Removed `ToMultiaddr` trait (use `TryFrom` instead).
This commit is contained in:
Toralf Wittner
2019-04-17 20:12:31 +02:00
committed by GitHub
parent a4173705db
commit ca58f8029c
33 changed files with 494 additions and 803 deletions

View File

@ -209,26 +209,6 @@ impl Transport for TcpConfig {
Ok(future)
}
fn nat_traversal(&self, server: &Multiaddr, observed: &Multiaddr) -> Option<Multiaddr> {
let mut address = Multiaddr::empty();
// Use the observed IP address.
match server.iter().zip(observed.iter()).next() {
Some((Protocol::Ip4(_), x @ Protocol::Ip4(_))) => address.append(x),
Some((Protocol::Ip6(_), x @ Protocol::Ip4(_))) => address.append(x),
Some((Protocol::Ip4(_), x @ Protocol::Ip6(_))) => address.append(x),
Some((Protocol::Ip6(_), x @ Protocol::Ip6(_))) => address.append(x),
_ => return None
}
// Carry over everything else from the server address.
for proto in server.iter().skip(1) {
address.append(proto)
}
Some(address)
}
}
// This type of logic should probably be moved into the multiaddr package
@ -702,46 +682,4 @@ mod tests {
.unwrap();
assert!(tcp.listen_on(addr).is_err());
}
#[test]
fn nat_traversal() {
let tcp = TcpConfig::new();
let server = "/ip4/127.0.0.1/tcp/10000".parse::<Multiaddr>().unwrap();
let observed = "/ip4/80.81.82.83/tcp/25000".parse::<Multiaddr>().unwrap();
let out = tcp.nat_traversal(&server, &observed);
assert_eq!(
out.unwrap(),
"/ip4/80.81.82.83/tcp/10000".parse::<Multiaddr>().unwrap()
);
}
#[test]
fn nat_traversal_ipv6_to_ipv4() {
let tcp = TcpConfig::new();
let server = "/ip6/::1/tcp/10000".parse::<Multiaddr>().unwrap();
let observed = "/ip4/80.81.82.83/tcp/25000".parse::<Multiaddr>().unwrap();
let out = tcp.nat_traversal(&server, &observed);
assert_eq!(
out.unwrap(),
"/ip4/80.81.82.83/tcp/10000".parse::<Multiaddr>().unwrap()
);
}
#[test]
fn nat_traversal_ipv4_to_ipv6() {
let tcp = TcpConfig::new();
let server = "/ip4/127.0.0.1/tcp/10000".parse::<Multiaddr>().unwrap();
let observed = "/ip6/2001:db8::1/tcp/25000".parse::<Multiaddr>().unwrap();
let out = tcp.nat_traversal(&server, &observed);
assert_eq!(
out.unwrap(),
"/ip6/2001:db8::1/tcp/10000".parse::<Multiaddr>().unwrap()
);
}
}