Skip to content

Commit

Permalink
Adds local_address as an option Endpoint builder.
Browse files Browse the repository at this point in the history
  • Loading branch information
jparris committed Dec 5, 2024
1 parent a22b61d commit 4cb2f2a
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion tonic/src/transport/channel/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use bytes::Bytes;
use http::{uri::Uri, HeaderValue};
use hyper::rt;
use hyper_util::client::legacy::connect::HttpConnector;
use std::{fmt, future::Future, pin::Pin, str::FromStr, time::Duration};
use std::{fmt, future::Future, net::IpAddr, pin::Pin, str::FromStr, time::Duration};
use tower_service::Service;

/// Channel builder.
Expand Down Expand Up @@ -37,6 +37,7 @@ pub struct Endpoint {
pub(crate) connect_timeout: Option<Duration>,
pub(crate) http2_adaptive_window: Option<bool>,
pub(crate) executor: SharedExec,
pub(crate) local_address: Option<IpAddr>,
}

impl Endpoint {
Expand Down Expand Up @@ -325,13 +326,31 @@ impl Endpoint {
)
}

/// Set the local address
///
/// This sets the IP address the client will use. By default we let hyper select the IP address.
/// ```
/// # use std::net::IpAddr;
/// # use std::str::FromStr;
/// # use tonic::transport::Endpoint;
/// # let mut builder = Endpoint::from_static("https://example.com");
/// # builder.local_address(IpAddr::from_str("127.0.0.1").expect("Unable to parse IP address"));
/// ```
pub fn local_address(self, addr: IpAddr) -> Self {
Endpoint {
local_address: Some(addr),
..self
}
}

/// Create a channel from this config.
pub async fn connect(&self) -> Result<Channel, Error> {
let mut http = HttpConnector::new();
http.enforce_http(false);
http.set_nodelay(self.tcp_nodelay);
http.set_keepalive(self.tcp_keepalive);
http.set_connect_timeout(self.connect_timeout);
http.set_local_address(self.local_address);

let connector = self.connector(http);

Expand Down Expand Up @@ -459,6 +478,7 @@ impl From<Uri> for Endpoint {
connect_timeout: None,
http2_adaptive_window: None,
executor: SharedExec::tokio(),
local_address: None,
}
}
}
Expand Down

0 comments on commit 4cb2f2a

Please sign in to comment.