diff options
| author | Emīls <emils@mullvad.net> | 2021-05-28 10:45:39 +0100 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2021-05-28 10:45:39 +0100 |
| commit | dd5850b6b80978c31e5641c3a660cd92d6a4da7b (patch) | |
| tree | a929b83596447c36c2163d69797ebbd3bdff115b | |
| parent | 4f78fbbfb92b0cf46d3dcf87edfdf03fedb2c2f1 (diff) | |
| parent | 84cf73a3bd80104d90518e94344bb4999800ca14 (diff) | |
| download | mullvadvpn-dd5850b6b80978c31e5641c3a660cd92d6a4da7b.tar.xz mullvadvpn-dd5850b6b80978c31e5641c3a660cd92d6a4da7b.zip | |
Merge branch 'fix-hostname-parsing'
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | mullvad-rpc/src/https_client_with_sni.rs | 50 |
2 files changed, 23 insertions, 28 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 53b746f204..bac1887bce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ Line wrap the file at 100 chars. Th ### Fixed - Fix relay selection failing to pick a WireGuard relay when no tunnel protocol is specified. - Fix time left not always being translated in desktop app settings. +- Fix API address cache to use the supplied ports instead of always using port 443. #### Windows - Prevent tray icons from being extraced to `%TEMP%` directory. diff --git a/mullvad-rpc/src/https_client_with_sni.rs b/mullvad-rpc/src/https_client_with_sni.rs index c8ac8e833d..0d9df2e68b 100644 --- a/mullvad-rpc/src/https_client_with_sni.rs +++ b/mullvad-rpc/src/https_client_with_sni.rs @@ -142,32 +142,29 @@ impl HttpsConnectorWithSni { .map_err(|err| io::Error::new(io::ErrorKind::TimedOut, err))? } - async fn resolve_address(hostname: &str) -> io::Result<SocketAddr> { - match Self::parse_addr(&hostname) { - Some(addr) => Ok(addr), - None => { - let mut addrs = GaiResolver::new() - .call( - Name::from_str(&hostname) - .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?, - ) - .await - .map_err(|err| io::Error::new(io::ErrorKind::Other, err))?; - let addr = addrs - .next() - .ok_or(io::Error::new(io::ErrorKind::Other, "Empty DNS response"))?; - Ok(SocketAddr::new(addr, 443)) - } + async fn resolve_address(uri: &Uri) -> io::Result<SocketAddr> { + let hostname = uri.host().ok_or(io::Error::new( + io::ErrorKind::InvalidInput, + "invalid url, missing host", + ))?; + let port = uri.port_u16().unwrap_or(443); + + if let Some(addr) = hostname.parse::<IpAddr>().ok() { + return Ok(SocketAddr::new(addr, port)); } - } - fn parse_addr(hostname: &str) -> Option<SocketAddr> { - if let Ok(addr) = hostname.parse::<SocketAddr>() { - return Some(addr); - } - let ip = hostname.parse::<IpAddr>().ok()?; - Some(SocketAddr::new(ip, 443)) + let mut addrs = GaiResolver::new() + .call( + Name::from_str(&hostname) + .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?, + ) + .await + .map_err(|err| io::Error::new(io::ErrorKind::Other, err))?; + let addr = addrs + .next() + .ok_or(io::Error::new(io::ErrorKind::Other, "Empty DNS response"))?; + Ok(SocketAddr::new(addr, port)) } } @@ -211,14 +208,11 @@ impl Service<Uri> for HttpsConnectorWithSni { "invalid url, not https", )); } - let host_addr = uri.host().ok_or(io::Error::new( - io::ErrorKind::InvalidInput, - "invalid url, missing host", - ))?; + let hostname = sni_hostname?; let host = DNSNameRef::try_from_ascii_str(&hostname) .map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "invalid hostname"))?; - let addr = Self::resolve_address(host_addr).await?; + let addr = Self::resolve_address(&uri).await?; let tokio_connection = Self::open_socket( addr, |
