Add ClientBuilder::local_address option to bind to a local IP address (#451)
Closes #414
This commit is contained in:
		
				
					committed by
					
						 Sean McArthur
						Sean McArthur
					
				
			
			
				
	
			
			
			
						parent
						
							8ed9e60351
						
					
				
				
					commit
					4dc679d535
				
			| @@ -1,6 +1,7 @@ | ||||
| use std::{fmt, str}; | ||||
| use std::sync::Arc; | ||||
| use std::time::Duration; | ||||
| use std::net::IpAddr; | ||||
|  | ||||
| use bytes::Bytes; | ||||
| use futures::{Async, Future, Poll}; | ||||
| @@ -76,6 +77,7 @@ struct Config { | ||||
|     #[cfg(feature = "tls")] | ||||
|     tls: TlsBackend, | ||||
|     http2_only: bool, | ||||
|     local_address: Option<IpAddr>, | ||||
| } | ||||
|  | ||||
| impl ClientBuilder { | ||||
| @@ -106,6 +108,7 @@ impl ClientBuilder { | ||||
|                 #[cfg(feature = "tls")] | ||||
|                 tls: TlsBackend::default(), | ||||
|                 http2_only: false, | ||||
|                 local_address: None, | ||||
|             }, | ||||
|         } | ||||
|     } | ||||
| @@ -137,7 +140,7 @@ impl ClientBuilder { | ||||
|                         id.add_to_native_tls(&mut tls)?; | ||||
|                     } | ||||
|  | ||||
|                     Connector::new_default_tls(tls, proxies.clone())? | ||||
|                     Connector::new_default_tls(tls, proxies.clone(), config.local_address)? | ||||
|                 }, | ||||
|                 #[cfg(feature = "rustls-tls")] | ||||
|                 TlsBackend::Rustls => { | ||||
| @@ -166,18 +169,19 @@ impl ClientBuilder { | ||||
|                         id.add_to_rustls(&mut tls)?; | ||||
|                     } | ||||
|  | ||||
|                     Connector::new_rustls_tls(tls, proxies.clone())? | ||||
|                     Connector::new_rustls_tls(tls, proxies.clone(), config.local_address)? | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             #[cfg(not(feature = "tls"))] | ||||
|             Connector::new(proxies.clone())? | ||||
|             Connector::new(proxies.clone(), config.local_address)? | ||||
|         }; | ||||
|  | ||||
|         let mut builder = ::hyper::Client::builder(); | ||||
|         if config.http2_only { | ||||
|             builder.http2_only(true); | ||||
|         } | ||||
|  | ||||
|         let hyper_client = builder.build(connector); | ||||
|  | ||||
|         let proxies_maybe_http_auth = proxies | ||||
| @@ -325,6 +329,15 @@ impl ClientBuilder { | ||||
|     pub fn dns_threads(self, _threads: usize) -> ClientBuilder { | ||||
|         self | ||||
|     } | ||||
|  | ||||
|     /// Bind to a local IP Address | ||||
|     pub fn local_address<T>(mut self, addr: T) -> ClientBuilder | ||||
|     where | ||||
|         T: Into<Option<IpAddr>>, | ||||
|     { | ||||
|         self.config.local_address = addr.into(); | ||||
|         self | ||||
|     } | ||||
| } | ||||
|  | ||||
| type HyperClient = ::hyper::Client<Connector>; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user