Skip to content

Commit 99eb7ca

Browse files
committed
add JSON API for crate info
1 parent 017c47c commit 99eb7ca

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

src/web/crate_details.rs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -229,14 +229,28 @@ pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
229229

230230
let conn = extension!(req, Pool);
231231

232-
match_version(&conn, &name, req_version)
232+
let details = match_version(&conn, &name, req_version)
233233
.and_then(|version| CrateDetails::new(&conn, &name, &version))
234-
.ok_or(IronError::new(Nope::CrateNotFound, status::NotFound))
235-
.and_then(|details| {
236-
Page::new(details)
237-
.set_true("show_package_navigation")
238-
.set_true("javascript_highlightjs")
239-
.set_true("package_navigation_crate_tab")
240-
.to_resp("crate_details")
241-
})
234+
.ok_or(IronError::new(Nope::CrateNotFound, status::NotFound))?;
235+
236+
if req.url.path().join("/").ends_with("info.json") {
237+
use iron::status;
238+
use iron::headers::{Expires, HttpDate, CacheControl, CacheDirective, ContentType,
239+
AccessControlAllowOrigin};
240+
241+
let mut resp = Response::with((status::Ok, details.to_json().to_string()));
242+
resp.headers.set(ContentType("application/json".parse().unwrap()));
243+
resp.headers.set(Expires(HttpDate(time::now())));
244+
resp.headers.set(CacheControl(vec![CacheDirective::NoCache,
245+
CacheDirective::NoStore,
246+
CacheDirective::MustRevalidate]));
247+
resp.headers.set(AccessControlAllowOrigin::Any);
248+
Ok(resp)
249+
} else {
250+
Page::new(details)
251+
.set_true("show_package_navigation")
252+
.set_true("javascript_highlightjs")
253+
.set_true("package_navigation_crate_tab")
254+
.to_resp("crate_details")
255+
}
242256
}

src/web/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ impl CratesfyiHandler {
129129
router.get("/crate/:name",
130130
crate_details::crate_details_handler,
131131
"crate_name");
132+
router.get("/crate/:name/info.json",
133+
crate_details::crate_details_handler,
134+
"crate_name_json");
132135
router.get("/crate/:name/",
133136
crate_details::crate_details_handler,
134137
"crate_name_");

0 commit comments

Comments
 (0)