@@ -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) ]
317323mod 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