hyper_noise/
client.rs

1use hyper::{Body, Request, Response};
2use tokio::net::TcpStream;
3use tokio_noise::{
4    handshakes::{nn_psk2::Initiator, NNpsk2},
5    NoiseTcpStream,
6};
7
8use std::time::Duration;
9
10use crate::ClientError;
11
12pub async fn send_request(
13    tcp_stream: TcpStream,
14    initiator: Initiator<'_>,
15    request: Request<Body>,
16    request_timeout: Option<Duration>,
17) -> Result<Response<Body>, ClientError> {
18    let handshake = NNpsk2::new(initiator);
19
20    let timeout = request_timeout.unwrap_or(Duration::from_secs(999999999));
21    tokio::time::timeout(timeout, async move {
22        let noise_stream = NoiseTcpStream::handshake_initiator(tcp_stream, handshake).await?;
23
24        let (mut request_sender, connection) = hyper::client::conn::handshake(noise_stream).await?;
25        tokio::spawn(async move {
26            if let Err(e) = connection.await {
27                log::warn!("Error in hyper HTTP connection driver: {}", e);
28            }
29        });
30
31        let resp = request_sender.send_request(request).await?;
32        Ok(resp)
33    })
34    .await
35    .map_err(|_| ClientError::RequestTimeout)?
36}