@@ -5,8 +5,8 @@ use crate::{
5
5
impl_webpage,
6
6
utils:: get_correct_docsrs_style_file,
7
7
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 ,
10
10
} ,
11
11
Storage ,
12
12
} ;
@@ -190,9 +190,9 @@ pub fn source_browser_handler(req: &mut Request) -> IronResult<Response> {
190
190
// use that instead
191
191
crate_name = new_name;
192
192
}
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 ) ,
196
196
MatchSemver :: Semver ( ( version, _) ) => {
197
197
let url = ctry ! (
198
198
req,
@@ -205,7 +205,7 @@ pub fn source_browser_handler(req: &mut Request) -> IronResult<Response> {
205
205
) ) ,
206
206
) ;
207
207
208
- return Ok ( super :: redirect ( url) ) ;
208
+ return Ok ( super :: cached_redirect ( url, CachePolicy :: ForeverInCdn ) ) ;
209
209
}
210
210
} ;
211
211
@@ -303,19 +303,26 @@ pub fn source_browser_handler(req: &mut Request) -> IronResult<Response> {
303
303
)
304
304
. ok_or ( Nope :: ResourceNotFound ) ?;
305
305
306
- SourcePage {
306
+ let mut response = SourcePage {
307
307
file_list,
308
308
show_parent_link : !req_path. is_empty ( ) ,
309
309
file,
310
310
file_content,
311
311
canonical_url,
312
312
}
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)
314
320
}
315
321
316
322
#[ cfg( test) ]
317
323
mod tests {
318
324
use crate :: test:: * ;
325
+ use crate :: web:: cache:: CachePolicy ;
319
326
use test_case:: test_case;
320
327
321
328
#[ test_case( true ) ]
@@ -329,11 +336,21 @@ mod tests {
329
336
. source_file ( "some_filename.rs" , b"some_random_content" )
330
337
. create ( ) ?;
331
338
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
+ ) ?;
333
345
let response = web
334
346
. get ( "/crate/fake/0.1.0/source/some_filename.rs" )
335
347
. send ( ) ?;
336
348
assert ! ( response. status( ) . is_success( ) ) ;
349
+ assert_cache_control (
350
+ & response,
351
+ CachePolicy :: ForeverInCdnAndStaleInBrowser ,
352
+ & env. config ( ) ,
353
+ ) ;
337
354
assert ! ( response. text( ) ?. contains( "some_random_content" ) ) ;
338
355
Ok ( ( ) )
339
356
} ) ;
@@ -367,6 +384,7 @@ mod tests {
367
384
. source_file ( "README.md" , b"hello" )
368
385
. create ( ) ?;
369
386
let resp = env. frontend ( ) . get ( "/crate/fake/latest/source/" ) . send ( ) ?;
387
+ assert_cache_control ( & resp, CachePolicy :: ForeverInCdn , & env. config ( ) ) ;
370
388
assert ! ( resp. url( ) . as_str( ) . ends_with( "/crate/fake/latest/source/" ) ) ;
371
389
let body = String :: from_utf8 ( resp. bytes ( ) . unwrap ( ) . to_vec ( ) ) . unwrap ( ) ;
372
390
assert ! ( body. contains( "<a href=\" /crate/fake/latest/builds\" " ) ) ;
@@ -405,10 +423,12 @@ mod tests {
405
423
. create ( ) ?;
406
424
let web = env. frontend ( ) ;
407
425
assert_success ( "/crate/mbedtls/0.2.0/source/" , web) ?;
408
- assert_redirect (
426
+ assert_redirect_cached (
409
427
"/crate/mbedtls/*/source/" ,
410
428
"/crate/mbedtls/0.2.0/source/" ,
429
+ CachePolicy :: ForeverInCdn ,
411
430
web,
431
+ & env. config ( ) ,
412
432
) ?;
413
433
Ok ( ( ) )
414
434
} )
@@ -426,7 +446,12 @@ mod tests {
426
446
. source_file ( "fold.rs" , b"fn foo() {}" )
427
447
. create ( ) ?;
428
448
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
+ ) ?;
430
455
Ok ( ( ) )
431
456
} )
432
457
}
0 commit comments