Skip to content

Commit 85c32b1

Browse files
author
root
committed
feat: make upstream timeout configurable
1 parent ee7e9eb commit 85c32b1

3 files changed

Lines changed: 14 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145
- `PORT`:监听端口,默认 `8000`
146146
- `DEBUG`:调试开关,默认 `true`
147147
- `LOG_LEVEL`:日志级别,默认 `INFO`
148+
- `UPSTREAM_HTTP_TIMEOUT_SECS`:代理请求上游时的全局 HTTP 超时,默认 `60`
148149
- `ACCESS_LOG_FILE`
149150
- `MODERATION_LOG_FILE`
150151
- `TRAINING_LOG_FILE`

src/config.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub struct Settings {
1313
pub port: u16,
1414
pub debug: bool,
1515
pub log_level: String,
16+
pub upstream_http_timeout_secs: u64,
1617
pub access_log_file: String,
1718
pub moderation_log_file: String,
1819
pub training_log_file: String,
@@ -47,6 +48,10 @@ impl Settings {
4748
.unwrap_or(8000),
4849
debug: parse_bool_env("DEBUG", true),
4950
log_level: env::var("LOG_LEVEL").unwrap_or_else(|_| "INFO".to_string()),
51+
upstream_http_timeout_secs: env::var("UPSTREAM_HTTP_TIMEOUT_SECS")
52+
.ok()
53+
.and_then(|v| v.parse().ok())
54+
.unwrap_or(60),
5055
access_log_file: env::var("ACCESS_LOG_FILE")
5156
.unwrap_or_else(|_| "logs/access.log".to_string()),
5257
moderation_log_file: env::var("MODERATION_LOG_FILE")
@@ -108,12 +113,14 @@ mod tests {
108113
fn settings_default_training_rpc_uses_unix_socket() {
109114
let _guard = env_test_lock().lock().expect("env test lock");
110115
let root_dir = PathBuf::from("/tmp/prismguard-config-defaults");
116+
std::env::remove_var("UPSTREAM_HTTP_TIMEOUT_SECS");
111117
std::env::remove_var("TRAINING_DATA_RPC_ENABLED");
112118
std::env::remove_var("TRAINING_DATA_RPC_TRANSPORT");
113119
std::env::remove_var("TRAINING_DATA_RPC_UNIX_SOCKET");
114120

115121
let settings = Settings::load(&root_dir).expect("load settings");
116122

123+
assert_eq!(settings.upstream_http_timeout_secs, 60);
117124
assert!(settings.training_data_rpc_enabled);
118125
assert_eq!(settings.training_data_rpc_transport, "unix");
119126
assert_eq!(
@@ -126,16 +133,19 @@ mod tests {
126133
fn settings_can_override_training_rpc_env() {
127134
let _guard = env_test_lock().lock().expect("env test lock");
128135
let root_dir = PathBuf::from("/tmp/prismguard-config-overrides");
136+
std::env::set_var("UPSTREAM_HTTP_TIMEOUT_SECS", "300");
129137
std::env::set_var("TRAINING_DATA_RPC_ENABLED", "0");
130138
std::env::set_var("TRAINING_DATA_RPC_TRANSPORT", "tcp");
131139
std::env::set_var("TRAINING_DATA_RPC_UNIX_SOCKET", "/tmp/custom.sock");
132140

133141
let settings = Settings::load(&root_dir).expect("load settings");
134142

143+
assert_eq!(settings.upstream_http_timeout_secs, 300);
135144
assert!(!settings.training_data_rpc_enabled);
136145
assert_eq!(settings.training_data_rpc_transport, "tcp");
137146
assert_eq!(settings.training_data_rpc_unix_socket, "/tmp/custom.sock");
138147

148+
std::env::remove_var("UPSTREAM_HTTP_TIMEOUT_SECS");
139149
std::env::remove_var("TRAINING_DATA_RPC_ENABLED");
140150
std::env::remove_var("TRAINING_DATA_RPC_TRANSPORT");
141151
std::env::remove_var("TRAINING_DATA_RPC_UNIX_SOCKET");

src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ async fn run_server() -> Result<()> {
6262
.tcp_keepalive(std::time::Duration::from_secs(30))
6363
.pool_idle_timeout(std::time::Duration::from_secs(30))
6464
.pool_max_idle_per_host(200)
65-
.timeout(std::time::Duration::from_secs(60))
65+
.timeout(std::time::Duration::from_secs(
66+
settings.upstream_http_timeout_secs,
67+
))
6668
.build()
6769
.context("failed to build reqwest client")?,
6870
};

0 commit comments

Comments
 (0)