Skip to content

Commit 773de6f

Browse files
committed
add caching to source-handlers
1 parent 0e5bda9 commit 773de6f

File tree

1 file changed

+36
-11
lines changed

1 file changed

+36
-11
lines changed

src/web/source.rs

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use crate::{
55
impl_webpage,
66
utils::get_correct_docsrs_style_file,
77
web::{
8-
error::Nope, file::File as DbFile, match_version, page::WebPage, redirect_base,
9-
MatchSemver, MetaData, Url,
8+
cache::CachePolicy, error::Nope, file::File as DbFile, match_version, page::WebPage,
9+
redirect_base, MatchSemver, MetaData, Url,
1010
},
1111
Storage,
1212
};
@@ -190,9 +190,9 @@ pub fn source_browser_handler(req: &mut Request) -> IronResult<Response> {
190190
// use that instead
191191
crate_name = new_name;
192192
}
193-
let (version, version_or_latest) = match v.version {
194-
MatchSemver::Latest((version, _)) => (version, "latest".to_string()),
195-
MatchSemver::Exact((version, _)) => (version.clone(), version),
193+
let (version, version_or_latest, is_latest_url) = match v.version {
194+
MatchSemver::Latest((version, _)) => (version, "latest".to_string(), true),
195+
MatchSemver::Exact((version, _)) => (version.clone(), version, false),
196196
MatchSemver::Semver((version, _)) => {
197197
let url = ctry!(
198198
req,
@@ -205,7 +205,7 @@ pub fn source_browser_handler(req: &mut Request) -> IronResult<Response> {
205205
)),
206206
);
207207

208-
return Ok(super::redirect(url));
208+
return Ok(super::cached_redirect(url, CachePolicy::ForeverInCdn));
209209
}
210210
};
211211

@@ -303,19 +303,26 @@ pub fn source_browser_handler(req: &mut Request) -> IronResult<Response> {
303303
)
304304
.ok_or(Nope::ResourceNotFound)?;
305305

306-
SourcePage {
306+
let mut response = SourcePage {
307307
file_list,
308308
show_parent_link: !req_path.is_empty(),
309309
file,
310310
file_content,
311311
canonical_url,
312312
}
313-
.into_response(req)
313+
.into_response(req)?;
314+
response.extensions.insert::<CachePolicy>(if is_latest_url {
315+
CachePolicy::ForeverInCdn
316+
} else {
317+
CachePolicy::ForeverInCdnAndStaleInBrowser
318+
});
319+
Ok(response)
314320
}
315321

316322
#[cfg(test)]
317323
mod tests {
318324
use crate::test::*;
325+
use crate::web::cache::CachePolicy;
319326
use test_case::test_case;
320327

321328
#[test_case(true)]
@@ -329,11 +336,21 @@ mod tests {
329336
.source_file("some_filename.rs", b"some_random_content")
330337
.create()?;
331338
let web = env.frontend();
332-
assert_success("/crate/fake/0.1.0/source/", web)?;
339+
assert_success_cached(
340+
"/crate/fake/0.1.0/source/",
341+
web,
342+
CachePolicy::ForeverInCdnAndStaleInBrowser,
343+
&env.config(),
344+
)?;
333345
let response = web
334346
.get("/crate/fake/0.1.0/source/some_filename.rs")
335347
.send()?;
336348
assert!(response.status().is_success());
349+
assert_cache_control(
350+
&response,
351+
CachePolicy::ForeverInCdnAndStaleInBrowser,
352+
&env.config(),
353+
);
337354
assert!(response.text()?.contains("some_random_content"));
338355
Ok(())
339356
});
@@ -367,6 +384,7 @@ mod tests {
367384
.source_file("README.md", b"hello")
368385
.create()?;
369386
let resp = env.frontend().get("/crate/fake/latest/source/").send()?;
387+
assert_cache_control(&resp, CachePolicy::ForeverInCdn, &env.config());
370388
assert!(resp.url().as_str().ends_with("/crate/fake/latest/source/"));
371389
let body = String::from_utf8(resp.bytes().unwrap().to_vec()).unwrap();
372390
assert!(body.contains("<a href=\"/crate/fake/latest/builds\""));
@@ -405,10 +423,12 @@ mod tests {
405423
.create()?;
406424
let web = env.frontend();
407425
assert_success("/crate/mbedtls/0.2.0/source/", web)?;
408-
assert_redirect(
426+
assert_redirect_cached(
409427
"/crate/mbedtls/*/source/",
410428
"/crate/mbedtls/0.2.0/source/",
429+
CachePolicy::ForeverInCdn,
411430
web,
431+
&env.config(),
412432
)?;
413433
Ok(())
414434
})
@@ -426,7 +446,12 @@ mod tests {
426446
.source_file("fold.rs", b"fn foo() {}")
427447
.create()?;
428448
let web = env.frontend();
429-
assert_success("/crate/rustc-ap-syntax/178.0.0/source/fold.rs", web)?;
449+
assert_success_cached(
450+
"/crate/rustc-ap-syntax/178.0.0/source/fold.rs",
451+
web,
452+
CachePolicy::ForeverInCdnAndStaleInBrowser,
453+
&env.config(),
454+
)?;
430455
Ok(())
431456
})
432457
}

0 commit comments

Comments
 (0)