Skip to content

Commit 71080c0

Browse files
authored
fix(dgw): crash when using default port HTTP internal URL (#1392)
The listener task was crashing when the default port for HTTP (80) or HTTPS (443) was used in the internal URL of the HTTP listener. Issue: DGW-288
1 parent aa03b65 commit 71080c0

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

devolutions-gateway/src/listener.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ use anyhow::Context;
22
use async_trait::async_trait;
33
use devolutions_gateway_task::{ChildTask, ShutdownSignal, Task};
44
use futures::TryFutureExt as _;
5-
use std::net::SocketAddr;
5+
use std::net::{SocketAddr, ToSocketAddrs as _};
66
use tap::Pipe as _;
77
use tokio::io::{AsyncRead, AsyncWrite};
88
use tokio::net::{TcpListener, TcpSocket, TcpStream};
99
use tracing::Instrument as _;
1010
use url::Url;
1111

1212
use crate::generic_client::GenericClient;
13-
use crate::utils::url_to_socket_addr;
13+
use crate::target_addr::TargetAddr;
1414
use crate::DgwState;
1515

1616
const HTTP_CONNECTION_MAX_DURATION: tokio::time::Duration = tokio::time::Duration::from_secs(10 * 60);
@@ -36,7 +36,7 @@ pub enum ListenerKind {
3636

3737
pub struct GatewayListener {
3838
addr: SocketAddr,
39-
listener_url: Url,
39+
binding_url: TargetAddr,
4040
kind: ListenerKind,
4141
listener: TcpListener,
4242
state: DgwState,
@@ -48,7 +48,12 @@ impl GatewayListener {
4848

4949
info!(%url, "Initiating listener...");
5050

51-
let socket_addr = url_to_socket_addr(&url).context("invalid url")?;
51+
let url = TargetAddr::try_from(url).context("invalid internal url")?;
52+
let socket_addr = url
53+
.to_socket_addrs()
54+
.context("resolve internal URL to socket addr")?
55+
.next()
56+
.context("internal URL resolved to nothing")?;
5257

5358
let socket = if socket_addr.is_ipv4() {
5459
TcpSocket::new_v4().context("failed to create IPv4 TCP socket")?
@@ -72,7 +77,7 @@ impl GatewayListener {
7277

7378
Ok(Self {
7479
addr: socket_addr,
75-
listener_url: url,
80+
binding_url: url,
7681
kind,
7782
listener,
7883
state,
@@ -87,7 +92,7 @@ impl GatewayListener {
8792
self.kind
8893
}
8994

90-
#[instrument("listener", skip(self), fields(port = self.listener_url.port().expect("port")))]
95+
#[instrument("listener", skip(self), fields(port = self.binding_url.port()))]
9196
pub async fn run(self) -> anyhow::Result<()> {
9297
match self.kind() {
9398
ListenerKind::Tcp => run_tcp_listener(self.listener, self.state).await,

devolutions-gateway/src/service.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ async fn spawn_tasks(conf_handle: ConfHandle) -> anyhow::Result<Tasks> {
254254
conf.listeners
255255
.iter()
256256
.map(|listener| {
257-
GatewayListener::init_and_bind(listener.internal_url.clone(), state.clone())
257+
GatewayListener::init_and_bind(listener, state.clone())
258258
.with_context(|| format!("failed to initialize {}", listener.internal_url))
259259
})
260260
.collect::<anyhow::Result<Vec<GatewayListener>>>()

0 commit comments

Comments
 (0)