use bytes::Bytes;
use futures::TryStreamExt;
use launchdarkly_sdk_transport::{ByteStream, HttpTransport, ResponseFuture, TransportError};
use std::time::Duration;
#[derive(Clone)]
pub(crate) struct ReqwestTransport {
client: reqwest::Client,
}
impl ReqwestTransport {
pub fn new() -> Result<Self, reqwest::Error> {
Ok(Self {
client: reqwest::Client::builder()
.pool_max_idle_per_host(1)
.connect_timeout(Duration::from_secs(10))
.build()?,
})
}
}
impl HttpTransport for ReqwestTransport {
fn request(&self, request: http::Request<Option<Bytes>>) -> ResponseFuture {
let client = self.client.clone();
Box::pin(async move {
let (parts, body) = request.into_parts();
let mut req = client.request(parts.method, parts.uri.to_string());
req = req.headers(parts.headers);
if let Some(body) = body {
req = req.body(body);
}
let resp = req.send().await.map_err(TransportError::new)?;
let status = resp.status();
let headers = resp.headers().clone();
let body_stream: ByteStream =
Box::pin(resp.bytes_stream().map_err(TransportError::new));
let mut http_resp = http::Response::new(body_stream);
*http_resp.status_mut() = status;
*http_resp.headers_mut() = headers;
Ok(http_resp)
})
}
}