use super::{super::tls::*, http::*, tcp::*, uri::*};
use {
::http::Uri,
http_body_util::*,
hyper::Request,
read_url::*,
std::sync::*,
tokio::time::*,
tokio_rustls::*,
wasmtime_wasi_http::p2::{
bindings::http::types::*,
body::*,
types::{IncomingResponse, OutgoingRequestConfig},
*,
},
};
pub async fn send_request_plus(
mut request: Request<HyperOutgoingBody>,
config: OutgoingRequestConfig,
url_context: UrlContextRef,
) -> Result<IncomingResponse, ErrorCode> {
let authority = authority(&request, config.use_tls)?;
let tcp_stream = connect_tcp(&authority, config.connect_timeout).await?;
let (mut sender, worker) = if config.use_tls {
let tls_client_configuration = tls_client_configuration(request.headers_mut(), &url_context)
.map_err(|error| ErrorCode::InternalError(Some(error)))?;
let tls_connector: TlsConnector = Arc::new(tls_client_configuration).into();
let domain = domain(&authority)?;
let tls_stream = tls_connector.connect(domain, tcp_stream).await.map_err(|error| {
tracing::warn!("TLS protocol error: {:?}", error);
ErrorCode::TlsProtocolError
})?;
connect_http(tls_stream, config.connect_timeout).await?
} else {
connect_http(tcp_stream, config.connect_timeout).await?
};
let path_and_query = request.uri().path_and_query().map(|path_and_query| path_and_query.as_str()).unwrap_or("/");
*request.uri_mut() = Uri::builder().path_and_query(path_and_query).build().expect("valid URI");
let response = timeout(config.first_byte_timeout, sender.send_request(request))
.await
.map_err(|_| ErrorCode::ConnectionReadTimeout)?
.map_err(hyper_request_error)?
.map(|incoming| incoming.map_err(hyper_request_error).boxed_unsync());
Ok(IncomingResponse { resp: response, worker: Some(worker), between_bytes_timeout: config.between_bytes_timeout })
}