fix(server,core): use SmartIpKeyExtractor for rate limiter, collapse nested if

- tower_governor: switch from PeerIpKeyExtractor (socket address) to
  SmartIpKeyExtractor so x-forwarded-for headers are honoured in tests
  and behind reverse proxies. Fixes auth_rate_limit_returns_429 test
  returning 500 instead of 429.
- solitaire_core: collapse nested if/if-let per clippy::collapsible_if.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-04-29 00:54:53 +00:00
parent ce8ba6a8c4
commit f27a002c91
2 changed files with 8 additions and 4 deletions
+2 -3
View File
@@ -289,10 +289,9 @@ impl GameState {
.ok_or(MoveError::InvalidSource)? .ok_or(MoveError::InvalidSource)?
.cards .cards
.last_mut() .last_mut()
&& !top.face_up
{ {
if !top.face_up { top.face_up = true;
top.face_up = true;
}
} }
self.piles.get_mut(&to).ok_or(MoveError::InvalidDestination)?.cards.append(&mut moved); self.piles.get_mut(&to).ok_or(MoveError::InvalidDestination)?.cards.append(&mut moved);
+6 -1
View File
@@ -19,7 +19,11 @@ use axum::{
}; };
use sqlx::SqlitePool; use sqlx::SqlitePool;
use std::sync::Arc; use std::sync::Arc;
use tower_governor::{governor::GovernorConfigBuilder, GovernorLayer}; use tower_governor::{
governor::GovernorConfigBuilder,
key_extractor::SmartIpKeyExtractor,
GovernorLayer,
};
/// Shared application state injected into every Axum handler via [`axum::extract::State`]. /// Shared application state injected into every Axum handler via [`axum::extract::State`].
/// ///
@@ -80,6 +84,7 @@ fn build_router_inner(state: AppState, rate_limit: bool) -> Router {
// burst_size = 10, replenish every 6 seconds = 10/min steady-state. // burst_size = 10, replenish every 6 seconds = 10/min steady-state.
let governor_conf = Arc::new( let governor_conf = Arc::new(
GovernorConfigBuilder::default() GovernorConfigBuilder::default()
.key_extractor(SmartIpKeyExtractor)
.per_second(6) .per_second(6)
.burst_size(10) .burst_size(10)
.finish() .finish()