opendeviationbar-client 13.66.1

Client library for consuming open deviation bar data via SSE
Documentation
// Issue #170: ReqwestTransport — adapts reqwest to eventsource-client's HttpTransport trait.

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)
        })
    }
}