@@ -561,24 +561,22 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
561561 return redirect_to_random_crate ( req, & mut conn) ;
562562 }
563563
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 ( ) ;
568565
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 ( )
577570 }
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+ ) ;
582580
583581 // since we never pass a version into `match_version` here, we'll never get
584582 // `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
@@ -590,10 +588,18 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
590588 let base = redirect_base ( req) ;
591589 let url = if matchver. rustdoc_status {
592590 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+ }
597603 } else {
598604 ctry ! ( req, Url :: parse( & format!( "{base}/crate/{krate}/{version}" ) ) )
599605 } ;
@@ -891,7 +897,7 @@ mod tests {
891897 ) ?;
892898 assert_redirect (
893899 "/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 " ,
895901 web,
896902 ) ?;
897903 Ok ( ( ) )
@@ -906,7 +912,7 @@ mod tests {
906912
907913 assert_redirect (
908914 "/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 " ,
910916 web,
911917 ) ?;
912918 Ok ( ( ) )
0 commit comments