Use a fallback for when the requested dns resolver isn't available

This commit is contained in:
Slatian
2025-02-09 16:10:35 +01:00
parent b98bb67b4c
commit caf47522e4

View File

@ -310,7 +310,7 @@ async fn main() {
ServeDir::new(static_file_directory)
.fallback(not_found_handler.with_state(shared_state.clone()))
)
.with_state(shared_state)
.with_state(shared_state.clone())
.layer(
ServiceBuilder::new()
.layer(ip_header.into_extension())
@ -319,7 +319,7 @@ async fn main() {
.layer(middleware::from_fn(ratelimit::rate_limit_middleware))
.layer(Extension(config))
.layer(Extension(derived_config))
.layer(middleware::from_fn(settings_query_middleware))
.layer(middleware::from_fn_with_state(shared_state, settings_query_middleware))
)
;
@ -331,26 +331,38 @@ async fn main() {
.unwrap();
}
#[allow(clippy::too_many_arguments)]
async fn settings_query_middleware(
Query(query): Query<SettingsQuery>,
State(arc_state): State<Arc<ServiceSharedState>>,
Extension(config): Extension<config::EchoIpServiceConfig>,
Extension(derived_config): Extension<DerivedConfiguration>,
cookie_header: Option<TypedHeader<headers::Cookie>>,
user_agent_header: Option<TypedHeader<headers::UserAgent>>,
mut req: Request<Body>,
next: Next
next: Next,
) -> Response {
let state = Arc::clone(&arc_state);
let mut format = query.format;
let mut dns_resolver_id = derived_config.default_resolver;
let mut dns_resolver_id = derived_config.default_resolver.clone();
let mut test_for_resolver = false;
if let Some(resolver_id) = query.dns {
dns_resolver_id = resolver_id.into();
test_for_resolver = true;
} else if let Some(cookie_header) = cookie_header {
if let Some(resolver_id) = cookie_header.0.get("dns_resolver") {
dns_resolver_id = resolver_id.into();
test_for_resolver = true;
}
}
// Falls back to the default resolver if an invalid resolver id ws requested.
// This may be the case for bookmarked links or old cookies of a resolver was removed.
if test_for_resolver && !state.dns_resolvers.contains_key(&dns_resolver_id) {
dns_resolver_id = derived_config.default_resolver;
}
// Try to guess type from user agent
if format.is_none() {