cdk_http_client/
client.rs1use 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
14pub 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}