@@ -87,6 +87,23 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
87
87
Ok ( resp)
88
88
}
89
89
90
+ fn redirect_to_crate ( req : & Request ,
91
+ name : & str ,
92
+ vers : & str )
93
+ -> IronResult < Response > {
94
+ let url = ctry ! ( Url :: parse( & format!( "{}://{}:{}/crate/{}/{}" ,
95
+ req. url. scheme( ) ,
96
+ req. url. host( ) ,
97
+ req. url. port( ) ,
98
+ name,
99
+ vers) [ ..] ) ) ;
100
+
101
+ let mut resp = Response :: with ( ( status:: Found , Redirect ( url) ) ) ;
102
+ resp. headers . set ( Expires ( HttpDate ( time:: now ( ) ) ) ) ;
103
+
104
+ Ok ( resp)
105
+ }
106
+
90
107
let router = extension ! ( req, Router ) ;
91
108
// this handler should never called without crate pattern
92
109
let crate_name = cexpect ! ( router. find( "crate" ) ) ;
@@ -99,18 +116,23 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
99
116
None => return Err ( IronError :: new ( Nope :: CrateNotFound , status:: NotFound ) ) ,
100
117
} ;
101
118
102
- // get target name
119
+ // get target name and whether it has docs
103
120
// FIXME: This is a bit inefficient but allowing us to use less code in general
104
- let target_name: String =
105
- ctry ! ( conn. query( "SELECT target_name
106
- FROM releases
107
- INNER JOIN crates ON crates.id = releases.crate_id
108
- WHERE crates.name = $1 AND releases.version = $2" ,
109
- & [ & crate_name, & version] ) )
110
- . get ( 0 )
111
- . get ( 0 ) ;
112
-
113
- redirect_to_doc ( req, & crate_name, & version, & target_name)
121
+ let ( target_name, has_docs) : ( String , bool ) = {
122
+ let rows = ctry ! ( conn. query( "SELECT target_name, rustdoc_status
123
+ FROM releases
124
+ INNER JOIN crates ON crates.id = releases.crate_id
125
+ WHERE crates.name = $1 AND releases.version = $2" ,
126
+ & [ & crate_name, & version] ) ) ;
127
+
128
+ ( rows. get ( 0 ) . get ( 0 ) , rows. get ( 0 ) . get ( 1 ) )
129
+ } ;
130
+
131
+ if has_docs {
132
+ redirect_to_doc ( req, & crate_name, & version, & target_name)
133
+ } else {
134
+ redirect_to_crate ( req, & crate_name, & version)
135
+ }
114
136
}
115
137
116
138
0 commit comments