Skip to main content

cloud_sdk_reqwest/blocking/
basic_config.rs

1use core::fmt;
2
3use crate::shared::{BasicCredential, BuildError, HttpsEndpoint, RequestTimeouts, UserAgent};
4
5use super::BlockingBasicClient;
6#[cfg(feature = "blocking-rustls-fips")]
7use super::config::FipsTlsPolicy;
8use super::config::{ClientSettings, configured_raw_client};
9
10/// Builder requiring a scoped Basic credential and complete transport limits.
11pub struct BlockingBasicClientBuilder {
12    endpoint: HttpsEndpoint,
13    credential: BasicCredential,
14    user_agent: UserAgent,
15    timeouts: RequestTimeouts,
16    #[cfg(feature = "blocking-rustls-fips")]
17    fips_tls_policy: Option<FipsTlsPolicy>,
18}
19
20impl BlockingBasicClientBuilder {
21    /// Creates a complete blocking Basic-client configuration.
22    #[must_use]
23    pub const fn new(
24        endpoint: HttpsEndpoint,
25        credential: BasicCredential,
26        user_agent: UserAgent,
27        timeouts: RequestTimeouts,
28    ) -> Self {
29        Self {
30            endpoint,
31            credential,
32            user_agent,
33            timeouts,
34            #[cfg(feature = "blocking-rustls-fips")]
35            fips_tls_policy: None,
36        }
37    }
38
39    /// Supplies mandatory deployment-managed roots and CRLs for FIPS TLS.
40    #[cfg(feature = "blocking-rustls-fips")]
41    #[must_use]
42    pub fn with_fips_tls_policy(mut self, policy: FipsTlsPolicy) -> Self {
43        self.fips_tls_policy = Some(policy);
44        self
45    }
46
47    /// Builds a hardened HTTPS-only Basic-auth client.
48    pub fn build(self) -> Result<BlockingBasicClient, BuildError> {
49        self.build_inner(true)
50    }
51
52    fn build_inner(self, https_only: bool) -> Result<BlockingBasicClient, BuildError> {
53        if !self.credential.scope().matches_endpoint(&self.endpoint) {
54            return Err(BuildError::CredentialEndpointMismatch);
55        }
56        let settings = ClientSettings {
57            timeouts: self.timeouts,
58            #[cfg(feature = "blocking-rustls-fips")]
59            fips_tls_policy: self.fips_tls_policy.as_ref(),
60            #[cfg(not(feature = "blocking-rustls-fips"))]
61            _lifetime: core::marker::PhantomData,
62        };
63        let client = configured_raw_client(
64            self.endpoint.clone(),
65            &self.user_agent,
66            settings,
67            https_only,
68        )?;
69        Ok(BlockingBasicClient::new(
70            client,
71            self.endpoint,
72            self.credential,
73            !https_only,
74        ))
75    }
76
77    #[cfg(test)]
78    pub(super) fn build_for_loopback(self) -> Result<BlockingBasicClient, BuildError> {
79        self.build_inner(false)
80    }
81}
82
83impl fmt::Debug for BlockingBasicClientBuilder {
84    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
85        let mut debug = formatter.debug_struct("BlockingBasicClientBuilder");
86        debug
87            .field("endpoint", &"[redacted]")
88            .field("credential", &"[redacted]")
89            .field("user_agent", &self.user_agent)
90            .field("timeouts", &self.timeouts);
91        #[cfg(feature = "blocking-rustls-fips")]
92        debug.field("fips_tls_policy", &self.fips_tls_policy);
93        debug.finish()
94    }
95}