tangled
alpha
login
or
join now
ericwood.org
/
photos-site
1
fork
atom
A little app to serve my photography from my personal website
1
fork
atom
overview
issues
pulls
pipelines
cache middleware, caching for all routes
ericwood.org
1 month ago
83bf8578
f496dacb
0/0
Waiting for spindle ...
+33
-19
1 changed file
expand all
collapse all
unified
split
src
main.rs
+33
-19
src/main.rs
···
46
46
Ok(())
47
47
}
48
48
49
49
+
static ONE_YEAR: usize = 525600;
50
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
84
-
.layer(SetResponseHeaderLayer::overriding(
85
85
-
header::CACHE_CONTROL,
86
86
-
HeaderValue::from_static("public, max-age=31536000, immutible"),
87
87
-
))
86
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
93
-
.layer(SetResponseHeaderLayer::overriding(
94
94
-
header::CACHE_CONTROL,
95
95
-
HeaderValue::from_static("public, max-age=31536000, immutible"),
96
96
-
))
92
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
102
-
.layer(SetResponseHeaderLayer::overriding(
103
103
-
header::CACHE_CONTROL,
104
104
-
HeaderValue::from_static("public, max-age=31536000, immutible"),
105
105
-
))
98
98
+
.layer(cache(ONE_YEAR))
106
99
.service(ServeDir::new(&config.photos_image_path)),
107
100
)
108
108
-
.route("/photos", get(routes::photos::index))
109
109
-
.route("/photos/{id}", get(routes::photos::show))
110
110
-
.route("/blog", get(routes::blog::index))
111
111
-
.route("/blog/{slug}", get(routes::blog::show))
112
112
-
.route("/projects", get(routes::projects::index))
113
113
-
.route("/projects/{slug}", get(routes::projects::show))
114
114
-
.route("/", get(routes::home::index));
101
101
+
.route("/photos", get(routes::photos::index).route_layer(cache(10)))
102
102
+
.route(
103
103
+
"/photos/{id}",
104
104
+
get(routes::photos::show).route_layer(cache(10)),
105
105
+
)
106
106
+
.route("/blog", get(routes::blog::index).route_layer(cache(10)))
107
107
+
.route(
108
108
+
"/blog/{slug}",
109
109
+
get(routes::blog::show).route_layer(cache(10)),
110
110
+
)
111
111
+
.route(
112
112
+
"/projects",
113
113
+
get(routes::projects::index).route_layer(cache(10)),
114
114
+
)
115
115
+
.route(
116
116
+
"/projects/{slug}",
117
117
+
get(routes::projects::show).route_layer(cache(10)),
118
118
+
)
119
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
141
+
}
142
142
+
143
143
+
fn cache(minutes: usize) -> SetResponseHeaderLayer<HeaderValue> {
144
144
+
let age = minutes * 60;
145
145
+
let header = format!("public, max-age={age}, immutible");
146
146
+
SetResponseHeaderLayer::overriding(
147
147
+
header::CACHE_CONTROL,
148
148
+
HeaderValue::from_str(&header).unwrap_or_else(|_| panic!("invalid header: {header}")),
149
149
+
)
136
150
}
137
151
138
152
async fn handler_404() -> anyhow::Result<Html<String>, app_error::AppError> {