simplify default resolver lookup

This commit is contained in:
Rob Ede 2021-11-29 21:22:36 +00:00
parent 3891745a6e
commit a0e04c797b
No known key found for this signature in database
GPG Key ID: 97C636207D3EF933
3 changed files with 13 additions and 27 deletions

View File

@ -25,7 +25,7 @@ impl<R, IO> Connection<R, IO> {
(self.io, self.req) (self.io, self.req)
} }
/// Replaces underlying IO, returning old UI and new `Connection`. /// Replaces underlying IO, returning old IO and new `Connection`.
pub fn replace_io<IO2>(self, io: IO2) -> (IO, Connection<R, IO2>) { pub fn replace_io<IO2>(self, io: IO2) -> (IO, Connection<R, IO2>) {
(self.io, Connection { io, req: self.req }) (self.io, Connection { io, req: self.req })
} }

View File

@ -107,14 +107,14 @@ impl<R: Host> ConnectInfo<R> {
/// # Examples /// # Examples
/// ``` /// ```
/// # use std::net::SocketAddr; /// # use std::net::SocketAddr;
/// # use actix_tls::connect::ConnectionInfo; /// # use actix_tls::connect::ConnectInfo;
/// let addr = SocketAddr::from(([127, 0, 0, 1], 4242)); /// let addr = SocketAddr::from(([127, 0, 0, 1], 4242));
/// ///
/// let conn = ConnectionInfo::new("localhost"); /// let conn = ConnectInfo::new("localhost");
/// let mut addrs = conn.addrs(); /// let mut addrs = conn.addrs();
/// assert!(addrs.next().is_none()); /// assert!(addrs.next().is_none());
/// ///
/// let conn = ConnectionInfo::with_addr("localhost", addr); /// let conn = ConnectInfo::with_addr("localhost", addr);
/// let mut addrs = conn.addrs(); /// let mut addrs = conn.addrs();
/// assert_eq!(addrs.next().unwrap(), addr); /// assert_eq!(addrs.next().unwrap(), addr);
/// ``` /// ```
@ -138,14 +138,14 @@ impl<R: Host> ConnectInfo<R> {
/// # Examples /// # Examples
/// ``` /// ```
/// # use std::net::SocketAddr; /// # use std::net::SocketAddr;
/// # use actix_tls::connect::ConnectionInfo; /// # use actix_tls::connect::ConnectInfo;
/// let addr = SocketAddr::from(([127, 0, 0, 1], 4242)); /// let addr = SocketAddr::from(([127, 0, 0, 1], 4242));
/// ///
/// let mut conn = ConnectionInfo::new("localhost"); /// let mut conn = ConnectInfo::new("localhost");
/// let mut addrs = conn.take_addrs(); /// let mut addrs = conn.take_addrs();
/// assert!(addrs.next().is_none()); /// assert!(addrs.next().is_none());
/// ///
/// let mut conn = ConnectionInfo::with_addr("localhost", addr); /// let mut conn = ConnectInfo::with_addr("localhost", addr);
/// let mut addrs = conn.take_addrs(); /// let mut addrs = conn.take_addrs();
/// assert_eq!(addrs.next().unwrap(), addr); /// assert_eq!(addrs.next().unwrap(), addr);
/// ``` /// ```

View File

@ -81,25 +81,11 @@ impl ResolverService {
} }
/// Resolve DNS with default resolver. /// Resolve DNS with default resolver.
fn look_up<R: Host>(req: &ConnectInfo<R>) -> JoinHandle<io::Result<IntoIter<SocketAddr>>> { fn default_lookup<R: Host>(
let host = req.hostname(); req: &ConnectInfo<R>,
// TODO: Connect should always return host(name?) with port if possible; basically try to ) -> JoinHandle<io::Result<IntoIter<SocketAddr>>> {
// reduce ability to create conflicting lookup info by having port in host string being // reconstruct host; concatenate hostname and port together
// different from numeric port in connect let host = format!("{}:{}", req.hostname(), req.port());
let host = if req
.hostname()
.split_once(':')
.and_then(|(_, port)| port.parse::<u16>().ok())
.map(|port| port == req.port())
.unwrap_or(false)
{
// if hostname contains port and also matches numeric port then just use the hostname
host.to_string()
} else {
// concatenate domain-only hostname and port together
format!("{}:{}", host, req.port())
};
// run blocking DNS lookup in thread pool since DNS lookups can take upwards of seconds on // run blocking DNS lookup in thread pool since DNS lookups can take upwards of seconds on
// some platforms if conditions are poor and OS-level cache is not populated // some platforms if conditions are poor and OS-level cache is not populated
@ -126,7 +112,7 @@ impl<R: Host> Service<ConnectInfo<R>> for ResolverService {
match &self.kind { match &self.kind {
ResolverKind::Default => { ResolverKind::Default => {
let fut = Self::look_up(&req); let fut = Self::default_lookup(&req);
ResolverFut::LookUp(fut, Some(req)) ResolverFut::LookUp(fut, Some(req))
} }