Merge pull request #229 from junkurihara/develop

0.9.6
This commit is contained in:
Jun Kurihara 2025-01-06 19:19:28 +09:00 committed by GitHub
commit 5fdbc2186e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 42 additions and 36 deletions

View file

@ -1,6 +1,13 @@
# CHANGELOG # CHANGELOG
## 0.9.6 or 0.10.0 (Unreleased) ## 0.9.7 or 0.10.0 (Unreleased)
## 0.9.6
### Improvement
- Feat: Change the default hashing algorithm for internal hashmaps and hashsets from FxHash to aHash. This change is to improve the security against HashDos attacks for colliding domain names and paths, and to improve the speed of hash operations for string keys (c.f., [the performance comparison](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md)).
- Deps and refactor
## 0.9.5 ## 0.9.5

View file

@ -1,5 +1,5 @@
[workspace.package] [workspace.package]
version = "0.9.5" version = "0.9.6"
authors = ["Jun Kurihara"] authors = ["Jun Kurihara"]
homepage = "https://github.com/junkurihara/rust-rpxy" homepage = "https://github.com/junkurihara/rust-rpxy"
repository = "https://github.com/junkurihara/rust-rpxy" repository = "https://github.com/junkurihara/rust-rpxy"

View file

@ -15,12 +15,12 @@ post-quantum = ["rustls-post-quantum"]
[dependencies] [dependencies]
url = { version = "2.5.4" } url = { version = "2.5.4" }
rustc-hash = "2.1.0" ahash = "0.8.11"
thiserror = "2.0.6" thiserror = "2.0.9"
tracing = "0.1.41" tracing = "0.1.41"
async-trait = "0.1.83" async-trait = "0.1.84"
base64 = "0.22.1" base64 = "0.22.1"
aws-lc-rs = { version = "1.11.1", default-features = false, features = [ aws-lc-rs = { version = "1.12.0", default-features = false, features = [
"aws-lc-sys", "aws-lc-sys",
] } ] }
blocking = "1.6.1" blocking = "1.6.1"
@ -28,7 +28,7 @@ rustls = { version = "0.23.20", default-features = false, features = [
"std", "std",
"aws_lc_rs", "aws_lc_rs",
] } ] }
rustls-platform-verifier = { version = "0.4.0" } rustls-platform-verifier = { version = "0.5.0" }
rustls-acme = { path = "../submodules/rustls-acme/", default-features = false, features = [ rustls-acme = { path = "../submodules/rustls-acme/", default-features = false, features = [
"aws-lc-rs", "aws-lc-rs",
] } ] }

View file

@ -4,7 +4,7 @@ use crate::{
error::RpxyAcmeError, error::RpxyAcmeError,
log::*, log::*,
}; };
use rustc_hash::FxHashMap as HashMap; use ahash::HashMap;
use rustls::ServerConfig; use rustls::ServerConfig;
use rustls_acme::AcmeConfig; use rustls_acme::AcmeConfig;
use std::{path::PathBuf, sync::Arc}; use std::{path::PathBuf, sync::Arc};

View file

@ -30,9 +30,9 @@ rpxy-lib = { path = "../rpxy-lib/", default-features = false, features = [
] } ] }
mimalloc = { version = "*", default-features = false } mimalloc = { version = "*", default-features = false }
anyhow = "1.0.94" anyhow = "1.0.95"
rustc-hash = "2.1.0" ahash = "0.8.11"
serde = { version = "1.0.216", default-features = false, features = ["derive"] } serde = { version = "1.0.217", default-features = false, features = ["derive"] }
tokio = { version = "1.42.0", default-features = false, features = [ tokio = { version = "1.42.0", default-features = false, features = [
"net", "net",
"rt-multi-thread", "rt-multi-thread",
@ -41,7 +41,7 @@ tokio = { version = "1.42.0", default-features = false, features = [
"macros", "macros",
] } ] }
tokio-util = { version = "0.7.13", default-features = false } tokio-util = { version = "0.7.13", default-features = false }
async-trait = "0.1.83" async-trait = "0.1.84"
futures-util = { version = "0.3.31", default-features = false } futures-util = { version = "0.3.31", default-features = false }
# config # config

View file

@ -1,10 +1,10 @@
use super::toml::ConfigToml; use super::toml::ConfigToml;
use crate::error::{anyhow, ensure}; use crate::error::{anyhow, ensure};
use ahash::HashMap;
use clap::{Arg, ArgAction}; use clap::{Arg, ArgAction};
use hot_reload::{ReloaderReceiver, ReloaderService}; use hot_reload::{ReloaderReceiver, ReloaderService};
use rpxy_certs::{build_cert_reloader, CryptoFileSourceBuilder, CryptoReloader, ServerCryptoBase}; use rpxy_certs::{build_cert_reloader, CryptoFileSourceBuilder, CryptoReloader, ServerCryptoBase};
use rpxy_lib::{AppConfig, AppConfigList, ProxyConfig}; use rpxy_lib::{AppConfig, AppConfigList, ProxyConfig};
use rustc_hash::FxHashMap as HashMap;
#[cfg(feature = "acme")] #[cfg(feature = "acme")]
use rpxy_acme::{AcmeManager, ACME_DIR_URL, ACME_REGISTRY_PATH}; use rpxy_acme::{AcmeManager, ACME_DIR_URL, ACME_REGISTRY_PATH};

View file

@ -3,8 +3,8 @@ use crate::{
error::{anyhow, ensure}, error::{anyhow, ensure},
log::warn, log::warn,
}; };
use ahash::HashMap;
use rpxy_lib::{reexports::Uri, AppConfig, ProxyConfig, ReverseProxyConfig, TlsConfig, UpstreamUri}; use rpxy_lib::{reexports::Uri, AppConfig, ProxyConfig, ReverseProxyConfig, TlsConfig, UpstreamUri};
use rustc_hash::FxHashMap as HashMap;
use serde::Deserialize; use serde::Deserialize;
use std::{fs, net::SocketAddr}; use std::{fs, net::SocketAddr};
use tokio::time::Duration; use tokio::time::Duration;
@ -232,7 +232,7 @@ impl ConfigToml {
// Check unused fields during deserialization // Check unused fields during deserialization
let t = toml::de::Deserializer::new(&config_str); let t = toml::de::Deserializer::new(&config_str);
let mut unused = rustc_hash::FxHashSet::default(); let mut unused = ahash::HashSet::default();
let res = serde_ignored::deserialize(t, |path| { let res = serde_ignored::deserialize(t, |path| {
unused.insert(path.to_string()); unused.insert(path.to_string());

View file

@ -16,12 +16,12 @@ post-quantum = ["rustls-post-quantum"]
http3 = [] http3 = []
[dependencies] [dependencies]
rustc-hash = { version = "2.1.0" } ahash = { version = "0.8.11" }
tracing = { version = "0.1.41" } tracing = { version = "0.1.41" }
derive_builder = { version = "0.20.2" } derive_builder = { version = "0.20.2" }
thiserror = { version = "2.0.6" } thiserror = { version = "2.0.9" }
hot_reload = { version = "0.1.8" } hot_reload = { version = "0.1.8" }
async-trait = { version = "0.1.83" } async-trait = { version = "0.1.84" }
rustls = { version = "0.23.20", default-features = false, features = [ rustls = { version = "0.23.20", default-features = false, features = [
"std", "std",
"aws_lc_rs", "aws_lc_rs",

View file

@ -1,5 +1,5 @@
use crate::error::*; use crate::error::*;
use rustc_hash::FxHashMap as HashMap; use ahash::HashMap;
use rustls::{crypto::aws_lc_rs::sign::any_supported_type, pki_types, sign::CertifiedKey}; use rustls::{crypto::aws_lc_rs::sign::any_supported_type, pki_types, sign::CertifiedKey};
use std::sync::Arc; use std::sync::Arc;
use x509_parser::prelude::*; use x509_parser::prelude::*;

View file

@ -10,8 +10,8 @@ mod log {
} }
use crate::{error::*, log::*, reloader_service::DynCryptoSource}; use crate::{error::*, log::*, reloader_service::DynCryptoSource};
use ahash::HashMap;
use hot_reload::{ReloaderReceiver, ReloaderService}; use hot_reload::{ReloaderReceiver, ReloaderService};
use rustc_hash::FxHashMap as HashMap;
use rustls::crypto::CryptoProvider; use rustls::crypto::CryptoProvider;
use std::sync::Arc; use std::sync::Arc;

View file

@ -4,9 +4,9 @@ use crate::{
log::*, log::*,
server_crypto::{ServerCryptoBase, ServerNameBytes}, server_crypto::{ServerCryptoBase, ServerNameBytes},
}; };
use ahash::HashMap;
use async_trait::async_trait; use async_trait::async_trait;
use hot_reload::{Reload, ReloaderError}; use hot_reload::{Reload, ReloaderError};
use rustc_hash::FxHashMap as HashMap;
use std::sync::Arc; use std::sync::Arc;
/* ------------------------------------------------ */ /* ------------------------------------------------ */

View file

@ -1,5 +1,5 @@
use crate::{certs::SingleServerCertsKeys, error::*, log::*}; use crate::{certs::SingleServerCertsKeys, error::*, log::*};
use rustc_hash::FxHashMap as HashMap; use ahash::HashMap;
use rustls::{ use rustls::{
crypto::CryptoProvider, crypto::CryptoProvider,
server::{ResolvesServerCertUsingSni, WebPkiClientVerifier}, server::{ResolvesServerCertUsingSni, WebPkiClientVerifier},

View file

@ -37,7 +37,7 @@ post-quantum = [
[dependencies] [dependencies]
rand = "0.8.5" rand = "0.8.5"
rustc-hash = "2.1.0" ahash = "0.8.11"
bytes = "1.9.0" bytes = "1.9.0"
derive_builder = "0.20.2" derive_builder = "0.20.2"
futures = { version = "0.3.31", features = ["alloc", "async-await"] } futures = { version = "0.3.31", features = ["alloc", "async-await"] }
@ -51,16 +51,16 @@ tokio = { version = "1.42.0", default-features = false, features = [
] } ] }
tokio-util = { version = "0.7.13", default-features = false } tokio-util = { version = "0.7.13", default-features = false }
pin-project-lite = "0.2.15" pin-project-lite = "0.2.15"
async-trait = "0.1.83" async-trait = "0.1.84"
# Error handling # Error handling
anyhow = "1.0.94" anyhow = "1.0.95"
thiserror = "2.0.6" thiserror = "2.0.9"
# http for both server and client # http for both server and client
http = "1.2.0" http = "1.2.0"
http-body-util = "0.1.2" http-body-util = "0.1.2"
hyper = { version = "1.5.1", default-features = false } hyper = { version = "1.5.2", default-features = false }
hyper-util = { version = "0.1.10", features = ["full"] } hyper-util = { version = "0.1.10", features = ["full"] }
futures-util = { version = "0.3.31", default-features = false } futures-util = { version = "0.3.31", default-features = false }
futures-channel = { version = "0.3.31", default-features = false } futures-channel = { version = "0.3.31", default-features = false }
@ -70,7 +70,7 @@ hyper-tls = { version = "0.6.0", features = [
"alpn", "alpn",
"vendored", "vendored",
], optional = true } ], optional = true }
hyper-rustls = { version = "0.27.3", default-features = false, features = [ hyper-rustls = { version = "0.27.5", default-features = false, features = [
"aws-lc-rs", "aws-lc-rs",
"http1", "http1",
"http2", "http2",

View file

@ -4,8 +4,8 @@ use crate::{
name_exp::{ByteName, ServerName}, name_exp::{ByteName, ServerName},
AppConfig, AppConfigList, AppConfig, AppConfigList,
}; };
use ahash::HashMap;
use derive_builder::Builder; use derive_builder::Builder;
use rustc_hash::FxHashMap as HashMap;
use std::borrow::Cow; use std::borrow::Cow;
use super::upstream::PathManager; use super::upstream::PathManager;

View file

@ -4,8 +4,8 @@ use super::{
Upstream, Upstream,
}; };
use crate::{constants::STICKY_COOKIE_NAME, log::*}; use crate::{constants::STICKY_COOKIE_NAME, log::*};
use ahash::HashMap;
use derive_builder::Builder; use derive_builder::Builder;
use rustc_hash::FxHashMap as HashMap;
use std::{ use std::{
borrow::Cow, borrow::Cow,
sync::{ sync::{

View file

@ -11,10 +11,10 @@ use crate::{
log::*, log::*,
name_exp::{ByteName, PathName}, name_exp::{ByteName, PathName},
}; };
use ahash::{HashMap, HashSet};
#[cfg(feature = "sticky-cookie")] #[cfg(feature = "sticky-cookie")]
use base64::{engine::general_purpose, Engine as _}; use base64::{engine::general_purpose, Engine as _};
use derive_builder::Builder; use derive_builder::Builder;
use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet};
#[cfg(feature = "sticky-cookie")] #[cfg(feature = "sticky-cookie")]
use sha2::{Digest, Sha256}; use sha2::{Digest, Sha256};
use std::borrow::Cow; use std::borrow::Cow;

View file

@ -20,7 +20,7 @@ pub struct Globals {
#[cfg(feature = "acme")] #[cfg(feature = "acme")]
/// ServerConfig used for only ACME challenge for ACME domains /// ServerConfig used for only ACME challenge for ACME domains
pub server_configs_acme_challenge: std::sync::Arc<rustc_hash::FxHashMap<String, std::sync::Arc<rustls::ServerConfig>>>, pub server_configs_acme_challenge: std::sync::Arc<ahash::HashMap<String, std::sync::Arc<rustls::ServerConfig>>>,
} }
/// Configuration parameters for proxy transport and request handlers /// Configuration parameters for proxy transport and request handlers

View file

@ -48,7 +48,7 @@ pub struct RpxyOptions {
#[cfg(feature = "acme")] #[cfg(feature = "acme")]
/// ServerConfig used for only ACME challenge for ACME domains /// ServerConfig used for only ACME challenge for ACME domains
pub server_configs_acme_challenge: Arc<rustc_hash::FxHashMap<String, Arc<rustls::ServerConfig>>>, pub server_configs_acme_challenge: Arc<ahash::HashMap<String, Arc<rustls::ServerConfig>>>,
} }
/// Entrypoint that creates and spawns tasks of reverse proxy services /// Entrypoint that creates and spawns tasks of reverse proxy services

View file

@ -14,12 +14,11 @@ use crate::{
name_exp::ServerName, name_exp::ServerName,
}; };
use hyper_util::server::{self, conn::auto::Builder as ConnectionBuilder}; use hyper_util::server::{self, conn::auto::Builder as ConnectionBuilder};
use rustc_hash::FxHashMap as HashMap;
use rustls::ServerConfig; use rustls::ServerConfig;
use std::sync::Arc; use std::sync::Arc;
/// SNI to ServerConfig map type /// SNI to ServerConfig map type
pub type SniServerCryptoMap = HashMap<ServerName, Arc<ServerConfig>>; pub type SniServerCryptoMap = std::collections::HashMap<ServerName, Arc<ServerConfig>, ahash::RandomState>;
pub(crate) use proxy_main::Proxy; pub(crate) use proxy_main::Proxy;

View file

@ -294,7 +294,7 @@ where
let map = server_config.individual_config_map.clone().iter().map(|(k,v)| { let map = server_config.individual_config_map.clone().iter().map(|(k,v)| {
let server_name = ServerName::from(k.as_slice()); let server_name = ServerName::from(k.as_slice());
(server_name, v.clone()) (server_name, v.clone())
}).collect::<rustc_hash::FxHashMap<_,_>>(); }).collect::<std::collections::HashMap<_,_,ahash::RandomState>>();
server_crypto_map = Some(Arc::new(map)); server_crypto_map = Some(Arc::new(map));
} }
} }