Как заставить Rust Hyper указывать исходящий порт источника? - PullRequest
1 голос
/ 10 июля 2020

Есть ли способ заставить Hyper дать указание сетевому интерфейсу назначить определенный c порт источника для всех исходящих HTTP-запросов?

1 Ответ

2 голосов
/ 13 июля 2020

Вы можете указать 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`
...