@@ -480,13 +480,6 @@ pub(crate) async fn crate_details_handler(
480480 Extension ( storage) : Extension < Arc < AsyncStorage > > ,
481481 mut conn : DbConnection ,
482482) -> AxumResult < AxumResponse > {
483- if params. original_path ( ) != params. crate_details_url ( ) . path ( ) {
484- return Err ( AxumNope :: Redirect (
485- params. crate_details_url ( ) ,
486- CachePolicy :: ForeverInCdn ,
487- ) ) ;
488- }
489-
490483 let matched_release = match_version ( & mut conn, params. name ( ) , params. req_version ( ) )
491484 . await ?
492485 . assume_exact_name ( ) ?
@@ -498,6 +491,13 @@ pub(crate) async fn crate_details_handler(
498491 } ) ?;
499492 let params = params. apply_matched_release ( & matched_release) ;
500493
494+ if params. original_path ( ) != params. crate_details_url ( ) . path ( ) {
495+ return Err ( AxumNope :: Redirect (
496+ params. crate_details_url ( ) ,
497+ CachePolicy :: ForeverInCdn ,
498+ ) ) ;
499+ }
500+
501501 let mut details = CrateDetails :: from_matched_release ( & mut conn, matched_release) . await ?;
502502
503503 match details. fetch_readme ( & storage) . await {
@@ -717,6 +717,7 @@ mod tests {
717717 } ;
718718 use crate :: { db:: update_build_status, registry_api:: CrateOwner } ;
719719 use anyhow:: Error ;
720+ use http:: StatusCode ;
720721 use kuchikiki:: traits:: TendrilSink ;
721722 use pretty_assertions:: assert_eq;
722723 use std:: collections:: HashMap ;
@@ -2219,10 +2220,19 @@ path = "src/lib.rs"
22192220 . create ( )
22202221 . await ?;
22212222
2222- env. web_app ( )
2223- . await
2224- . assert_redirect_unchecked ( "/crate/dummy%3E" , "/crate/dummy%3E/latest" )
2225- . await ?;
2223+ let resp = env. web_app ( ) . await . get ( "/crate/dummy%3E" ) . await ?;
2224+ assert_eq ! ( resp. status( ) , StatusCode :: NOT_FOUND ) ;
2225+
2226+ Ok ( ( ) )
2227+ } )
2228+ }
2229+
2230+ #[ test_case( "/crate/dummy" ; "without" ) ]
2231+ #[ test_case( "/crate/dummy/" ; "slash" ) ]
2232+ fn test_unknown_crate_not_found_doesnt_redirect ( path : & str ) {
2233+ async_wrapper ( |env| async move {
2234+ let resp = env. web_app ( ) . await . get ( path) . await ?;
2235+ assert_eq ! ( resp. status( ) , StatusCode :: NOT_FOUND ) ;
22262236
22272237 Ok ( ( ) )
22282238 } )
0 commit comments