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;
9use http::header::HeaderValue;
10
11use crate::shared::{HttpsEndpoint, RawHttpError, RawHyperClient, RawTransportFailure};
12
13#[derive(Clone)]
15pub struct RawBlockingClient {
16 inner: RawHyperClient,
17 endpoint: HttpsEndpoint,
18}
19
20impl RawBlockingClient {
21 pub(super) const fn new(inner: RawHyperClient, endpoint: HttpsEndpoint) -> Self {
22 Self { inner, endpoint }
23 }
24
25 fn execute_inner(
26 &self,
27 request: TransportRequest<'_>,
28 policy: RawResponsePolicy<'_>,
29 response_writer: &mut ResponseWriter<'_>,
30 ) -> Result<(), RawTransportFailure> {
31 if tokio::runtime::Handle::try_current().is_ok() {
32 return Err(TransportFailure::not_sent(
33 RawHttpError::BlockingRuntimeContext,
34 ));
35 }
36 let runtime = tokio::runtime::Builder::new_current_thread()
37 .enable_all()
38 .build()
39 .map_err(|_| TransportFailure::not_sent(RawHttpError::RuntimeInitializationFailed))?;
40 runtime.block_on(self.inner.execute(request, policy, response_writer))
41 }
42
43 pub(crate) fn execute_authenticated(
44 &self,
45 request: TransportRequest<'_>,
46 policy: RawResponsePolicy<'_>,
47 authorization: HeaderValue,
48 response_writer: &mut ResponseWriter<'_>,
49 ) -> Result<(), RawTransportFailure> {
50 if tokio::runtime::Handle::try_current().is_ok() {
51 return Err(TransportFailure::not_sent(
52 RawHttpError::BlockingRuntimeContext,
53 ));
54 }
55 let runtime = tokio::runtime::Builder::new_current_thread()
56 .enable_all()
57 .build()
58 .map_err(|_| TransportFailure::not_sent(RawHttpError::RuntimeInitializationFailed))?;
59 runtime.block_on(self.inner.execute_authenticated(
60 request,
61 policy,
62 authorization,
63 response_writer,
64 ))
65 }
66}
67
68impl BlockingRawHttpExecutor for RawBlockingClient {
69 type Error = RawTransportFailure;
70
71 fn execute(
72 &self,
73 request: TransportRequest<'_>,
74 policy: RawResponsePolicy<'_>,
75 response: &mut ResponseWriter<'_>,
76 ) -> Result<(), Self::Error> {
77 self.execute_inner(request, policy, response)
78 }
79}
80
81impl ResponseStorageSanitizer for RawBlockingClient {
82 fn sanitize_response_storage(&self, response_storage: &mut [u8]) {
83 sanitize_bytes(response_storage);
84 }
85}
86
87impl BoundTransport for RawBlockingClient {
88 fn endpoint_identity(&self) -> Result<EndpointIdentity<'_>, EndpointIdentityError> {
89 self.endpoint.identity()
90 }
91}
92
93impl fmt::Debug for RawBlockingClient {
94 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
95 formatter
96 .debug_struct("RawBlockingClient")
97 .field("endpoint", &"[redacted]")
98 .finish_non_exhaustive()
99 }
100}