@@ -554,31 +554,43 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
554
554
let mut conn = extension ! ( req, Pool ) . get ( ) ?;
555
555
556
556
// check if I am feeling lucky button pressed and redirect user to crate page
557
- // if there is a match
558
- if params. contains_key ( "i-am-feeling-lucky" ) {
557
+ // if there is a match. Also check for paths to items within crates.
558
+ if params. contains_key ( "i-am-feeling-lucky" ) || query . contains ( "::" ) {
559
559
// redirect to a random crate if query is empty
560
560
if query. is_empty ( ) {
561
561
return redirect_to_random_crate ( req, & mut conn) ;
562
562
}
563
+
564
+ let ( krate, query) = match query. split_once ( "::" ) {
565
+ Some ( ( krate, query) ) => ( krate. to_string ( ) , format ! ( "?query={query}" ) ) ,
566
+ None => ( query. clone ( ) , "" . to_string ( ) ) ,
567
+ } ;
568
+
563
569
// since we never pass a version into `match_version` here, we'll never get
564
570
// `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
565
571
// matter
566
- if let Ok ( matchver) = match_version ( & mut conn, & query , None ) {
572
+ if let Ok ( matchver) = match_version ( & mut conn, & krate , None ) {
567
573
let ( version, _) = matchver. version . into_parts ( ) ;
568
- let query = matchver. corrected_name . unwrap_or_else ( || query . to_string ( ) ) ;
574
+ let krate = matchver. corrected_name . unwrap_or ( krate ) ;
569
575
570
576
let url = if matchver. rustdoc_status {
571
577
ctry ! (
572
578
req,
573
- Url :: parse( & format!( "{}/{}/{}/" , redirect_base( req) , query, version) ) ,
579
+ Url :: parse( & format!(
580
+ "{}/{}/{}/{}" ,
581
+ redirect_base( req) ,
582
+ krate,
583
+ version,
584
+ query
585
+ ) ) ,
574
586
)
575
587
} else {
576
588
ctry ! (
577
589
req,
578
590
Url :: parse( & format!(
579
591
"{}/crate/{}/{}" ,
580
592
redirect_base( req) ,
581
- query ,
593
+ krate ,
582
594
version,
583
595
) ) ,
584
596
)
0 commit comments