@@ -472,30 +472,38 @@ pub(crate) async fn rustdoc_html_server_handler(
472472 {
473473 debug ! ( "got error serving {}: {}" , storage_path, err) ;
474474 }
475- // If it fails, we try again with /index.html at the end
476- storage_path. push_str ( "/index.html" ) ;
477- req_path. push ( "index.html" ) ;
478475
479- return if storage
480- . rustdoc_file_exists (
481- & params. name ,
482- & krate. version . to_string ( ) ,
483- krate. latest_build_id ,
484- & storage_path,
485- krate. archive_storage ,
486- )
487- . await ?
488476 {
489- redirect (
490- & params. name ,
491- & krate. version ,
492- & req_path,
493- CachePolicy :: ForeverInCdn ,
494- )
495- } else if req_path. first ( ) . map_or ( false , |p| p. contains ( '-' ) ) {
477+ // If it fails, we try again with /index.html at the end
478+ let mut storage_path = storage_path. clone ( ) ;
479+ storage_path. push_str ( "/index.html" ) ;
480+
481+ let mut req_path = req_path. clone ( ) ;
482+ req_path. push ( "index.html" ) ;
483+
484+ if storage
485+ . rustdoc_file_exists (
486+ & params. name ,
487+ & krate. version . to_string ( ) ,
488+ krate. latest_build_id ,
489+ & storage_path,
490+ krate. archive_storage ,
491+ )
492+ . await ?
493+ {
494+ return redirect (
495+ & params. name ,
496+ & krate. version ,
497+ & req_path,
498+ CachePolicy :: ForeverInCdn ,
499+ ) ;
500+ }
501+ }
502+
503+ if req_path. first ( ) . map_or ( false , |p| p. contains ( '-' ) ) {
496504 // This is a target, not a module; it may not have been built.
497505 // Redirect to the default target and show a search page instead of a hard 404.
498- Ok ( axum_cached_redirect (
506+ return Ok ( axum_cached_redirect (
499507 encode_url_path ( & format ! (
500508 "/crate/{}/{}/target-redirect/{}" ,
501509 params. name,
@@ -504,21 +512,28 @@ pub(crate) async fn rustdoc_html_server_handler(
504512 ) ) ,
505513 CachePolicy :: ForeverInCdn ,
506514 ) ?
507- . into_response ( ) )
508- } else {
509- if storage_path == format ! ( "{}/index.html" , krate. target_name. expect( "we check rustdoc_status = true above, and with docs we have target_name" ) ) {
510- error ! (
511- krate = params. name,
512- version = krate. version. to_string( ) ,
513- original_path = original_path. as_ref( ) ,
514- storage_path,
515- "Couldn't find crate documentation root on storage.
516- Something is wrong with the build."
515+ . into_response ( ) ) ;
516+ }
517+
518+ if storage_path
519+ == format ! (
520+ "{}/index.html" ,
521+ krate. target_name. expect(
522+ "we check rustdoc_status = true above, and with docs we have target_name"
517523 )
518- }
524+ )
525+ {
526+ error ! (
527+ krate = params. name,
528+ version = krate. version. to_string( ) ,
529+ original_path = original_path. as_ref( ) ,
530+ storage_path,
531+ "Couldn't find crate documentation root on storage.
532+ Something is wrong with the build."
533+ )
534+ }
519535
520- Err ( AxumNope :: ResourceNotFound )
521- } ;
536+ return Err ( AxumNope :: ResourceNotFound ) ;
522537 }
523538 } ;
524539
@@ -2899,7 +2914,7 @@ mod test {
28992914
29002915 web. assert_redirect_cached_unchecked (
29012916 "/clap/2.24.0/i686-pc-windows-gnu/clap/which%20is%20a%20part%20of%20%5B%60Display%60%5D" ,
2902- "/crate/clap/2.24.0/target-redirect/i686-pc-windows-gnu/clap/which%20is%20a%20part%20of%20[%60Display%60]/index.html " ,
2917+ "/crate/clap/2.24.0/target-redirect/i686-pc-windows-gnu/clap/which%20is%20a%20part%20of%20[%60Display%60]" ,
29032918 CachePolicy :: ForeverInCdn ,
29042919 & env. config ( ) ,
29052920 ) . await ?;
0 commit comments