From 3f9042c9eab6f1a175d9ce83f4b807fa1a472e0f Mon Sep 17 00:00:00 2001 From: zonyitoo Date: Fri, 23 Apr 2021 10:09:55 +0800 Subject: [PATCH] HTTP proxy preserves headers' title case - fixes #491 - ref hyperium/hyper#2313 --- Cargo.lock | 36 +++++++++---------- crates/shadowsocks-service/Cargo.toml | 2 +- .../src/local/http/client_cache.rs | 5 ++- .../src/local/http/server.rs | 7 +++- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 39a83dda150d..b46d69a277fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,9 +585,9 @@ checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9" [[package]] name = "humantime" @@ -597,9 +597,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1" +checksum = "1e5f105c494081baa3bf9e200b279e27ec1623895cd504c7dbef8d0b080fcf54" dependencies = [ "bytes", "futures-channel", @@ -1253,9 +1253,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19" +checksum = "2a26af418b574bd56588335b3a3659a65725d4e636eb1016c2f9e3b38c7cc759" dependencies = [ "aho-corasick", "memchr", @@ -1594,9 +1594,9 @@ checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27" [[package]] name = "slab" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" [[package]] name = "smallvec" @@ -1666,9 +1666,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" +checksum = "b9505f307c872bab8eb46f77ae357c8eba1fdacead58ee5a850116b1d7f82883" dependencies = [ "proc-macro2", "quote", @@ -1921,9 +1921,9 @@ checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" [[package]] name = "trust-dns-https" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f5a85f9974174213ae487f27bad10485dd8336b20e1b45b1946d832a870c94" +checksum = "45d7695e335eaf31c59beae8964535540436f302bdab856ce6cff17df21da0f6" dependencies = [ "bytes", "cfg-if", @@ -1944,9 +1944,9 @@ dependencies = [ [[package]] name = "trust-dns-proto" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d57e219ba600dd96c2f6d82eb79645068e14edbc5c7e27514af40436b88150c" +checksum = "952a078337565ba39007de99b151770f41039253a31846f0a3d5cd5a4ac8eedf" dependencies = [ "async-trait", "cfg-if", @@ -1970,9 +1970,9 @@ dependencies = [ [[package]] name = "trust-dns-resolver" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0437eea3a6da51acc1e946545ff53d5b8fb2611ff1c3bed58522dde100536ae" +checksum = "da9c97f7d103e0f94dbe384a57908833505ae5870126492f166821b7cf685589" dependencies = [ "cfg-if", "futures-util", @@ -1996,9 +1996,9 @@ dependencies = [ [[package]] name = "trust-dns-rustls" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d327928ba8d8bdcf3fe9a7ee34d9b0e040b6ab2a5bd7c1cf8dfeabdaea696b" +checksum = "3a1c25b0ebd52c90ac9f95ba3e51fca2e375ea542c72016c08f6f96cc1a0515b" dependencies = [ "futures-channel", "futures-io", diff --git a/crates/shadowsocks-service/Cargo.toml b/crates/shadowsocks-service/Cargo.toml index b6103a11c460..413a5b23839b 100644 --- a/crates/shadowsocks-service/Cargo.toml +++ b/crates/shadowsocks-service/Cargo.toml @@ -97,7 +97,7 @@ socket2 = { version = "0.4", features = ["all"] } libc = "0.2" http = { version = "0.2", optional = true } -hyper = { version = "0.14", optional = true, features = ["full"] } +hyper = { version = "0.14.7", optional = true, features = ["full"] } tower = { version = "0.4", optional = true } trust-dns-resolver = { version = "0.20.1", optional = true, features = ["serde-config"] } diff --git a/crates/shadowsocks-service/src/local/http/client_cache.rs b/crates/shadowsocks-service/src/local/http/client_cache.rs index 5a8c27020d22..ddf8dfb79871 100644 --- a/crates/shadowsocks-service/src/local/http/client_cache.rs +++ b/crates/shadowsocks-service/src/local/http/client_cache.rs @@ -34,7 +34,10 @@ impl ProxyClientCache { } // Create a new client - let client = Client::builder().build::<_, Body>(ProxyConnector::new(self.context.clone(), server.clone())); + let client = Client::builder() + .http1_preserve_header_case(true) + .http1_title_case_headers(true) + .build::<_, Body>(ProxyConnector::new(self.context.clone(), server.clone())); cache.insert(server_config.addr().clone(), client.clone()); client diff --git a/crates/shadowsocks-service/src/local/http/server.rs b/crates/shadowsocks-service/src/local/http/server.rs index c0e96b3a2f29..fa39be56c1b5 100644 --- a/crates/shadowsocks-service/src/local/http/server.rs +++ b/crates/shadowsocks-service/src/local/http/server.rs @@ -51,7 +51,10 @@ impl Http { /// Run server pub async fn run(self, client_config: &ServerAddr, balancer: PingBalancer) -> io::Result<()> { - let bypass_client = Client::builder().build::<_, Body>(BypassConnector::new(self.context.clone())); + let bypass_client = Client::builder() + .http1_preserve_header_case(true) + .http1_title_case_headers(true) + .build::<_, Body>(BypassConnector::new(self.context.clone())); let context = self.context.clone(); let proxy_client_cache = self.proxy_client_cache.clone(); @@ -89,6 +92,8 @@ impl Http { let server = match bind_result { Ok(builder) => builder .http1_only(true) + .http1_preserve_header_case(true) + .http1_title_case_headers(true) .tcp_sleep_on_accept_errors(true) .serve(make_service), Err(err) => {