Вы можете указать Hyper, как открыть соединение, определив пользовательский Connector
следующим образом:
use std::task::{self, Poll};
use hyper::{service::Service, Uri};
use tokio::net::TcpStream;
use futures::future::BoxFuture;
#[derive(Clone)]
struct MyConnector {
port: u32,
}
impl Service<Uri> for MyConnector {
type Response = TcpStream;
type Error = std::io::Error;
type Future = BoxFuture<'static, Result<TcpStream, Self::Error>>;
fn poll_ready(&mut self, _: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>> {
Poll::Ready(Ok(()))
}
fn call(&mut self, uri: Uri) -> Self::Future {
Box::pin(async move {
// ... create your TcpStream here
})
}
}
Это позволит вам установить любые параметры, которые вы хотите, на TcpStream
. См. мой другой ответ , в котором объясняется, как самостоятельно вызвать bind
в соединении, что необходимо для установки порта источника.
Теперь, когда вы определили соединитель, вы можете использовать это при создании нового гипер Client
, и любые соединения, открытые на этом Client
, будут использовать указанный соединитель.
let client = hyper::Client::builder()
.build::<_, hyper::Body>(MyConnector { port: 1234 });
// now open your connection using `client`