Add configurable global concurrent request limiting
- Add max_concurrent_requests config option (default: 1000) - Implement global AtomicUsize counter for concurrent request tracking - Return status 41 'Server unavailable' when limit exceeded - Proper counter management with decrements on all exit paths - Add comprehensive config validation (1-1,000,000 range) - Update documentation with rate limiting details - Add unit tests for config parsing - Thread-safe implementation using Ordering::Relaxed This provides effective DDoS protection by limiting concurrent connections to prevent server overload while maintaining configurability for different deployment scenarios.
This commit is contained in:
parent
9d29321806
commit
0468781a69
5 changed files with 54 additions and 6 deletions
11
src/main.rs
11
src/main.rs
|
|
@ -69,6 +69,7 @@ async fn main() {
|
|||
host: None,
|
||||
port: None,
|
||||
log_level: None,
|
||||
max_concurrent_requests: None,
|
||||
});
|
||||
|
||||
// Initialize logging
|
||||
|
|
@ -82,6 +83,13 @@ async fn main() {
|
|||
let host = args.host.or(config.host).unwrap_or_else(|| "0.0.0.0".to_string());
|
||||
let port = args.port.or(config.port).unwrap_or(1965);
|
||||
|
||||
// Validate max concurrent requests
|
||||
let max_concurrent_requests = config.max_concurrent_requests.unwrap_or(1000);
|
||||
if max_concurrent_requests == 0 || max_concurrent_requests > 1_000_000 {
|
||||
eprintln!("Error: max_concurrent_requests must be between 1 and 1,000,000");
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
// Validate directory
|
||||
let dir_path = Path::new(&root);
|
||||
if !dir_path.exists() || !dir_path.is_dir() {
|
||||
|
|
@ -110,8 +118,9 @@ async fn main() {
|
|||
let acceptor = acceptor.clone();
|
||||
let dir = root.clone();
|
||||
let expected_host = "localhost".to_string(); // Override for testing
|
||||
let max_concurrent = max_concurrent_requests;
|
||||
if let Ok(stream) = acceptor.accept(stream).await {
|
||||
if let Err(e) = server::handle_connection(stream, &dir, &expected_host).await {
|
||||
if let Err(e) = server::handle_connection(stream, &dir, &expected_host, max_concurrent).await {
|
||||
tracing::error!("Error handling connection: {}", e);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue