Skip to content

Commit 1cd4295

Browse files
committed
Add json version of search route; rust-lang#145
1 parent 13da7b2 commit 1cd4295

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

src/web/error.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use iron::Handler;
44
use iron::status;
55
use web::page::Page;
66
use std::fmt;
7+
use time;
78

89
#[derive(Debug, Copy, Clone)]
910
pub enum Nope {
@@ -48,7 +49,21 @@ impl Handler for Nope {
4849
Nope::NoResults => {
4950
use params::{Params, Value};
5051
let params = req.get::<Params>().unwrap();
51-
if let Some(&Value::String(ref query)) = params.find(&["query"]) {
52+
53+
if req.url.path().join("/").ends_with(".json") {
54+
use iron::status;
55+
use iron::headers::{Expires, HttpDate, CacheControl, CacheDirective, ContentType,
56+
AccessControlAllowOrigin};
57+
58+
let mut resp = Response::with((status::Ok, "[]"));
59+
resp.headers.set(ContentType("application/json".parse().unwrap()));
60+
resp.headers.set(Expires(HttpDate(time::now())));
61+
resp.headers.set(CacheControl(vec![CacheDirective::NoCache,
62+
CacheDirective::NoStore,
63+
CacheDirective::MustRevalidate]));
64+
resp.headers.set(AccessControlAllowOrigin::Any);
65+
Ok(resp)
66+
} else if let Some(&Value::String(ref query)) = params.find(&["query"]) {
5267
// this used to be a search
5368
Page::new(Vec::<super::releases::Release>::new())
5469
.set_status(status::NotFound)

src/web/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ impl CratesfyiHandler {
125125
router.get("/releases/search",
126126
releases::search_handler,
127127
"releases_search");
128+
router.get("/releases/search.json",
129+
releases::search_handler,
130+
"releases_search_json");
128131
router.get("/releases/queue",
129132
releases::build_queue_handler,
130133
"releases_queue");

src/web/releases.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -477,10 +477,25 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
477477
.ok_or(IronError::new(Nope::NoResults, status::NotFound))
478478
.and_then(|(_, results)| {
479479
// FIXME: There is no pagination
480-
Page::new(results)
481-
.set("search_query", &query)
482-
.title(&format!("Search results for '{}'", query))
483-
.to_resp("releases")
480+
if req.url.path().join("/").ends_with(".json") {
481+
use iron::status;
482+
use iron::headers::{Expires, HttpDate, CacheControl, CacheDirective, ContentType,
483+
AccessControlAllowOrigin};
484+
485+
let mut resp = Response::with((status::Ok, results.to_json().to_string()));
486+
resp.headers.set(ContentType("application/json".parse().unwrap()));
487+
resp.headers.set(Expires(HttpDate(time::now())));
488+
resp.headers.set(CacheControl(vec![CacheDirective::NoCache,
489+
CacheDirective::NoStore,
490+
CacheDirective::MustRevalidate]));
491+
resp.headers.set(AccessControlAllowOrigin::Any);
492+
Ok(resp)
493+
} else {
494+
Page::new(results)
495+
.set("search_query", &query)
496+
.title(&format!("Search results for '{}'", query))
497+
.to_resp("releases")
498+
}
484499
})
485500
} else {
486501
Err(IronError::new(Nope::NoResults, status::NotFound))

0 commit comments

Comments
 (0)