@@ -584,24 +584,22 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
584584 return redirect_to_random_crate ( req, & mut conn) ;
585585 }
586586
587- let ( krate, mut query) = match query. split_once ( "::" ) {
588- Some ( ( krate, query) ) => ( krate. to_string ( ) , format ! ( "?search={query}" ) ) ,
589- None => ( query. clone ( ) , "" . to_string ( ) ) ,
590- } ;
587+ let mut queries = std:: collections:: BTreeMap :: new ( ) ;
591588
592- for ( k, v) in params
593- . iter ( )
594- . filter ( |( k, _) | !matches ! ( k. as_ref( ) , "i-am-feeling-lucky" | "query" ) )
595- {
596- if query. is_empty ( ) {
597- query. push ( '?' ) ;
598- } else {
599- query. push ( '&' )
589+ let krate = match query. split_once ( "::" ) {
590+ Some ( ( krate, query) ) => {
591+ queries. insert ( "search" , query) ;
592+ krate. to_string ( )
600593 }
601- query. push_str ( k) ;
602- query. push ( '=' ) ;
603- query. push_str ( v) ;
604- }
594+ None => query. clone ( ) ,
595+ } ;
596+
597+ queries. extend (
598+ params
599+ . iter ( )
600+ . filter ( |( k, _) | !matches ! ( k. as_ref( ) , "i-am-feeling-lucky" | "query" ) )
601+ . map ( |( k, v) | ( k. as_ref ( ) , v. as_ref ( ) ) ) ,
602+ ) ;
605603
606604 // since we never pass a version into `match_version` here, we'll never get
607605 // `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
@@ -613,10 +611,18 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
613611 let base = redirect_base ( req) ;
614612 let url = if matchver. rustdoc_status {
615613 let target_name = matchver. target_name ;
616- ctry ! (
617- req,
618- Url :: parse( & format!( "{base}/{krate}/{version}/{target_name}/{query}" ) )
619- )
614+ let path = format ! ( "{base}/{krate}/{version}/{target_name}/" ) ;
615+ if queries. is_empty ( ) {
616+ ctry ! ( req, Url :: parse( & path) )
617+ } else {
618+ ctry ! (
619+ req,
620+ Url :: from_generic_url( ctry!(
621+ req,
622+ iron:: url:: Url :: parse_with_params( & path, queries)
623+ ) )
624+ )
625+ }
620626 } else {
621627 ctry ! ( req, Url :: parse( & format!( "{base}/crate/{krate}/{version}" ) ) )
622628 } ;
@@ -914,7 +920,7 @@ mod tests {
914920 ) ?;
915921 assert_redirect (
916922 "/releases/search?query=some_random_crate::some::path" ,
917- "/some_random_crate/1.0.0/some_random_crate/?search=some::path " ,
923+ "/some_random_crate/1.0.0/some_random_crate/?search=some%3A%3Apath " ,
918924 web,
919925 ) ?;
920926 Ok ( ( ) )
@@ -929,7 +935,7 @@ mod tests {
929935
930936 assert_redirect (
931937 "/releases/search?query=some_random_crate::somepath&go_to_first=true" ,
932- "/some_random_crate/1.0.0/some_random_crate/?search=somepath& go_to_first=true" ,
938+ "/some_random_crate/1.0.0/some_random_crate/?go_to_first=true&search=somepath " ,
933939 web,
934940 ) ?;
935941 Ok ( ( ) )
0 commit comments