use std::time::Duration;
use crate::addr::{AddrReason, AddrResult, access_ctrl::UnitCtrl};
use orion_error::conversion::ToStructError;
use orion_error::prelude::ErrorWith;
use reqwest::{ClientBuilder, Proxy};
pub fn create_http_client_by_ctrl(ctrl: Option<UnitCtrl>) -> AddrResult<reqwest::Client> {
let mut builder = if let Some(timeout) = ctrl.as_ref().and_then(|x| x.timeout().clone()) {
ClientBuilder::new()
.connect_timeout(timeout.connect_duration())
.read_timeout(timeout.read_duration())
.timeout(timeout.total_duration())
.tcp_keepalive(Duration::from_secs(60))
.pool_idle_timeout(Duration::from_secs(90))
} else {
ClientBuilder::new()
};
if let Some(proxy) = ctrl.as_ref().and_then(|x| x.proxy().clone()) {
if let Ok(proxy) = Proxy::all(proxy.url().as_str()) {
builder = builder.proxy(proxy);
} else {
tracing::warn!("无效的代理设置: {}", proxy.url());
}
}
builder.build().map_err(|e| {
tracing::error!("创建HTTP客户端失败: {}", e);
AddrReason::resource_error()
.to_err()
.doing(format!("create HTTP client failed: {e}"))
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::addr::access_ctrl::UnitCtrl;
use crate::addr::proxy::ProxyConfig;
use crate::timeout::TimeoutConfig;
#[test]
fn test_create_http_client_by_ctrl_none() {
let client = create_http_client_by_ctrl(None);
assert!(client.is_ok());
}
#[test]
fn test_create_http_client_by_ctrl_with_timeout() {
let timeout_config = TimeoutConfig::http_simple();
let unit_ctrl = UnitCtrl::new(None, Some(timeout_config), None);
let client = create_http_client_by_ctrl(Some(unit_ctrl));
assert!(client.is_ok());
}
#[test]
fn test_create_http_client_by_ctrl_with_proxy() {
let proxy_config = ProxyConfig::new("http://proxy.example.com:8080");
let unit_ctrl = UnitCtrl::new(None, None, Some(proxy_config));
let client = create_http_client_by_ctrl(Some(unit_ctrl));
assert!(client.is_ok());
}
#[test]
fn test_create_http_client_by_ctrl_with_invalid_proxy() {
let proxy_config = ProxyConfig::new(""); let unit_ctrl = UnitCtrl::new(None, None, Some(proxy_config));
let client = create_http_client_by_ctrl(Some(unit_ctrl));
assert!(client.is_ok());
}
#[test]
fn test_create_http_client_by_ctrl_with_all_configs() {
let timeout_config = TimeoutConfig::http_large_file();
let proxy_config = ProxyConfig::new("http://proxy.example.com:8080");
let unit_ctrl = UnitCtrl::new(None, Some(timeout_config), Some(proxy_config));
let client = create_http_client_by_ctrl(Some(unit_ctrl));
assert!(client.is_ok());
}
}