summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2021-05-28 10:45:39 +0100
committerEmīls <emils@mullvad.net>2021-05-28 10:45:39 +0100
commitdd5850b6b80978c31e5641c3a660cd92d6a4da7b (patch)
treea929b83596447c36c2163d69797ebbd3bdff115b
parent4f78fbbfb92b0cf46d3dcf87edfdf03fedb2c2f1 (diff)
parent84cf73a3bd80104d90518e94344bb4999800ca14 (diff)
downloadmullvadvpn-dd5850b6b80978c31e5641c3a660cd92d6a4da7b.tar.xz
mullvadvpn-dd5850b6b80978c31e5641c3a660cd92d6a4da7b.zip
Merge branch 'fix-hostname-parsing'
-rw-r--r--CHANGELOG.md1
-rw-r--r--mullvad-rpc/src/https_client_with_sni.rs50
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,