diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index 60bd57a94..13b977ea2 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -825,6 +825,7 @@ dependencies = [
"windows-sys 0.61.2",
"winreg 0.52.0",
"zip 2.4.2",
+ "zstd",
]
[[package]]
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 9f7841511..9fc61c123 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -43,6 +43,7 @@ reqwest = { version = "0.12", features = ["rustls-tls", "json", "stream", "socks
arboard = "3.6"
flate2 = "1"
brotli = "7"
+zstd = "0.13"
tokio = { version = "1", features = ["macros", "rt-multi-thread", "time", "sync"] }
futures = "0.3"
async-stream = "0.3"
diff --git a/src-tauri/src/proxy/content_encoding.rs b/src-tauri/src/proxy/content_encoding.rs
new file mode 100644
index 000000000..970ffd289
--- /dev/null
+++ b/src-tauri/src/proxy/content_encoding.rs
@@ -0,0 +1,234 @@
+//! HTTP content-encoding 工具。
+//!
+//! reqwest 的自动解压已禁用(为了透传 accept-encoding),需要手动解压。
+//! 请求侧(如 Codex Desktop 在登录态发压缩请求体)与响应侧(上游压缩响应体)
+//! 共用同一套解压逻辑。
+
+use axum::http::header::HeaderMap;
+use std::io::Read;
+
+/// 把 content-encoding 值拆成有序 coding 列表(去掉 identity 与空值)。
+///
+/// HTTP 允许堆叠编码(如 `gzip, zstd`),各 coding 以逗号分隔;亦允许重复
+/// content-encoding 头,语义等同逗号拼接(见 [`get_content_encoding`])。
+fn split_codings(content_encoding: &str) -> Vec<&str> {
+ content_encoding
+ .split(',')
+ .map(str::trim)
+ .filter(|c| !c.is_empty() && *c != "identity")
+ .collect()
+}
+
+/// 单个 coding 是否可被解压。
+fn is_single_supported(coding: &str) -> bool {
+ matches!(
+ coding,
+ "gzip" | "x-gzip" | "deflate" | "br" | "zstd" | "zst"
+ )
+}
+
+/// 解压单个 content-coding。未知编码返回 `Ok(None)`。
+fn decompress_single(coding: &str, body: &[u8]) -> Result