use atomic_http::{ConnectionPoolConfig, Options, SendableError, Server};
#[tokio::main]
async fn main() -> Result<(), SendableError> {
println!("๐ญ Production Server Setup Example");
println!("==================================\n");
println!("1. Setting up production options...");
let options = setup_production_options();
println!("2. Creating server with production configuration...");
let mut server = Server::with_options("127.0.0.1:8080", options).await?;
println!(" Server listening on http://127.0.0.1:8080");
#[cfg(feature = "connection_pool")]
{
server.print_connection_pool_stats().await;
}
println!("\n3. Starting request handling simulation...");
demonstrate_configuration_scenarios().await?;
println!("\nโ
Production server setup completed!");
#[cfg(feature = "connection_pool")]
{
println!("\n๐งน Shutting down connection pool...");
server.disable_connection_pool().await;
}
Ok(())
}
fn setup_production_options() -> Options {
let mut options = Options::new();
options.no_delay = true;
options.read_timeout_miliseconds = 5000; options.read_buffer_size = 8192; options.zero_copy_threshold = 512 * 1024; options.enable_file_cache = true;
if let Ok(current_dir) = std::env::current_dir() {
options.root_path = current_dir.join("static");
}
#[cfg(feature = "connection_pool")]
{
let pool_config = ConnectionPoolConfig::new()
.max_connections_per_host(100) .idle_timeout(75) .max_lifetime(600) .cleanup_interval(30) .keep_alive(true);
options.set_connection_option(pool_config);
println!(" โ Connection pooling enabled");
}
println!(" โ Production options configured");
options
}
async fn demonstrate_configuration_scenarios() -> Result<(), SendableError> {
println!("\n๐ Configuration Scenarios:");
println!("\n Scenario 1: High-traffic server setup");
let mut high_traffic_options = Options::new();
#[cfg(feature = "connection_pool")]
{
high_traffic_options.set_connection_option(ConnectionPoolConfig::high_performance());
let _server = Server::with_options("127.0.0.1:8090", high_traffic_options).await?;
println!(" โ High-performance server created");
}
println!("\n Scenario 2: Resource-constrained server setup");
let mut conservative_options = Options::new();
#[cfg(feature = "connection_pool")]
{
conservative_options.set_connection_option(ConnectionPoolConfig::conservative());
let _server = Server::with_options("127.0.0.1:8091", conservative_options).await?;
println!(" โ Conservative server created");
}
println!("\n Scenario 3: Development server setup");
let dev_options = Options::new();
let _server = Server::with_options("127.0.0.1:8092", dev_options).await?;
println!(" โ Development server created (no connection pooling)");
println!("\n Scenario 4: Custom business logic server");
let mut custom_options = Options::new();
#[cfg(feature = "connection_pool")]
{
let custom_config = ConnectionPoolConfig::new()
.max_connections_per_host(50) .idle_timeout(120) .max_lifetime(1800) .cleanup_interval(60) .keep_alive(true);
custom_options.set_connection_option(custom_config);
let _server = Server::with_options("127.0.0.1:8093", custom_options).await?;
println!(" โ Custom configuration server created");
}
println!("\n All scenarios demonstrated successfully!");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_production_options() {
let options = setup_production_options();
assert_eq!(options.no_delay, true);
assert_eq!(options.read_timeout_miliseconds, 5000);
assert_eq!(options.read_buffer_size, 8192);
assert_eq!(options.zero_copy_threshold, 512 * 1024);
#[cfg(feature = "connection_pool")]
{
assert!(options.is_connection_pool_enabled());
let config = options.get_connection_option();
assert_eq!(config.max_connections_per_host, 100);
assert_eq!(config.max_idle_time.as_secs(), 75);
assert_eq!(config.enable_keep_alive, true);
}
}
#[tokio::test]
async fn test_server_creation_with_options() -> Result<(), SendableError> {
let options = setup_production_options();
let server = Server::with_options("127.0.0.1:0", options).await?;
#[cfg(feature = "connection_pool")]
{
assert!(server.connection_pool.is_some());
}
Ok(())
}
}