Skip to main content

cdk_http_client/
client.rs

1//! HTTP client wrapper
2
3use serde::de::DeserializeOwned;
4
5pub use crate::backends::{HttpClient, HttpClientBuilder};
6use crate::response::Response;
7
8impl Default for HttpClient {
9    fn default() -> Self {
10        Self::new()
11    }
12}
13
14/// Convenience function for simple GET requests
15pub async fn fetch<R: DeserializeOwned>(url: &str) -> Response<R> {
16    HttpClient::new().fetch(url).await
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn test_client_new() {
25        let client = HttpClient::new();
26        let _ = format!("{:?}", client);
27        assert!(rustls::crypto::CryptoProvider::get_default().is_some());
28    }
29
30    #[test]
31    fn test_client_default() {
32        let client = HttpClient::default();
33        let _ = format!("{:?}", client);
34    }
35
36    #[test]
37    fn test_builder_returns_builder() {
38        let builder = HttpClient::builder();
39        let _ = format!("{:?}", builder);
40    }
41
42    #[test]
43    fn test_builder_build() {
44        let result = HttpClientBuilder::default().build();
45        assert!(result.is_ok());
46    }
47
48    #[test]
49    fn test_builder_proxy() {
50        let proxy_url = url::Url::parse("http://localhost:8080").expect("Valid proxy URL");
51        let result = HttpClientBuilder::default().proxy(proxy_url).build();
52        assert!(result.is_ok());
53    }
54
55    #[test]
56    fn test_builder_proxy_with_valid_matcher() {
57        let proxy_url = url::Url::parse("http://localhost:8080").expect("Valid proxy URL");
58        let result =
59            HttpClientBuilder::default().proxy_with_matcher(proxy_url, r".*\.example\.com$");
60        assert!(result.is_ok());
61
62        let builder = result.expect("Valid matcher should succeed");
63        let client_result = builder.build();
64        assert!(client_result.is_ok());
65    }
66
67    #[test]
68    fn test_builder_proxy_with_invalid_matcher() {
69        let proxy_url = url::Url::parse("http://localhost:8080").expect("Valid proxy URL");
70        let result = HttpClientBuilder::default().proxy_with_matcher(proxy_url, r"[invalid");
71        assert!(result.is_err());
72
73        if let Err(crate::error::HttpError::Proxy(msg)) = result {
74            assert!(msg.contains("Invalid proxy pattern"));
75        } else {
76            panic!("Expected HttpError::Proxy");
77        }
78    }
79
80    #[cfg(all(feature = "bitreq", not(feature = "reqwest")))]
81    mod bitreq_tests {
82        use super::*;
83        use crate::error::HttpError;
84
85        #[test]
86        fn test_builder_accept_invalid_certs_returns_error() {
87            let result = HttpClientBuilder::default()
88                .danger_accept_invalid_certs(true)
89                .build();
90            assert!(result.is_err());
91            if let Err(HttpError::Build(msg)) = result {
92                assert!(msg.contains("danger_accept_invalid_certs"));
93            } else {
94                panic!("Expected HttpError::Build");
95            }
96        }
97
98        #[test]
99        fn test_builder_accept_invalid_certs_false_ok() {
100            let result = HttpClientBuilder::default()
101                .danger_accept_invalid_certs(false)
102                .build();
103            assert!(result.is_ok());
104        }
105
106        #[test]
107        fn test_builder_http_proxy_ok() {
108            let proxy_url = url::Url::parse("http://localhost:8080").expect("Valid proxy URL");
109            let result = HttpClientBuilder::default().proxy(proxy_url).build();
110            assert!(result.is_ok());
111        }
112
113        #[test]
114        fn test_builder_socks_proxy_returns_error() {
115            let proxy_url = url::Url::parse("socks5h://localhost:9050").expect("Valid proxy URL");
116            let result = HttpClientBuilder::default().proxy(proxy_url).build();
117            assert!(result.is_err());
118            if let Err(HttpError::Proxy(msg)) = result {
119                assert!(msg.contains("Unsupported proxy URL scheme"));
120                assert!(msg.contains("socks5h"));
121            } else {
122                panic!("Expected HttpError::Proxy");
123            }
124        }
125
126        #[test]
127        fn test_builder_https_proxy_returns_error() {
128            let proxy_url = url::Url::parse("https://localhost:8080").expect("Valid proxy URL");
129            let result = HttpClientBuilder::default().proxy(proxy_url).build();
130            assert!(result.is_err());
131            if let Err(HttpError::Proxy(msg)) = result {
132                assert!(msg.contains("Unsupported proxy URL scheme"));
133                assert!(msg.contains("https"));
134            } else {
135                panic!("Expected HttpError::Proxy");
136            }
137        }
138    }
139
140    #[cfg(feature = "reqwest")]
141    mod reqwest_tests {
142        use super::*;
143
144        #[test]
145        fn test_builder_accept_invalid_certs_true_ok() {
146            let result = HttpClientBuilder::default()
147                .danger_accept_invalid_certs(true)
148                .build();
149            assert!(result.is_ok());
150        }
151
152        #[test]
153        fn test_builder_no_redirects() {
154            let result = HttpClientBuilder::default().no_redirects().build();
155            assert!(result.is_ok());
156        }
157
158        #[test]
159        fn test_builder_socks_proxy_ok() {
160            let proxy_url = url::Url::parse("socks5h://localhost:9050").expect("Valid proxy URL");
161            let result = HttpClientBuilder::default().proxy(proxy_url).build();
162            assert!(result.is_ok());
163        }
164    }
165}