[][src]Module ructe::Using_static_files::d_Nickel

How to serve static files with the Nickel framework.

Somewhere (maybe in main), you probably create a Nickel server. To add a static handler could look something like this:

This example is not tested
// Somewhere (maybe in main) you create a Nickel server
let mut server = Nickel::new();
// Among the routes, you add this:
server.get("/static/:name.:ext", static_file);
// Then you add more routes and start the server as usual

Then the actual handler needs to be implemented. Here's one implementation.

This example is not tested
fn static_file<'mw>(req: &mut Request,
                    mut res: Response<'mw>)
                    -> MiddlewareResult<'mw> {

    if let (Some(name), Some(ext)) =
           (req.param("name"), req.param("ext"))
    {
        use templates::statics::StaticFile;
        if let Some(s) = StaticFile::get(&format!("{}.{}", name, ext)) {
            res.set(ContentType(s.mime()));
            res.set(Expires(HttpDate(now() + Duration::days(300))));
            return res.send(s.content);
        }
    }
    res.error(StatusCode::NotFound, "Not found")
}

This implementation uses the mime02 feature of ructe. Relevant parts of Cargo.toml might look like this:

[build-dependencies]
ructe = { version = "^0.3.2", features = ["mime02"] }

[dependencies]
nickel = "~0.10"
hyper = "~0.10"
time = "*"
mime = "~0.2"

There is a full example as examples/nickel in the ructe repository.