#http #server

tinyhttp

一个具有 SSL 和 GZIP 支持的 HTTP 库

21 个版本

0.4.0 2024 年 7 月 4 日
0.4.0-rc52023 年 12 月 7 日
0.4.0-rc32023 年 10 月 14 日
0.4.0-rc12023 年 7 月 10 日
0.2.7 2022 年 7 月 1 日

#333 in HTTP 服务器

GPL-2.0-or-later

14KB
192 代码行

tinyhttp

tinyhttp 是一个快速、多线程的 HTTP 服务器,使用过程宏来简化开发。

您还可以结合示例,例如使用挂载点和自定义路由

示例 1:使用挂载点

use std::net::TcpListener;
use tinyhttp::internal::config::*;
fn main() {
  let socket = TcpListener::bind(":::9001").unwrap();
  let mount_point = ".";
  let config = Config::new().mount_point(mount_point);
  let http = HttpListener::new(socket, config);

  http.start();
}

示例 2:使用过程宏


/// Functions marked with the get macro must return with a type of Into<Vec<u8>>
use std::net::TcpListener;
use tinyhttp::prelude::*;
#[get("/")]
fn get() -> &'static str {
 "Hello, World!"
}

#[post("/")]
fn post() -> &'static str {
  "Hello, there!"
}

fn main() {
  let socket = TcpListener::bind(":::80").unwrap();
  let routes = Routes::new(vec![get(), post()]);
  let config = Config::new().routes(routes);
  let http = HttpListener::new(socket, config);

  http.start();
}

所有路由函数都必须包含在 Routes::new(vec![])

深入了解路由函数

目前,路由函数可以返回任何可以转换为 Into<Vec<u8>>Response 的类型。

use tinyhttp::prelude::*;

// Example 1: returns anything Into<Vec<u8>>
#[get("/")]
fn ex1_get() -> &'static str {
    "Hello World!"
}

// Example 2: same as example 1, but takes a Request as an argument
#[get("/ex2")]
fn ex2_get(req: Request) -> String {
    let headers = req.get_headers();
    let accept_header = headers.get("accept").unwrap();
    format!("accept header: {}", accept_header)
}

// Example 3: takes a Request as an argument and returns a Response for more control
#[get("/ex3")]
fn ex3_get(req: Request) -> Response {
    Response::new()
        .status_line("HTTP/1.1 200 OK\r\n")
        .mime("text/plain")
        .body(b"Hello from response!\r\n".to_vec())
}

依赖项

~2–12MB
~129K SLoC