cloud_sdk_reqwest/blocking/
raw.rs1use 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#[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}