upgrade hickory and hyper-util dependencies

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2025-04-03 04:05:42 +00:00
parent 5d1404e9df
commit 58adb6fead
4 changed files with 229 additions and 39 deletions

195
Cargo.lock generated
View file

@ -142,6 +142,17 @@ dependencies = [
"zstd-safe", "zstd-safe",
] ]
[[package]]
name = "async-recursion"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "async-stream" name = "async-stream"
version = "0.3.6" version = "0.3.6"
@ -927,7 +938,7 @@ dependencies = [
"const-str", "const-str",
"either", "either",
"futures", "futures",
"hickory-resolver", "hickory-resolver 0.25.1",
"http", "http",
"image", "image",
"ipaddress", "ipaddress",
@ -1061,6 +1072,12 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "critical-section"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
[[package]] [[package]]
name = "crokey" name = "crokey"
version = "1.1.1" version = "1.1.1"
@ -1584,6 +1601,19 @@ dependencies = [
"slab", "slab",
] ]
[[package]]
name = "generator"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd"
dependencies = [
"cfg-if",
"libc",
"log",
"rustversion",
"windows 0.58.0",
]
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.7"
@ -1769,6 +1799,34 @@ dependencies = [
"url", "url",
] ]
[[package]]
name = "hickory-proto"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d844af74f7b799e41c78221be863bade11c430d46042c3b49ca8ae0c6d27287"
dependencies = [
"async-recursion",
"async-trait",
"cfg-if",
"critical-section",
"data-encoding",
"enum-as-inner",
"futures-channel",
"futures-io",
"futures-util",
"idna",
"ipnet",
"once_cell",
"rand 0.9.0",
"ring",
"serde",
"thiserror 2.0.12",
"tinyvec",
"tokio",
"tracing",
"url",
]
[[package]] [[package]]
name = "hickory-resolver" name = "hickory-resolver"
version = "0.24.4" version = "0.24.4"
@ -1777,7 +1835,7 @@ checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"futures-util", "futures-util",
"hickory-proto", "hickory-proto 0.24.4",
"ipconfig", "ipconfig",
"lru-cache", "lru-cache",
"once_cell", "once_cell",
@ -1790,6 +1848,28 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "hickory-resolver"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a128410b38d6f931fcc6ca5c107a3b02cabd6c05967841269a4ad65d23c44331"
dependencies = [
"cfg-if",
"futures-util",
"hickory-proto 0.25.1",
"ipconfig",
"moka",
"once_cell",
"parking_lot",
"rand 0.9.0",
"resolv-conf",
"serde",
"smallvec",
"thiserror 2.0.12",
"tokio",
"tracing",
]
[[package]] [[package]]
name = "hmac" name = "hmac"
version = "0.12.1" version = "0.12.1"
@ -1816,7 +1896,7 @@ checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"windows", "windows 0.52.0",
] ]
[[package]] [[package]]
@ -1949,9 +2029,9 @@ dependencies = [
[[package]] [[package]]
name = "hyper-util" name = "hyper-util"
version = "0.1.8" version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
@ -1959,10 +2039,10 @@ dependencies = [
"http", "http",
"http-body", "http-body",
"hyper", "hyper",
"libc",
"pin-project-lite", "pin-project-lite",
"socket2", "socket2",
"tokio", "tokio",
"tower 0.4.13",
"tower-service", "tower-service",
"tracing", "tracing",
] ]
@ -2439,6 +2519,19 @@ dependencies = [
"futures-sink", "futures-sink",
] ]
[[package]]
name = "loom"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca"
dependencies = [
"cfg-if",
"generator",
"scoped-tls",
"tracing",
"tracing-subscriber",
]
[[package]] [[package]]
name = "loop9" name = "loop9"
version = "0.1.5" version = "0.1.5"
@ -2609,6 +2702,25 @@ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "moka"
version = "0.12.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926"
dependencies = [
"crossbeam-channel",
"crossbeam-epoch",
"crossbeam-utils",
"loom",
"parking_lot",
"portable-atomic",
"rustc_version",
"smallvec",
"tagptr",
"thiserror 1.0.69",
"uuid",
]
[[package]] [[package]]
name = "new_debug_unreachable" name = "new_debug_unreachable"
version = "1.0.6" version = "1.0.6"
@ -2773,6 +2885,10 @@ name = "once_cell"
version = "1.21.3" version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
dependencies = [
"critical-section",
"portable-atomic",
]
[[package]] [[package]]
name = "openssl-probe" name = "openssl-probe"
@ -3052,6 +3168,12 @@ dependencies = [
"miniz_oxide", "miniz_oxide",
] ]
[[package]]
name = "portable-atomic"
version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
[[package]] [[package]]
name = "powerfmt" name = "powerfmt"
version = "0.2.0" version = "0.2.0"
@ -3463,7 +3585,7 @@ dependencies = [
"futures-core", "futures-core",
"futures-util", "futures-util",
"h2", "h2",
"hickory-resolver", "hickory-resolver 0.24.4",
"http", "http",
"http-body", "http-body",
"http-body-util", "http-body-util",
@ -3893,6 +4015,12 @@ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
[[package]]
name = "scoped-tls"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
version = "1.2.0" version = "1.2.0"
@ -4464,6 +4592,12 @@ dependencies = [
"version-compare", "version-compare",
] ]
[[package]]
name = "tagptr"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
[[package]] [[package]]
name = "target-lexicon" name = "target-lexicon"
version = "0.12.16" version = "0.12.16"
@ -5367,7 +5501,17 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
dependencies = [ dependencies = [
"windows-core", "windows-core 0.52.0",
"windows-targets 0.52.6",
]
[[package]]
name = "windows"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
dependencies = [
"windows-core 0.58.0",
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
@ -5380,6 +5524,41 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "windows-core"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
dependencies = [
"windows-implement",
"windows-interface",
"windows-result",
"windows-strings",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-implement"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-interface"
version = "0.58.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "windows-registry" name = "windows-registry"
version = "0.2.0" version = "0.2.0"

View file

@ -284,8 +284,7 @@ features = [
] ]
[workspace.dependencies.hyper-util] [workspace.dependencies.hyper-util]
# hyper-util >=0.1.9 seems to have DNS issues version = "0.1.11"
version = "=0.1.8"
default-features = false default-features = false
features = [ features = [
"server-auto", "server-auto",
@ -306,8 +305,13 @@ default-features = false
features = ["env", "toml"] features = ["env", "toml"]
[workspace.dependencies.hickory-resolver] [workspace.dependencies.hickory-resolver]
version = "0.24.2" version = "0.25.1"
default-features = false default-features = false
features = [
"serde",
"system-config",
"tokio",
]
# Used for conduwuit::Error type # Used for conduwuit::Error type
[workspace.dependencies.thiserror] [workspace.dependencies.thiserror]

View file

@ -5,7 +5,7 @@ use std::{
use conduwuit::{Err, Result, debug, debug_info, err, error, trace}; use conduwuit::{Err, Result, debug, debug_info, err, error, trace};
use futures::{FutureExt, TryFutureExt}; use futures::{FutureExt, TryFutureExt};
use hickory_resolver::error::ResolveError; use hickory_resolver::ResolveError;
use ipaddress::IPAddress; use ipaddress::IPAddress;
use ruma::ServerName; use ruma::ServerName;
@ -334,27 +334,30 @@ impl super::Service {
} }
fn handle_resolve_error(e: &ResolveError, host: &'_ str) -> Result<()> { fn handle_resolve_error(e: &ResolveError, host: &'_ str) -> Result<()> {
use hickory_resolver::error::ResolveErrorKind; use hickory_resolver::{ResolveErrorKind::Proto, proto::ProtoErrorKind};
match *e.kind() { match e.kind() {
| ResolveErrorKind::NoRecordsFound { .. } => { | Proto(e) => match e.kind() {
| ProtoErrorKind::NoRecordsFound { .. } => {
// Raise to debug_warn if we can find out the result wasn't from cache // Raise to debug_warn if we can find out the result wasn't from cache
debug!(%host, "No DNS records found: {e}"); debug!(%host, "No DNS records found: {e}");
Ok(()) Ok(())
}, },
| ResolveErrorKind::Timeout => { | ProtoErrorKind::Timeout => {
Err!(warn!(%host, "DNS {e}")) Err!(warn!(%host, "DNS {e}"))
}, },
| ResolveErrorKind::NoConnections => { | ProtoErrorKind::NoConnections => {
error!( error!(
"Your DNS server is overloaded and has ran out of connections. It is \ "Your DNS server is overloaded and has ran out of connections. It is \
strongly recommended you remediate this issue to ensure proper federation \ strongly recommended you remediate this issue to ensure proper \
connectivity." federation connectivity."
); );
Err!(error!(%host, "DNS error: {e}")) Err!(error!(%host, "DNS error: {e}"))
}, },
| _ => Err!(error!(%host, "DNS error: {e}")), | _ => Err!(error!(%host, "DNS error: {e}")),
},
| _ => Err!(error!(%host, "DNS error: {e}")),
} }
} }

View file

@ -2,19 +2,19 @@ use std::{net::SocketAddr, sync::Arc, time::Duration};
use conduwuit::{Result, Server, err}; use conduwuit::{Result, Server, err};
use futures::FutureExt; use futures::FutureExt;
use hickory_resolver::{TokioAsyncResolver, lookup_ip::LookupIp}; use hickory_resolver::{TokioResolver, lookup_ip::LookupIp};
use reqwest::dns::{Addrs, Name, Resolve, Resolving}; use reqwest::dns::{Addrs, Name, Resolve, Resolving};
use super::cache::{Cache, CachedOverride}; use super::cache::{Cache, CachedOverride};
pub struct Resolver { pub struct Resolver {
pub(crate) resolver: Arc<TokioAsyncResolver>, pub(crate) resolver: Arc<TokioResolver>,
pub(crate) hooked: Arc<Hooked>, pub(crate) hooked: Arc<Hooked>,
server: Arc<Server>, server: Arc<Server>,
} }
pub(crate) struct Hooked { pub(crate) struct Hooked {
resolver: Arc<TokioAsyncResolver>, resolver: Arc<TokioResolver>,
cache: Arc<Cache>, cache: Arc<Cache>,
server: Arc<Server>, server: Arc<Server>,
} }
@ -42,7 +42,7 @@ impl Resolver {
let mut ns = sys_conf.clone(); let mut ns = sys_conf.clone();
if config.query_over_tcp_only { if config.query_over_tcp_only {
ns.protocol = hickory_resolver::config::Protocol::Tcp; ns.protocol = hickory_resolver::proto::xfer::Protocol::Tcp;
} }
ns.trust_negative_responses = !config.query_all_nameservers; ns.trust_negative_responses = !config.query_all_nameservers;
@ -51,6 +51,7 @@ impl Resolver {
} }
opts.cache_size = config.dns_cache_entries as usize; opts.cache_size = config.dns_cache_entries as usize;
opts.preserve_intermediates = true;
opts.negative_min_ttl = Some(Duration::from_secs(config.dns_min_ttl_nxdomain)); opts.negative_min_ttl = Some(Duration::from_secs(config.dns_min_ttl_nxdomain));
opts.negative_max_ttl = Some(Duration::from_secs(60 * 60 * 24 * 30)); opts.negative_max_ttl = Some(Duration::from_secs(60 * 60 * 24 * 30));
opts.positive_min_ttl = Some(Duration::from_secs(config.dns_min_ttl)); opts.positive_min_ttl = Some(Duration::from_secs(config.dns_min_ttl));
@ -60,8 +61,7 @@ impl Resolver {
opts.try_tcp_on_error = config.dns_tcp_fallback; opts.try_tcp_on_error = config.dns_tcp_fallback;
opts.num_concurrent_reqs = 1; opts.num_concurrent_reqs = 1;
opts.edns0 = true; opts.edns0 = true;
opts.shuffle_dns_servers = true; opts.case_randomization = true;
opts.rotate = true;
opts.ip_strategy = match config.ip_lookup_strategy { opts.ip_strategy = match config.ip_lookup_strategy {
| 1 => hickory_resolver::config::LookupIpStrategy::Ipv4Only, | 1 => hickory_resolver::config::LookupIpStrategy::Ipv4Only,
| 2 => hickory_resolver::config::LookupIpStrategy::Ipv6Only, | 2 => hickory_resolver::config::LookupIpStrategy::Ipv6Only,
@ -69,9 +69,13 @@ impl Resolver {
| 4 => hickory_resolver::config::LookupIpStrategy::Ipv6thenIpv4, | 4 => hickory_resolver::config::LookupIpStrategy::Ipv6thenIpv4,
| _ => hickory_resolver::config::LookupIpStrategy::Ipv4thenIpv6, | _ => hickory_resolver::config::LookupIpStrategy::Ipv4thenIpv6,
}; };
opts.authentic_data = false;
let resolver = Arc::new(TokioAsyncResolver::tokio(conf, opts)); let rt_prov = hickory_resolver::proto::runtime::TokioRuntimeProvider::new();
let conn_prov = hickory_resolver::name_server::TokioConnectionProvider::new(rt_prov);
let mut builder = TokioResolver::builder_with_config(conf, conn_prov);
*builder.options_mut() = opts;
let resolver = Arc::new(builder.build());
Ok(Arc::new(Self { Ok(Arc::new(Self {
resolver: resolver.clone(), resolver: resolver.clone(),
hooked: Arc::new(Hooked { resolver, cache, server: server.clone() }), hooked: Arc::new(Hooked { resolver, cache, server: server.clone() }),
@ -105,7 +109,7 @@ impl Resolve for Hooked {
async fn hooked_resolve( async fn hooked_resolve(
cache: Arc<Cache>, cache: Arc<Cache>,
server: Arc<Server>, server: Arc<Server>,
resolver: Arc<TokioAsyncResolver>, resolver: Arc<TokioResolver>,
name: Name, name: Name,
) -> Result<Addrs, Box<dyn std::error::Error + Send + Sync>> { ) -> Result<Addrs, Box<dyn std::error::Error + Send + Sync>> {
match cache.get_override(name.as_str()).await { match cache.get_override(name.as_str()).await {
@ -129,7 +133,7 @@ async fn hooked_resolve(
async fn resolve_to_reqwest( async fn resolve_to_reqwest(
server: Arc<Server>, server: Arc<Server>,
resolver: Arc<TokioAsyncResolver>, resolver: Arc<TokioResolver>,
name: Name, name: Name,
) -> ResolvingResult { ) -> ResolvingResult {
use std::{io, io::ErrorKind::Interrupted}; use std::{io, io::ErrorKind::Interrupted};