1use std::time::Duration;
4
5#[derive(Debug, Clone)]
11pub struct HttpDefaults {
12 pub timeout: Duration,
14 pub connect_timeout: Duration,
16 pub pool_max_idle_per_host: usize,
18 pub user_agent: String,
20}
21
22const LLM_HTTP_TIMEOUT: Duration = Duration::from_secs(120);
23const LLM_HTTP_CONNECT_TIMEOUT: Duration = Duration::from_secs(10);
24
25pub const DEFAULT_HTTP_DEFAULTS: HttpDefaults = HttpDefaults {
28 timeout: LLM_HTTP_TIMEOUT,
29 connect_timeout: LLM_HTTP_CONNECT_TIMEOUT,
30 pool_max_idle_per_host: 4,
31 user_agent: String::new(),
32};
33
34pub fn build_http_client(defaults: &HttpDefaults) -> reqwest::Client {
40 let mut builder = reqwest::Client::builder()
41 .timeout(defaults.timeout)
42 .connect_timeout(defaults.connect_timeout)
43 .pool_max_idle_per_host(defaults.pool_max_idle_per_host)
44 .redirect(reqwest::redirect::Policy::none());
45 if !defaults.user_agent.is_empty() {
46 builder = builder.user_agent(&defaults.user_agent);
47 }
48 builder
49 .build()
50 .expect("reqwest::Client::builder() with valid HttpDefaults must succeed")
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn defaults_match_pre_extraction_provider_constants() {
59 assert_eq!(DEFAULT_HTTP_DEFAULTS.timeout, Duration::from_secs(120));
60 assert_eq!(
61 DEFAULT_HTTP_DEFAULTS.connect_timeout,
62 Duration::from_secs(10)
63 );
64 assert_eq!(DEFAULT_HTTP_DEFAULTS.pool_max_idle_per_host, 4);
65 }
66
67 #[test]
68 fn build_http_client_returns_a_client() {
69 let _ = build_http_client(&DEFAULT_HTTP_DEFAULTS);
70 }
71
72 #[test]
73 fn build_http_client_with_user_agent() {
74 let cfg = HttpDefaults {
75 user_agent: "klieo-test/0.1".into(),
76 ..DEFAULT_HTTP_DEFAULTS
77 };
78 let _ = build_http_client(&cfg);
79 }
80}