@@ -584,24 +584,22 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
584
584
return redirect_to_random_crate ( req, & mut conn) ;
585
585
}
586
586
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 ( ) ;
591
588
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 ( )
600
593
}
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
+ ) ;
605
603
606
604
// since we never pass a version into `match_version` here, we'll never get
607
605
// `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
@@ -613,10 +611,18 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
613
611
let base = redirect_base ( req) ;
614
612
let url = if matchver. rustdoc_status {
615
613
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
+ }
620
626
} else {
621
627
ctry ! ( req, Url :: parse( & format!( "{base}/crate/{krate}/{version}" ) ) )
622
628
} ;
@@ -914,7 +920,7 @@ mod tests {
914
920
) ?;
915
921
assert_redirect (
916
922
"/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 " ,
918
924
web,
919
925
) ?;
920
926
Ok ( ( ) )
@@ -929,7 +935,7 @@ mod tests {
929
935
930
936
assert_redirect (
931
937
"/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 " ,
933
939
web,
934
940
) ?;
935
941
Ok ( ( ) )
0 commit comments