#[macro_use] extern crate nickel;
extern crate regex;
extern crate rustc_serialize;
extern crate hyper;
use std::io::Write;
use nickel::status::StatusCode::{self, NotFound};
use nickel::{
Nickel, NickelError, Continue, Halt, Request, Response, MediaType,
QueryString, JsonBody, StaticFilesHandler, MiddlewareResult, HttpRouter, Action
};
use regex::Regex;
use hyper::header::Location;
#[derive(RustcDecodable, RustcEncodable)]
struct Person {
firstname: String,
lastname: String,
}
fn logger<'a, D>(request: &mut Request<D>, response: Response<'a, D>) -> MiddlewareResult<'a, D> {
println!("logging request: {:?}", request.origin.uri);
response.next_middleware()
}
fn custom_404<'a, D>(err: &mut NickelError<D>, _req: &mut Request<D>) -> Action {
if let Some(ref mut res) = err.stream {
if res.status() == NotFound {
let _ = res.write_all(b"<h1>Call the police!</h1>");
return Halt(())
}
}
Continue(())
}
fn main() {
let mut server = Nickel::new();
server.utilize(logger);
server.utilize(StaticFilesHandler::new("examples/assets/"));
let hello_regex = Regex::new("/hello/(?P<name>[a-zA-Z]+)").unwrap();
server.utilize(router!(
get "/user/:userid" => |request| {
format!("This is user: {}", request.param("userid").unwrap())
}
get "/no_alloc/:userid" => |request, response| {
&["This is user: ", request.param("userid").unwrap()][..]
}
get "/bar" => {
(200u16, "This is the /bar handler")
}
get "/content-type" => |_, mut response| {
response.set(MediaType::Json);
"{'foo':'bar'}"
}
get hello_regex => |request| {
format!("Hello {}", request.param("name").unwrap())
}
get "/redirect" => |_, mut response| {
response.set(Location("http://nickel.rs".into()));
StatusCode::PermanentRedirect
}
get "/private" => {
(StatusCode::Unauthorized, "This is a private place")
}
get "/some/*/route" => {
"This matches /some/crazy/route but not /some/super/crazy/route"
}
get "/a/**/route" => {
"This matches /a/crazy/route and also /a/super/crazy/route"
}
post "/a/post/request" => |request| {
let person = request.json_as::<Person>().unwrap();
format!("Hello {} {}", person.firstname, person.lastname)
}
get "/query" => |request| {
let query = request.query();
let foo = query.get("foo").unwrap_or("This is only a default value");
let bar = query.get("bar").unwrap_or("This is only a default value");
let text = format!("<p>Your foo values in the query string are: {:?}\
<p>Your bar values are: {:?}",
foo, bar);
text
}
));
let custom_handler: fn(&mut NickelError<()>, &mut Request<()>) -> Action = custom_404;
server.handle_error(custom_handler);
println!("Running server!");
server.listen("127.0.0.1:6767");
}