Skip to content

Commit a2d4e58

Browse files
Merge pull request #325 from QuietMisdreavus/redirect-to-crate
redirect from docs.rs/crate-name to crate details if doc build failed
2 parents 677850f + f86a1f1 commit a2d4e58

File tree

1 file changed

+33
-11
lines changed

1 file changed

+33
-11
lines changed

src/web/rustdoc.rs

+33-11
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,23 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
8787
Ok(resp)
8888
}
8989

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+
90107
let router = extension!(req, Router);
91108
// this handler should never called without crate pattern
92109
let crate_name = cexpect!(router.find("crate"));
@@ -99,18 +116,23 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
99116
None => return Err(IronError::new(Nope::CrateNotFound, status::NotFound)),
100117
};
101118

102-
// get target name
119+
// get target name and whether it has docs
103120
// 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+
}
114136
}
115137

116138

0 commit comments

Comments
 (0)