A little app to serve my photography from my personal website

cache middleware, caching for all routes

ericwood.org 83bf8578 f496dacb

Waiting for spindle ...
+33 -19
+33 -19
src/main.rs
··· 46 46 Ok(()) 47 47 } 48 48 49 + static ONE_YEAR: usize = 525600; 50 + 49 51 #[tokio::main] 50 52 async fn main() -> anyhow::Result<()> { 51 53 let _ = dotenv(); ··· 81 83 .nest_service( 82 84 "/photos/assets", 83 85 ServiceBuilder::new() 84 - .layer(SetResponseHeaderLayer::overriding( 85 - header::CACHE_CONTROL, 86 - HeaderValue::from_static("public, max-age=31536000, immutible"), 87 - )) 86 + .layer(cache(ONE_YEAR)) 88 87 .service(ServeDir::new(&config.assets_path)), 89 88 ) 90 89 .nest_service( 91 90 "/photos/thumbnails", 92 91 ServiceBuilder::new() 93 - .layer(SetResponseHeaderLayer::overriding( 94 - header::CACHE_CONTROL, 95 - HeaderValue::from_static("public, max-age=31536000, immutible"), 96 - )) 92 + .layer(cache(ONE_YEAR)) 97 93 .service(ServeDir::new(&config.photos_thumbnail_path)), 98 94 ) 99 95 .nest_service( 100 96 "/photos/images", 101 97 ServiceBuilder::new() 102 - .layer(SetResponseHeaderLayer::overriding( 103 - header::CACHE_CONTROL, 104 - HeaderValue::from_static("public, max-age=31536000, immutible"), 105 - )) 98 + .layer(cache(ONE_YEAR)) 106 99 .service(ServeDir::new(&config.photos_image_path)), 107 100 ) 108 - .route("/photos", get(routes::photos::index)) 109 - .route("/photos/{id}", get(routes::photos::show)) 110 - .route("/blog", get(routes::blog::index)) 111 - .route("/blog/{slug}", get(routes::blog::show)) 112 - .route("/projects", get(routes::projects::index)) 113 - .route("/projects/{slug}", get(routes::projects::show)) 114 - .route("/", get(routes::home::index)); 101 + .route("/photos", get(routes::photos::index).route_layer(cache(10))) 102 + .route( 103 + "/photos/{id}", 104 + get(routes::photos::show).route_layer(cache(10)), 105 + ) 106 + .route("/blog", get(routes::blog::index).route_layer(cache(10))) 107 + .route( 108 + "/blog/{slug}", 109 + get(routes::blog::show).route_layer(cache(10)), 110 + ) 111 + .route( 112 + "/projects", 113 + get(routes::projects::index).route_layer(cache(10)), 114 + ) 115 + .route( 116 + "/projects/{slug}", 117 + get(routes::projects::show).route_layer(cache(10)), 118 + ) 119 + .route("/", get(routes::home::index).route_layer(cache(10))); 115 120 116 121 let app_state = Arc::new(AppState { 117 122 config, ··· 133 138 axum::serve(listener, app).await?; 134 139 135 140 Ok(()) 141 + } 142 + 143 + fn cache(minutes: usize) -> SetResponseHeaderLayer<HeaderValue> { 144 + let age = minutes * 60; 145 + let header = format!("public, max-age={age}, immutible"); 146 + SetResponseHeaderLayer::overriding( 147 + header::CACHE_CONTROL, 148 + HeaderValue::from_str(&header).unwrap_or_else(|_| panic!("invalid header: {header}")), 149 + ) 136 150 } 137 151 138 152 async fn handler_404() -> anyhow::Result<Html<String>, app_error::AppError> {