Stop using the url crate in the proxy. (#450)
Version 1.7.0 of the url crate seems to be broken which means we cannot `cargo update` the proxy without locking url to version 1.6. Since we only use it in a very limited way anyway, and since we use http::uri for parsing much more, just switch all uses of the url crate to use http::uri for parsing instead. This eliminates some build dependencies. Signed-off-by: Brian Smith <brian@briansmith.org>
This commit is contained in:
parent
6df6e8150f
commit
819fa072d6
|
@ -150,7 +150,6 @@ dependencies = [
|
||||||
"tower-in-flight-limit 0.1.0 (git+https://github.com/tower-rs/tower)",
|
"tower-in-flight-limit 0.1.0 (git+https://github.com/tower-rs/tower)",
|
||||||
"tower-reconnect 0.1.0 (git+https://github.com/tower-rs/tower)",
|
"tower-reconnect 0.1.0 (git+https://github.com/tower-rs/tower)",
|
||||||
"tower-util 0.1.0 (git+https://github.com/tower-rs/tower)",
|
"tower-util 0.1.0 (git+https://github.com/tower-rs/tower)",
|
||||||
"url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -383,16 +382,6 @@ dependencies = [
|
||||||
"unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "idna"
|
|
||||||
version = "0.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iovec"
|
name = "iovec"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
|
@ -471,11 +460,6 @@ dependencies = [
|
||||||
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "matches"
|
|
||||||
version = "0.1.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.0.1"
|
version = "2.0.1"
|
||||||
|
@ -1080,19 +1064,6 @@ dependencies = [
|
||||||
"version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-bidi"
|
|
||||||
version = "0.3.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-normalization"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-segmentation"
|
name = "unicode-segmentation"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
|
@ -1116,16 +1087,6 @@ dependencies = [
|
||||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "url"
|
|
||||||
version = "1.6.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf8-ranges"
|
name = "utf8-ranges"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -1232,7 +1193,6 @@ dependencies = [
|
||||||
"checksum http 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf8217d8829cc05dedadc08b4bc0684e5e3fbba1126c5edc680af49053fa230c"
|
"checksum http 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf8217d8829cc05dedadc08b4bc0684e5e3fbba1126c5edc680af49053fa230c"
|
||||||
"checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37"
|
"checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37"
|
||||||
"checksum hyper 0.11.19 (registry+https://github.com/rust-lang/crates.io-index)" = "47659bb1cb7ef3cd7b4f9bd2a11349b8d92097d34f9597a3c09e9bcefaf92b61"
|
"checksum hyper 0.11.19 (registry+https://github.com/rust-lang/crates.io-index)" = "47659bb1cb7ef3cd7b4f9bd2a11349b8d92097d34f9597a3c09e9bcefaf92b61"
|
||||||
"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
|
|
||||||
"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
|
"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
|
||||||
"checksum ipnet 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51268c3a27ad46afd1cca0bbf423a5be2e9fd3e6a7534736c195f0f834b763ef"
|
"checksum ipnet 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51268c3a27ad46afd1cca0bbf423a5be2e9fd3e6a7534736c195f0f834b763ef"
|
||||||
"checksum itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b07332223953b5051bceb67e8c4700aa65291535568e1f12408c43c4a42c0394"
|
"checksum itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b07332223953b5051bceb67e8c4700aa65291535568e1f12408c43c4a42c0394"
|
||||||
|
@ -1244,7 +1204,6 @@ dependencies = [
|
||||||
"checksum libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "87f737ad6cc6fd6eefe3d9dc5412f1573865bded441300904d2f42269e140f16"
|
"checksum libz-sys 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "87f737ad6cc6fd6eefe3d9dc5412f1573865bded441300904d2f42269e140f16"
|
||||||
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
|
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
|
||||||
"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2"
|
"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2"
|
||||||
"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
|
|
||||||
"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
|
"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
|
||||||
"checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd"
|
"checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd"
|
||||||
"checksum miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aaa2d3ad070f428fffbd7d3ca2ea20bb0d8cffe9024405c44e1840bc1418b398"
|
"checksum miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aaa2d3ad070f428fffbd7d3ca2ea20bb0d8cffe9024405c44e1840bc1418b398"
|
||||||
|
@ -1313,13 +1272,10 @@ dependencies = [
|
||||||
"checksum tower-reconnect 0.1.0 (git+https://github.com/tower-rs/tower)" = "<none>"
|
"checksum tower-reconnect 0.1.0 (git+https://github.com/tower-rs/tower)" = "<none>"
|
||||||
"checksum tower-util 0.1.0 (git+https://github.com/tower-rs/tower)" = "<none>"
|
"checksum tower-util 0.1.0 (git+https://github.com/tower-rs/tower)" = "<none>"
|
||||||
"checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a"
|
"checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a"
|
||||||
"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
|
|
||||||
"checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"
|
|
||||||
"checksum unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8083c594e02b8ae1654ae26f0ade5158b119bd88ad0e8227a5d8fcd72407946"
|
"checksum unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8083c594e02b8ae1654ae26f0ade5158b119bd88ad0e8227a5d8fcd72407946"
|
||||||
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
|
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
|
||||||
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||||
"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
|
"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
|
||||||
"checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2"
|
|
||||||
"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
|
"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
|
||||||
"checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
|
"checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
|
||||||
"checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d"
|
"checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d"
|
||||||
|
|
|
@ -27,7 +27,6 @@ ipnet = "1.0"
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
ordermap = "0.2"
|
ordermap = "0.2"
|
||||||
rand = "0.4"
|
rand = "0.4"
|
||||||
url = "1.5"
|
|
||||||
|
|
||||||
tokio-core = "0.1"
|
tokio-core = "0.1"
|
||||||
tokio-io = "0.1"
|
tokio-io = "0.1"
|
||||||
|
|
|
@ -5,8 +5,9 @@ use std::path::PathBuf;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use url::{Host, HostAndPort, Url};
|
use http;
|
||||||
|
|
||||||
|
use transport::{Host, HostAndPort, HostAndPortError};
|
||||||
use convert::TryFrom;
|
use convert::TryFrom;
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
|
@ -104,17 +105,14 @@ pub enum UrlError {
|
||||||
/// The URL has a scheme that isn't supported.
|
/// The URL has a scheme that isn't supported.
|
||||||
UnsupportedScheme,
|
UnsupportedScheme,
|
||||||
|
|
||||||
/// The URL is missing the host part.
|
/// The URL is missing the authority part.
|
||||||
MissingHost,
|
MissingAuthority,
|
||||||
|
|
||||||
/// The URL is missing the port and there is no default port.
|
/// The URL is missing the authority part.
|
||||||
MissingPort,
|
AuthorityError(HostAndPortError),
|
||||||
|
|
||||||
/// The URL contains a path component that isn't "/", which isn't allowed.
|
/// The URL contains a path component that isn't "/", which isn't allowed.
|
||||||
PathNotAllowed,
|
PathNotAllowed,
|
||||||
|
|
||||||
/// The URL contains a fragment, which isn't allowed.
|
|
||||||
FragmentNotAllowed,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The strings used to build a configuration.
|
/// The strings used to build a configuration.
|
||||||
|
@ -265,20 +263,11 @@ impl FromStr for Addr {
|
||||||
type Err = ParseError;
|
type Err = ParseError;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
match parse_url(s)? {
|
let a = parse_url(s)?;
|
||||||
HostAndPort {
|
if let Host::Ip(ip) = a.host {
|
||||||
host: Host::Ipv4(ip),
|
return Ok(Addr(SocketAddr::from((ip, a.port))));
|
||||||
port,
|
|
||||||
} => Ok(Addr(SocketAddr::new(ip.into(), port))),
|
|
||||||
HostAndPort {
|
|
||||||
host: Host::Ipv6(ip),
|
|
||||||
port,
|
|
||||||
} => Ok(Addr(SocketAddr::new(ip.into(), port))),
|
|
||||||
HostAndPort {
|
|
||||||
host: Host::Domain(_),
|
|
||||||
..
|
|
||||||
} => Err(ParseError::HostIsNotAnIpAddress),
|
|
||||||
}
|
}
|
||||||
|
Err(ParseError::HostIsNotAnIpAddress)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,24 +326,22 @@ fn parse_number<T>(s: &str) -> Result<T, ParseError> where T: FromStr {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_url(s: &str) -> Result<HostAndPort, ParseError> {
|
fn parse_url(s: &str) -> Result<HostAndPort, ParseError> {
|
||||||
let url = Url::parse(&s).map_err(|_| ParseError::UrlError(UrlError::SyntaxError))?;
|
let url = s.parse::<http::Uri>().map_err(|_| ParseError::UrlError(UrlError::SyntaxError))?;
|
||||||
let host = url.host()
|
if url.scheme_part().map(|s| s.as_str()) != Some("tcp") {
|
||||||
.ok_or_else(|| ParseError::UrlError(UrlError::MissingHost))?
|
|
||||||
.to_owned();
|
|
||||||
if url.scheme() != "tcp" {
|
|
||||||
return Err(ParseError::UrlError(UrlError::UnsupportedScheme));
|
return Err(ParseError::UrlError(UrlError::UnsupportedScheme));
|
||||||
}
|
}
|
||||||
let port = url.port().ok_or_else(|| ParseError::UrlError(UrlError::MissingPort))?;
|
let authority = url.authority_part()
|
||||||
|
.ok_or_else(|| ParseError::UrlError(UrlError::MissingAuthority))?;
|
||||||
|
|
||||||
if url.path() != "/" {
|
if url.path() != "/" {
|
||||||
return Err(ParseError::UrlError(UrlError::PathNotAllowed));
|
return Err(ParseError::UrlError(UrlError::PathNotAllowed));
|
||||||
}
|
}
|
||||||
if url.fragment().is_some() {
|
// http::Uri doesn't provde an accessor for the fragment; See
|
||||||
return Err(ParseError::UrlError(UrlError::FragmentNotAllowed));
|
// https://github.com/hyperium/http/issues/127. For now just ignore any
|
||||||
}
|
// fragment that is there.
|
||||||
Ok(HostAndPort {
|
|
||||||
host,
|
HostAndPort::try_from(authority)
|
||||||
port,
|
.map_err(|e| ParseError::UrlError(UrlError::AuthorityError(e)))
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse<T, Parse>(strings: &Strings, name: &str, parse: Parse) -> Result<Option<T>, Error>
|
fn parse<T, Parse>(strings: &Strings, name: &str, parse: Parse) -> Result<Option<T>, Error>
|
||||||
|
|
|
@ -15,11 +15,10 @@ use tokio_core::reactor::{
|
||||||
use tower::Service;
|
use tower::Service;
|
||||||
use tower_h2;
|
use tower_h2;
|
||||||
use tower_reconnect::{Error as ReconnectError, Reconnect};
|
use tower_reconnect::{Error as ReconnectError, Reconnect};
|
||||||
use url::HostAndPort;
|
|
||||||
|
|
||||||
use dns;
|
use dns;
|
||||||
use fully_qualified_authority::FullyQualifiedAuthority;
|
use fully_qualified_authority::FullyQualifiedAuthority;
|
||||||
use transport::LookupAddressAndConnect;
|
use transport::{HostAndPort, LookupAddressAndConnect};
|
||||||
use timeout::{Timeout, TimeoutError};
|
use timeout::{Timeout, TimeoutError};
|
||||||
|
|
||||||
pub mod discovery;
|
pub mod discovery;
|
||||||
|
@ -79,11 +78,9 @@ impl Background {
|
||||||
{
|
{
|
||||||
// Build up the Controller Client Stack
|
// Build up the Controller Client Stack
|
||||||
let mut client = {
|
let mut client = {
|
||||||
let ctx = ("controller-client", format!("{}", host_and_port));
|
let ctx = ("controller-client", format!("{:?}", host_and_port));
|
||||||
let scheme = http::uri::Scheme::from_shared(Bytes::from_static(b"http")).unwrap();
|
let scheme = http::uri::Scheme::from_shared(Bytes::from_static(b"http")).unwrap();
|
||||||
let authority =
|
let authority = http::uri::Authority::from(&host_and_port);
|
||||||
http::uri::Authority::from_shared(format!("{}", host_and_port).into()).unwrap();
|
|
||||||
|
|
||||||
let dns_resolver = dns::Resolver::new(dns_config, executor);
|
let dns_resolver = dns::Resolver::new(dns_config, executor);
|
||||||
let connect = Timeout::new(
|
let connect = Timeout::new(
|
||||||
LookupAddressAndConnect::new(host_and_port, dns_resolver, executor),
|
LookupAddressAndConnect::new(host_and_port, dns_resolver, executor),
|
||||||
|
|
|
@ -7,7 +7,7 @@ use std::net::IpAddr;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use tokio_core::reactor::Handle;
|
use tokio_core::reactor::Handle;
|
||||||
use url;
|
use transport;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Config(domain::resolv::ResolvConf);
|
pub struct Config(domain::resolv::ResolvConf);
|
||||||
|
@ -45,17 +45,16 @@ impl Resolver {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn resolve_host(&self, host: &url::Host) -> IpAddrFuture {
|
pub fn resolve_host(&self, host: &transport::Host) -> IpAddrFuture {
|
||||||
match *host {
|
match *host {
|
||||||
url::Host::Domain(ref name) => {
|
transport::Host::DnsName(ref name) => {
|
||||||
trace!("resolve {}", name);
|
trace!("resolve {}", name);
|
||||||
match abstract_ns::Name::from_str(name) {
|
match abstract_ns::Name::from_str(name) {
|
||||||
Ok(name) => IpAddrFuture::DNS(self.0.resolve_host(&name)),
|
Ok(name) => IpAddrFuture::DNS(self.0.resolve_host(&name)),
|
||||||
Err(_) => IpAddrFuture::InvalidDNSName(name.clone()),
|
Err(_) => IpAddrFuture::InvalidDNSName(name.clone()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
url::Host::Ipv4(ref addr) => IpAddrFuture::Fixed(IpAddr::V4(*addr)),
|
transport::Host::Ip(addr) => IpAddrFuture::Fixed(addr),
|
||||||
url::Host::Ipv6(ref addr) => IpAddrFuture::Fixed(IpAddr::V6(*addr)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,6 @@ extern crate tower_reconnect;
|
||||||
extern crate conduit_proxy_router;
|
extern crate conduit_proxy_router;
|
||||||
extern crate tower_util;
|
extern crate tower_util;
|
||||||
extern crate tower_in_flight_limit;
|
extern crate tower_in_flight_limit;
|
||||||
extern crate url;
|
|
||||||
|
|
||||||
use futures::*;
|
use futures::*;
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
use tokio_connect;
|
use tokio_connect;
|
||||||
use tokio_core::reactor::Handle;
|
use tokio_core::reactor::Handle;
|
||||||
use url;
|
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::net::{IpAddr, SocketAddr};
|
use std::net::{IpAddr, SocketAddr};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use http;
|
||||||
|
|
||||||
use connection;
|
use connection;
|
||||||
|
use convert;
|
||||||
use dns;
|
use dns;
|
||||||
use ::timeout;
|
use ::timeout;
|
||||||
|
|
||||||
|
@ -16,15 +19,63 @@ pub struct Connect {
|
||||||
handle: Handle,
|
handle: Handle,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct HostAndPort {
|
||||||
|
pub host: Host,
|
||||||
|
pub port: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum Host {
|
||||||
|
DnsName(String),
|
||||||
|
Ip(IpAddr),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub enum HostAndPortError {
|
||||||
|
/// The port is missing.
|
||||||
|
MissingPort,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct LookupAddressAndConnect {
|
pub struct LookupAddressAndConnect {
|
||||||
host_and_port: url::HostAndPort,
|
host_and_port: HostAndPort,
|
||||||
dns_resolver: dns::Resolver,
|
dns_resolver: dns::Resolver,
|
||||||
handle: Handle,
|
handle: Handle,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type TimeoutConnect<C> = timeout::Timeout<C>;
|
pub type TimeoutConnect<C> = timeout::Timeout<C>;
|
||||||
|
|
||||||
|
// ===== impl HostAndPort =====
|
||||||
|
|
||||||
|
impl<'a> convert::TryFrom<&'a http::uri::Authority> for HostAndPort {
|
||||||
|
type Err = HostAndPortError;
|
||||||
|
fn try_from(a: &http::uri::Authority) -> Result<Self, Self::Err> {
|
||||||
|
let host = {
|
||||||
|
let host = a.host();
|
||||||
|
match IpAddr::from_str(host) {
|
||||||
|
Err(_) => Host::DnsName(host.to_owned()),
|
||||||
|
Ok(ip) => Host::Ip(ip),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let port = a.port().ok_or_else(|| HostAndPortError::MissingPort)?;
|
||||||
|
Ok(HostAndPort {
|
||||||
|
host,
|
||||||
|
port
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<&'a HostAndPort> for http::uri::Authority {
|
||||||
|
fn from(a: &HostAndPort) -> Self {
|
||||||
|
let s = match a.host {
|
||||||
|
Host::DnsName(ref n) => format!("{}:{}", n, a.port),
|
||||||
|
Host::Ip(ref ip) => format!("{}:{}", ip, a.port),
|
||||||
|
};
|
||||||
|
http::uri::Authority::from_str(&s).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ===== impl Connect =====
|
// ===== impl Connect =====
|
||||||
|
|
||||||
impl Connect {
|
impl Connect {
|
||||||
|
@ -51,7 +102,7 @@ impl tokio_connect::Connect for Connect {
|
||||||
|
|
||||||
impl LookupAddressAndConnect {
|
impl LookupAddressAndConnect {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
host_and_port: url::HostAndPort,
|
host_and_port: HostAndPort,
|
||||||
dns_resolver: dns::Resolver,
|
dns_resolver: dns::Resolver,
|
||||||
handle: &Handle,
|
handle: &Handle,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
|
@ -78,7 +129,7 @@ impl tokio_connect::Connect for LookupAddressAndConnect {
|
||||||
io::Error::new(io::ErrorKind::NotFound, "DNS resolution failed")
|
io::Error::new(io::ErrorKind::NotFound, "DNS resolution failed")
|
||||||
})
|
})
|
||||||
.and_then(move |ip_addr: IpAddr| {
|
.and_then(move |ip_addr: IpAddr| {
|
||||||
info!("DNS resolved {} to {}", host, ip_addr);
|
info!("DNS resolved {:?} to {}", host, ip_addr);
|
||||||
let addr = SocketAddr::from((ip_addr, port));
|
let addr = SocketAddr::from((ip_addr, port));
|
||||||
trace!("connect {}", addr);
|
trace!("connect {}", addr);
|
||||||
connection::connect(&addr, &handle)
|
connection::connect(&addr, &handle)
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
mod connect;
|
mod connect;
|
||||||
mod so_original_dst;
|
mod so_original_dst;
|
||||||
|
|
||||||
pub use self::connect::{Connect, LookupAddressAndConnect, TimeoutConnect};
|
pub use self::connect::{
|
||||||
|
Connect,
|
||||||
|
Host, HostAndPort, HostAndPortError,
|
||||||
|
LookupAddressAndConnect,
|
||||||
|
TimeoutConnect
|
||||||
|
};
|
||||||
pub use self::so_original_dst::{GetOriginalDst, SoOriginalDst};
|
pub use self::so_original_dst::{GetOriginalDst, SoOriginalDst};
|
||||||
|
|
|
@ -14,7 +14,6 @@ extern crate tokio_core;
|
||||||
pub extern crate tokio_io;
|
pub extern crate tokio_io;
|
||||||
extern crate tower;
|
extern crate tower;
|
||||||
extern crate tower_h2;
|
extern crate tower_h2;
|
||||||
extern crate url;
|
|
||||||
pub extern crate env_logger;
|
pub extern crate env_logger;
|
||||||
|
|
||||||
use self::bytes::{BigEndian, Bytes, BytesMut};
|
use self::bytes::{BigEndian, Bytes, BytesMut};
|
||||||
|
|
Loading…
Reference in New Issue