mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-24 12:44:18 +08:00
1a0e8c7a44
* fix(proxy): decompress Codex request body before forward, support zstd Codex Desktop sends zstd-compressed request bodies when authenticated against the Codex backend, which broke local proxy routing because the handlers parsed the raw bytes with serde_json directly. Reworked on top of current main so it preserves the response_processor behavior that landed after this PR was first opened: - Extract content-encoding helpers into a shared proxy::content_encoding module. decompress_body keeps returning Option<Vec<u8>> so unknown encodings stay pass-through with their content-encoding header intact, and keeps the deflate zlib-then-raw fallback (RFC 9110). - Add zstd/zst support (zstd 0.13) and disable reqwest's auto zstd decompression via .no_zstd() for parity with gzip/br/deflate. - Decompress the request body before JSON parsing in the three Codex handlers (chat_completions / responses / responses_compact) and strip the stale content-encoding / content-length / transfer-encoding headers so the forwarder regenerates them. - Support stacked codings (e.g. "gzip, zstd") by decoding in reverse order and merge repeated Content-Encoding headers via get_all. Fixes #3764 Fixes #3696 Co-authored-by: chenx-dust <16610294+chenx-dust@users.noreply.github.com> * fix(proxy): decompress upstream error bodies before reading them The forwarder error branch consumes non-2xx responses via String::from_utf8 directly, bypassing read_decoded_body. reqwest has no auto-decompression feature enabled, so a compressed error body (gzip/br/deflate/zstd) arrives as raw bytes, fails from_utf8, and gets dropped, hiding upstream rate-limit and auth details from the client. Decode the error body with the shared proxy::content_encoding helper, mirroring the success path. Falls back to the raw bytes when the encoding is unsupported or decoding fails. Co-authored-by: chenx-dust <16610294+chenx-dust@users.noreply.github.com> --------- Co-authored-by: Jason <farion1231@gmail.com> Co-authored-by: chenx-dust <16610294+chenx-dust@users.noreply.github.com>
114 lines
3.2 KiB
TOML
114 lines
3.2 KiB
TOML
[package]
|
||
name = "cc-switch"
|
||
version = "3.16.3"
|
||
description = "All-in-One Assistant for Claude Code, Codex & Gemini CLI"
|
||
authors = ["Jason Young"]
|
||
license = "MIT"
|
||
repository = "https://github.com/farion1231/cc-switch"
|
||
edition = "2021"
|
||
rust-version = "1.85.0"
|
||
|
||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||
|
||
[lib]
|
||
name = "cc_switch_lib"
|
||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||
doctest = false
|
||
|
||
[features]
|
||
default = []
|
||
test-hooks = []
|
||
|
||
[build-dependencies]
|
||
tauri-build = { version = "2.4.0", features = [] }
|
||
|
||
[dependencies]
|
||
serde_json = { version = "1.0", features = ["preserve_order"] }
|
||
serde = { version = "1.0", features = ["derive"] }
|
||
log = "0.4"
|
||
chrono = { version = "0.4", features = ["serde"] }
|
||
tauri = { version = "2.8.2", features = ["tray-icon", "protocol-asset", "image-png"] }
|
||
tauri-plugin-log = "2"
|
||
tauri-plugin-opener = "2"
|
||
tauri-plugin-process = "2"
|
||
tauri-plugin-updater = "2"
|
||
tauri-plugin-dialog = "2"
|
||
tauri-plugin-store = "2"
|
||
tauri-plugin-deep-link = "2"
|
||
tauri-plugin-window-state = "2"
|
||
dirs = "5.0"
|
||
toml = "0.8"
|
||
toml_edit = "0.22"
|
||
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"
|
||
bytes = "1.5"
|
||
axum = "0.7"
|
||
tower = "0.4"
|
||
tower-http = { version = "0.5", features = ["cors"] }
|
||
hyper = { version = "1.0", features = ["full"] }
|
||
hyper-util = { version = "0.1", features = ["tokio", "http1", "client-legacy"] }
|
||
hyper-rustls = { version = "0.27", features = ["http1", "tls12", "ring", "webpki-tokio"] }
|
||
http = "1"
|
||
http-body = "1"
|
||
http-body-util = "0.1"
|
||
httparse = "1"
|
||
tokio-rustls = "0.26"
|
||
rustls = "0.23"
|
||
webpki-roots = "0.26"
|
||
rustls-native-certs = "0.8"
|
||
regex = "1.10"
|
||
rquickjs = { version = "0.8", features = ["array-buffer", "classes"] }
|
||
thiserror = "2.0"
|
||
anyhow = "1.0"
|
||
zip = "2.2"
|
||
serde_yaml = "0.9"
|
||
tempfile = "3"
|
||
url = "2.5"
|
||
auto-launch = "0.5"
|
||
once_cell = "1.21.3"
|
||
base64 = "0.22"
|
||
rusqlite = { version = "0.31", features = ["bundled", "backup", "hooks"] }
|
||
indexmap = { version = "2", features = ["serde"] }
|
||
rust_decimal = "1.33"
|
||
uuid = { version = "1.11", features = ["v4"] }
|
||
sha2 = "0.10"
|
||
hmac = "0.12"
|
||
json5 = "0.4"
|
||
json-five = "0.3.1"
|
||
|
||
[target.'cfg(any(target_os = "macos", target_os = "windows", target_os = "linux"))'.dependencies]
|
||
tauri-plugin-single-instance = "2"
|
||
|
||
[target.'cfg(target_os = "linux")'.dependencies]
|
||
webkit2gtk = { version = "2.0.1", features = ["v2_16"] }
|
||
|
||
[target.'cfg(target_os = "windows")'.dependencies]
|
||
winreg = "0.52"
|
||
windows-sys = { version = "0.61", features = ["Win32_Globalization", "Win32_UI_Shell"] }
|
||
|
||
[target.'cfg(all(target_os = "windows", target_arch = "aarch64"))'.dependencies]
|
||
rquickjs = { version = "0.8", features = ["bindgen"] }
|
||
|
||
[target.'cfg(target_os = "macos")'.dependencies]
|
||
objc2 = "0.5"
|
||
objc2-app-kit = { version = "0.2", features = ["NSColor"] }
|
||
|
||
# Optimize release binary size to help reduce AppImage footprint
|
||
[profile.release]
|
||
codegen-units = 1
|
||
lto = "thin"
|
||
opt-level = "s"
|
||
# 使用 unwind 以便 panic hook 能捕获 backtrace(abort 会直接终止无法捕获)
|
||
panic = "unwind"
|
||
strip = "symbols"
|
||
|
||
[dev-dependencies]
|
||
serial_test = "3"
|
||
tempfile = "3"
|