Skip to main content

cloud_sdk_reqwest/blocking/
raw.rs

1use core::fmt;
2
3use cloud_sdk::transport::{
4    BlockingRawHttpExecutor, BoundTransport, EndpointIdentity, EndpointIdentityError,
5    RawResponsePolicy, ResponseStorageSanitizer, ResponseWriter, TransportFailure,
6    TransportRequest,
7};
8use cloud_sdk_sanitization::sanitize_bytes;
9
10use crate::shared::{HttpsEndpoint, RawHttpError, RawHyperClient, RawTransportFailure};
11
12/// Raw blocking HTTP executor with no implicit authentication or provider policy.
13#[derive(Clone)]
14pub struct RawBlockingClient {
15    inner: RawHyperClient,
16    endpoint: HttpsEndpoint,
17}
18
19impl RawBlockingClient {
20    pub(super) const fn new(inner: RawHyperClient, endpoint: HttpsEndpoint) -> Self {
21        Self { inner, endpoint }
22    }
23
24    fn execute_inner(
25        &self,
26        request: TransportRequest<'_>,
27        policy: RawResponsePolicy<'_>,
28        response_writer: &mut ResponseWriter<'_>,
29    ) -> Result<(), RawTransportFailure> {
30        if tokio::runtime::Handle::try_current().is_ok() {
31            return Err(TransportFailure::not_sent(
32                RawHttpError::BlockingRuntimeContext,
33            ));
34        }
35        let runtime = tokio::runtime::Builder::new_current_thread()
36            .enable_all()
37            .build()
38            .map_err(|_| TransportFailure::not_sent(RawHttpError::RuntimeInitializationFailed))?;
39        runtime.block_on(self.inner.execute(request, policy, response_writer))
40    }
41}
42
43impl BlockingRawHttpExecutor for RawBlockingClient {
44    type Error = RawTransportFailure;
45
46    fn execute(
47        &self,
48        request: TransportRequest<'_>,
49        policy: RawResponsePolicy<'_>,
50        response: &mut ResponseWriter<'_>,
51    ) -> Result<(), Self::Error> {
52        self.execute_inner(request, policy, response)
53    }
54}
55
56impl ResponseStorageSanitizer for RawBlockingClient {
57    fn sanitize_response_storage(&self, response_storage: &mut [u8]) {
58        sanitize_bytes(response_storage);
59    }
60}
61
62impl BoundTransport for RawBlockingClient {
63    fn endpoint_identity(&self) -> Result<EndpointIdentity<'_>, EndpointIdentityError> {
64        self.endpoint.identity()
65    }
66}
67
68impl fmt::Debug for RawBlockingClient {
69    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
70        formatter
71            .debug_struct("RawBlockingClient")
72            .field("endpoint", &"[redacted]")
73            .finish_non_exhaustive()
74    }
75}