1 个不稳定版本

使用旧Rust 2015

0.1.0 2018年8月17日

#1132HTTP服务器

MIT 协议

36KB
858

lucifer

Lucifer是一个Web服务器库。Lucifer附带了自己的http实现。此外,它还提供了路由和添加中间件的可能性。

入门指南

首先,您需要将lucifer添加到您想要使用的项目的依赖项中。现在将lucifer添加到您的文件中。extern crate lucifer;

要添加到路由中的函数需要有以下签名

fn [function_name](req: Request, args: Args)

启动服务器时,它需要一个RouteHandler和一个MiddleWareStore。我们先不考虑MiddleWareStore。RouteHandler是一个对象,您可以向其中添加服务器要监听的路由。可以通过以下方式添加并监听根路由。

extern crate lucifer;

use lucifer::http::*;
use lucifer::router::*;
use lucifer::middleware::*;

fn main() {
    let mut server = lucifer::Server::new();
    let mut router = RouteHanlder::new();
    router.add(Method::GET, "/", root_function);
    server.listen("127.0.0.1:8000", router, MiddlewareStore::new())
}

路由

路由处理器

路由由RouteHandler处理。可以通过add_route方法添加路由,并通过get_route方法检索对应的函数。

添加和检索路由时,可以使用所有HTTP动词,这些动词在枚举http::Method中定义。这些动词包括

  • get
  • head
  • post
  • put
  • delete
  • trace
  • options
  • connect
  • patch

路由本身可以是静态路由,也可以包含变量,这些变量在函数被调用时是可访问的。要在路由中添加变量部分,请从':'开始,后面跟变量名。不要在URL中使用相同的名称多次,否则将发生名称冲突,其中一个将无法在函数中访问。此值可以在函数中从args中检索。在args中,变量名仍然约束':'以使变量的来源清晰。

除了单个变量之外,路由的其余部分也可以是变量。这可以通过使用'*'作为路由来实现,例如/static/*。这将调用每个以/static/开头的请求相同的函数,并且可以通过args.get("*")从args中检索uri的其余部分。

静态路由的示例

在这个例子中,/static/ 路由将服务请求的文件或返回404错误。

extern crate lucifer;

use lucifer::http::*;
use lucifer::router::*;
use lucifer::middleware::*;
use std::fs::File;
use std::io::prelude::*;

fn main() {
    let mut server = lucifer::Server::new();
    let mut routes = RouteHandler::new();
    routes.add_route(Method::GET, "/static/*", static_content);
    server.listen("127.0.0.1:8000", routes, MiddlewareStore::new());
}

fn static_content(_req: Request, args: Args) -> Response {
    let mut res = Response::new();
    match args.get("*") {
        Some(resource) => {
            let mut location = String::from("./static/");
            location.push_str(resource);
            match File::open(location) {
                Ok(mut file) => {
                    let mut contents = String::new();
                    match file.read_to_string(&mut contents) {
                        Ok(_) => {res.send_message(&contents);},
                        Err(_) => {res.set_status(500);}
                    }
                },
                Err(_) => {
                    res.set_status(404);
                }
            }
        },
        None => {
            res.set_status(404);
        }
    }
    res
}

请注意,上述代码不安全,如果没有对输入进行敏感化处理,可能会被滥用,从而读取系统上的意外文件。

查询

该路由器支持类似 /path/to/page?name=ferret&colour=purple 的uri查询。该功能可以从形式为 '?' 后跟查询变量名的 args 中获取这些信息。对于此示例 uri,它给出了变量键 ?name,其值为 ferret,以及键 ?colour,其值为 purple

片段

最后,该路由器还会将给定的片段添加到 args 中。片段以键 # 的形式添加。

中间件

要在应用程序中使用中间件,必须将中间件添加到 middlware::MiddlewareStore 的一个实例中,您将其作为第三个参数传递给 Server.listen()

创建中间件

要为 lucifer 创建中间件,中间件需要实现 middleware::MiddlewareSyncSend 特性。Middleware 特性要求实现以下签名的方法调用。

fn call(&self, req: Request, args: Args, handle: &mut MiddlewareHandle) -> Response

中间件可以访问将传递到请求路由上函数的相同参数。中间件调用与路由函数之间的区别是额外的 MiddlewareHandle 参数。此句柄有一个名为 next 的函数,必须调用它以继续执行剩余的中间件和特定于路由的函数。一个空中间件,除了传递请求外什么都不做,如下所示。

extern crate lucifer;

use lucifer::middleware::*;

pub struct Nothing {}

impl lucifer::middleware::Middleware for Nothing {
    fn call(&self, req: Request, args: Args, handle: &mut MiddlewareHandle) -> Response {
        handle.next(req, args)
    }
}

要修改传入的参数,可以修改或替换 Request 和 Args。另一方面,对于想要修改传出响应的人来说,可以捕获 MiddlewareHandle.next() 的结果,并修改或替换它。第三种选择是永不调用 handle.next(),而是创建并返回中间件的响应。

无运行时依赖项