use {
hyper::{body::*, client::conn::http1::*},
std::{error::Error, result::Result, time::Duration},
tokio::{io::*, time::*},
wasmtime_wasi::{runtime::*, *},
wasmtime_wasi_http::{
io::*,
p2::{bindings::http::types::*, *},
},
};
pub async fn connect_http<StreamT, BodyT>(
stream: StreamT,
connect_timeout: Duration,
) -> Result<(SendRequest<BodyT>, AbortOnDropJoinHandle<()>), ErrorCode>
where
StreamT: 'static + AsyncRead + AsyncWrite + Send + Unpin,
BodyT: 'static + Body + Send,
BodyT::Data: Send,
BodyT::Error: Into<Box<dyn Error + Send + Sync>>,
{
let (sender, connection) = timeout(
connect_timeout,
handshake(TokioIo::new(stream)),
)
.await
.map_err(|_| ErrorCode::ConnectionTimeout)?
.map_err(hyper_request_error)?;
let worker = runtime::spawn(async move {
match connection.await {
Ok(()) => {}
Err(error) => tracing::warn!("dropping error: {}", error),
}
});
Ok((sender, worker))
}