@@ -561,24 +561,22 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
561
561
return redirect_to_random_crate ( req, & mut conn) ;
562
562
}
563
563
564
- let ( krate, mut query) = match query. split_once ( "::" ) {
565
- Some ( ( krate, query) ) => ( krate. to_string ( ) , format ! ( "?search={query}" ) ) ,
566
- None => ( query. clone ( ) , "" . to_string ( ) ) ,
567
- } ;
564
+ let mut queries = std:: collections:: BTreeMap :: new ( ) ;
568
565
569
- for ( k, v) in params
570
- . iter ( )
571
- . filter ( |( k, _) | !matches ! ( k. as_ref( ) , "i-am-feeling-lucky" | "query" ) )
572
- {
573
- if query. is_empty ( ) {
574
- query. push ( '?' ) ;
575
- } else {
576
- query. push ( '&' )
566
+ let krate = match query. split_once ( "::" ) {
567
+ Some ( ( krate, query) ) => {
568
+ queries. insert ( "search" , query) ;
569
+ krate. to_string ( )
577
570
}
578
- query. push_str ( k) ;
579
- query. push ( '=' ) ;
580
- query. push_str ( v) ;
581
- }
571
+ None => query. clone ( ) ,
572
+ } ;
573
+
574
+ queries. extend (
575
+ params
576
+ . iter ( )
577
+ . filter ( |( k, _) | !matches ! ( k. as_ref( ) , "i-am-feeling-lucky" | "query" ) )
578
+ . map ( |( k, v) | ( k. as_ref ( ) , v. as_ref ( ) ) ) ,
579
+ ) ;
582
580
583
581
// since we never pass a version into `match_version` here, we'll never get
584
582
// `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
@@ -590,10 +588,18 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
590
588
let base = redirect_base ( req) ;
591
589
let url = if matchver. rustdoc_status {
592
590
let target_name = matchver. target_name ;
593
- ctry ! (
594
- req,
595
- Url :: parse( & format!( "{base}/{krate}/{version}/{target_name}/{query}" ) )
596
- )
591
+ let path = format ! ( "{base}/{krate}/{version}/{target_name}/" ) ;
592
+ if queries. is_empty ( ) {
593
+ ctry ! ( req, Url :: parse( & path) )
594
+ } else {
595
+ ctry ! (
596
+ req,
597
+ Url :: from_generic_url( ctry!(
598
+ req,
599
+ iron:: url:: Url :: parse_with_params( & path, queries)
600
+ ) )
601
+ )
602
+ }
597
603
} else {
598
604
ctry ! ( req, Url :: parse( & format!( "{base}/crate/{krate}/{version}" ) ) )
599
605
} ;
@@ -891,7 +897,7 @@ mod tests {
891
897
) ?;
892
898
assert_redirect (
893
899
"/releases/search?query=some_random_crate::some::path" ,
894
- "/some_random_crate/1.0.0/some_random_crate/?search=some::path " ,
900
+ "/some_random_crate/1.0.0/some_random_crate/?search=some%3A%3Apath " ,
895
901
web,
896
902
) ?;
897
903
Ok ( ( ) )
@@ -906,7 +912,7 @@ mod tests {
906
912
907
913
assert_redirect (
908
914
"/releases/search?query=some_random_crate::somepath&go_to_first=true" ,
909
- "/some_random_crate/1.0.0/some_random_crate/?search=somepath& go_to_first=true" ,
915
+ "/some_random_crate/1.0.0/some_random_crate/?go_to_first=true&search=somepath " ,
910
916
web,
911
917
) ?;
912
918
Ok ( ( ) )
0 commit comments