commit
5fdbc2186e
20 changed files with 42 additions and 36 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
] }
|
] }
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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::*;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
/* ------------------------------------------------ */
|
/* ------------------------------------------------ */
|
||||||
|
|
|
||||||
|
|
@ -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},
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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::{
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue