@@ -78,9 +78,21 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
78
78
req : & Request ,
79
79
name : & str ,
80
80
vers : & str ,
81
+ target : Option < & str > ,
81
82
target_name : & str ,
82
83
) -> IronResult < Response > {
83
- let mut url_str = format ! ( "{}/{}/{}/{}/" , redirect_base( req) , name, vers, target_name, ) ;
84
+ let mut url_str = if let Some ( target) = target {
85
+ format ! (
86
+ "{}/{}/{}/{}/{}/" ,
87
+ redirect_base( req) ,
88
+ name,
89
+ vers,
90
+ target,
91
+ target_name
92
+ )
93
+ } else {
94
+ format ! ( "{}/{}/{}/{}/" , redirect_base( req) , name, vers, target_name)
95
+ } ;
84
96
if let Some ( query) = req. url . query ( ) {
85
97
url_str. push ( '?' ) ;
86
98
url_str. push_str ( query) ;
@@ -149,6 +161,7 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
149
161
. unwrap_or_else ( |_| crate_name. into ( ) )
150
162
. into_owned ( ) ;
151
163
let req_version = router. find ( "version" ) ;
164
+ let mut target = router. find ( "target" ) ;
152
165
153
166
let conn = extension ! ( req, Pool ) . get ( ) ;
154
167
@@ -173,16 +186,20 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
173
186
let ( target_name, has_docs) : ( String , bool ) = {
174
187
let rows = ctry ! ( conn. query(
175
188
"SELECT target_name, rustdoc_status
176
- FROM releases
177
- WHERE releases.id = $1" ,
189
+ FROM releases
190
+ WHERE releases.id = $1" ,
178
191
& [ & id]
179
192
) ) ;
180
193
181
194
( rows. get ( 0 ) . get ( 0 ) , rows. get ( 0 ) . get ( 1 ) )
182
195
} ;
183
196
197
+ if target == Some ( "index.html" ) || target == Some ( & target_name) {
198
+ target = None ;
199
+ }
200
+
184
201
if has_docs {
185
- redirect_to_doc ( req, & crate_name, & version, & target_name)
202
+ redirect_to_doc ( req, & crate_name, & version, target , & target_name)
186
203
} else {
187
204
redirect_to_crate ( req, & crate_name, & version)
188
205
}
@@ -351,14 +368,12 @@ fn path_for_version(req_path: &[&str], known_platforms: &[String], conn: &Connec
351
368
. expect ( "paths should be of the form <kind>.<name>.html" )
352
369
} ;
353
370
// check if req_path[3] is the platform choice or the name of the crate
354
- let concat_path;
355
- let crate_root = if known_platforms. iter ( ) . any ( |s| s == req_path[ 3 ] ) && req_path. len ( ) >= 5 {
356
- concat_path = format ! ( "{}/{}" , req_path[ 3 ] , req_path[ 4 ] ) ;
357
- & concat_path
358
- } else {
371
+ let platform = if known_platforms. iter ( ) . any ( |s| s == req_path[ 3 ] ) && req_path. len ( ) >= 5 {
359
372
req_path[ 3 ]
373
+ } else {
374
+ ""
360
375
} ;
361
- format ! ( "{}?search={}" , crate_root , search_item)
376
+ format ! ( "{}?search={}" , platform , search_item)
362
377
}
363
378
364
379
pub fn target_redirect_handler ( req : & mut Request ) -> IronResult < Response > {
@@ -641,13 +656,12 @@ mod test {
641
656
latest_version_redirect ( "/dummy/0.1.0/dummy/struct.will-be-deleted.html" , & web) ?;
642
657
// This must be a double redirect to deal with crates that failed to build in the
643
658
// latest version
644
- assert_eq ! ( redirect, "/dummy/0.2.0/dummy ?search=will-be-deleted" ) ;
659
+ assert_eq ! ( redirect, "/dummy/0.2.0/?search=will-be-deleted" ) ;
645
660
assert_redirect (
646
- "/dummy/0.2.0/dummy?search=will-be-deleted" ,
661
+ & redirect ,
647
662
"/dummy/0.2.0/dummy/?search=will-be-deleted" ,
648
663
& web,
649
- )
650
- . unwrap ( ) ;
664
+ ) ?;
651
665
652
666
Ok ( ( ) )
653
667
} )
@@ -1041,8 +1055,6 @@ mod test {
1041
1055
. add_target ( "x86_64-pc-windows-msvc" )
1042
1056
. create ( ) ?;
1043
1057
1044
- // For top-level items on non-default platforms we redirect to the target-specific doc
1045
- // root as the top-level items can't know which target they're for
1046
1058
assert_platform_links (
1047
1059
web,
1048
1060
"/dummy/0.4.0/settings.html" ,
@@ -1097,7 +1109,7 @@ mod test {
1097
1109
& [
1098
1110
(
1099
1111
"x86_64-pc-windows-msvc" ,
1100
- "/dummy/0.4.0/x86_64-pc-windows-msvc/dummy?search=DefaultOnly" ,
1112
+ "/dummy/0.4.0/x86_64-pc-windows-msvc/dummy/ ?search=DefaultOnly" ,
1101
1113
) ,
1102
1114
(
1103
1115
"x86_64-unknown-linux-gnu" ,
0 commit comments