// Copyright (c) 2016 The Rouille developers // Licensed under the Apache License, Version 2.0 // or the MIT // license , // at your option. All files in the project carrying such // notice may not be copied, modified, or distributed except // according to those terms. #[macro_use] extern crate rouille_ng; fn main() { println!("Now listening on localhost:8000"); // The `start_server` starts listening forever on the given address. rouille_ng::start_server("localhost:8000", move |request| { // The closure passed to `start_server` will be called once for each client request. It // will be called multiple times concurrently when there are multiple clients. // Here starts the real handler for the request. // // The `router!` macro is very similar to a `match` expression in core Rust. The macro // takes the request as parameter and will jump to the first block that matches the // request. // // Each of the possible blocks builds a `Response` object. Just like most things in Rust, // the `router!` macro is an expression whose value is the `Response` built by the block // that was called. Since `router!` is the last piece of code of this closure, the // `Response` is then passed back to the `start_server` function and sent to the client. router!(request, (GET) (/) => { // If the request's URL is `/`, we jump here. // This block builds a `Response` object that redirects to the `/hello/world`. rouille_ng::Response::redirect_302("/hello/world") }, (GET) (/hello/world) => { // If the request's URL is `/hello/world`, we jump here. println!("hello world"); // Builds a `Response` object that contains the "hello world" text. rouille_ng::Response::text("hello world") }, (GET) (/panic) => { // If the request's URL is `/panic`, we jump here. // // This block panics. Fortunately rouille_ng will automatically catch the panic and // send back a 500 error message to the client. This prevents the server from // closing unexpectedly. panic!("Oops!") }, (GET) (/{id: u32}) => { // If the request's URL is for example `/5`, we jump here. // // The `router!` macro will attempt to parse the identfier (eg. `5`) as a `u32`. If // the parsing fails (for example if the URL is `/hello`), then this block is not // called and the `router!` macro continues looking for another block. println!("u32 {:?}", id); // For the same of the example we return an empty response with a 400 status code. rouille_ng::Response::empty_400() }, (GET) (/{id: String}) => { // If the request's URL is for example `/foo`, we jump here. // // This route is similar to the previous one, but this time we have a `String`. // Parsing into a `String` never fails. println!("String {:?}", id); // Builds a `Response` object that contains "hello, " followed with the value // of `id`. rouille_ng::Response::text(format!("hello, {}", id)) }, // The code block is called if none of the other blocks matches the request. // We return an empty response with a 404 status code. _ => rouille_ng::Response::empty_404() ) }); }