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;
6use super::config::{ClientSettings, configured_raw_client};
7
8/// Builder requiring a scoped Basic credential and complete transport limits.
9pub struct BlockingBasicClientBuilder {
10    endpoint: HttpsEndpoint,
11    credential: BasicCredential,
12    user_agent: UserAgent,
13    timeouts: RequestTimeouts,
14}
15
16impl BlockingBasicClientBuilder {
17    /// Creates a complete blocking Basic-client configuration.
18    #[must_use]
19    pub const fn new(
20        endpoint: HttpsEndpoint,
21        credential: BasicCredential,
22        user_agent: UserAgent,
23        timeouts: RequestTimeouts,
24    ) -> Self {
25        Self {
26            endpoint,
27            credential,
28            user_agent,
29            timeouts,
30        }
31    }
32
33    /// Builds a hardened HTTPS-only Basic-auth client.
34    pub fn build(self) -> Result<BlockingBasicClient, BuildError> {
35        self.build_inner(true)
36    }
37
38    fn build_inner(self, https_only: bool) -> Result<BlockingBasicClient, BuildError> {
39        if !self.credential.scope().matches_endpoint(&self.endpoint) {
40            return Err(BuildError::CredentialEndpointMismatch);
41        }
42        let settings = ClientSettings {
43            timeouts: self.timeouts,
44        };
45        let client = configured_raw_client(
46            self.endpoint.clone(),
47            &self.user_agent,
48            settings,
49            https_only,
50        )?;
51        Ok(BlockingBasicClient::new(
52            client,
53            self.endpoint,
54            self.credential,
55            !https_only,
56        ))
57    }
58
59    #[cfg(test)]
60    pub(super) fn build_for_loopback(self) -> Result<BlockingBasicClient, BuildError> {
61        self.build_inner(false)
62    }
63}
64
65impl fmt::Debug for BlockingBasicClientBuilder {
66    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
67        let mut debug = formatter.debug_struct("BlockingBasicClientBuilder");
68        debug
69            .field("endpoint", &"[redacted]")
70            .field("credential", &"[redacted]")
71            .field("user_agent", &self.user_agent)
72            .field("timeouts", &self.timeouts);
73        debug.finish()
74    }
75}