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}