diff --git a/lite-rpc/src/main.rs b/lite-rpc/src/main.rs index 4bd37204..e0931410 100644 --- a/lite-rpc/src/main.rs +++ b/lite-rpc/src/main.rs @@ -36,6 +36,7 @@ use solana_sdk::commitment_config::CommitmentConfig; use solana_sdk::signature::Keypair; use solana_sdk::signer::Signer; use std::env; +use std::net::{SocketAddr, ToSocketAddrs}; use std::sync::Arc; use tokio::sync::mpsc; @@ -263,9 +264,27 @@ pub async fn main() -> anyhow::Result<()> { fn configure_tpu_connection_path(quic_proxy_addr: Option) -> TpuConnectionPath { match quic_proxy_addr { None => TpuConnectionPath::QuicDirectPath, - Some(prox_address) => TpuConnectionPath::QuicForwardProxyPath { - // e.g. "127.0.0.1:11111" - forward_proxy_address: prox_address.parse().expect("Invalid proxy address"), - }, + Some(prox_address) => { + let proxy_socket_addr = parse_host_port_to_ipv4(prox_address.as_str()).unwrap(); + TpuConnectionPath::QuicForwardProxyPath { + // e.g. "127.0.0.1:11111" + forward_proxy_address: proxy_socket_addr, + } + } + } +} + +fn parse_host_port_to_ipv4(host_port: &str) -> Result { + let addrs: Vec<_> = host_port + .to_socket_addrs() + .map_err(|err| format!("Unable to resolve host {host_port}: {err}"))? + .filter(|addr| addr.is_ipv4()) + .collect(); + if addrs.is_empty() { + Err(format!("Unable to resolve host: {host_port}")) + } else if addrs.len() > 1 { + Err(format!("Multiple addresses resolved for host: {host_port}")) + } else { + Ok(addrs[0]) } } diff --git a/quic-forward-proxy/src/main.rs b/quic-forward-proxy/src/main.rs index 729fbd2c..a0cc99f2 100644 --- a/quic-forward-proxy/src/main.rs +++ b/quic-forward-proxy/src/main.rs @@ -6,6 +6,7 @@ use clap::Parser; use dotenv::dotenv; use log::info; use solana_lite_rpc_core::keypair_loader::load_identity_keypair; +use std::net::{SocketAddr, ToSocketAddrs}; use std::sync::Arc; use crate::validator_identity::ValidatorIdentity; @@ -34,7 +35,7 @@ pub async fn main() -> anyhow::Result<()> { } = Args::parse(); dotenv().ok(); - let proxy_listener_addr = proxy_listen_addr.parse().unwrap(); + let proxy_listener_addr = parse_host_port_to_ipv4(proxy_listen_addr.as_str()).unwrap(); let validator_identity = ValidatorIdentity::new(load_identity_keypair(&identity_keypair).await); let tls_config = Arc::new(SelfSignedTlsConfigProvider::new_singleton_self_signed_localhost()); @@ -58,3 +59,18 @@ pub async fn main() -> anyhow::Result<()> { } } } + +fn parse_host_port_to_ipv4(host_port: &str) -> Result { + let addrs: Vec<_> = host_port + .to_socket_addrs() + .map_err(|err| format!("Unable to resolve host {host_port}: {err}"))? + .filter(|addr| addr.is_ipv4()) + .collect(); + if addrs.is_empty() { + Err(format!("Unable to resolve host: {host_port}")) + } else if addrs.len() > 1 { + Err(format!("Multiple addresses resolved for host: {host_port}")) + } else { + Ok(addrs[0]) + } +}