使用旧的Rust 2015

0.7.0 2021年1月8日

#21 in #服务器响应

MIT/Apache

95KB
2K SLoC

tiny-http

Build Status

文档

这是一个小巧但强大的Rust HTTP服务器。其主要目标是100%符合HTTP标准,并提供一个简单的创建HTTP服务器的途径。

tiny-http 处理什么?

  • 接受和管理客户端连接
  • 解析请求
  • 请求流水线
  • 传输编码和内容编码(尚未完全实现
  • 将用户输入(例如POST输入)转换为连续的UTF-8字符串(尚未实现
  • 范围(尚未实现
  • HTTPS
  • Connection: upgrade(用于Websocket)

tiny-http处理与客户端连接、数据传输和编码相关的一切。

其他一切(解析头值、多部分数据、路由、ETags、缓存控制、HTML模板等)必须由您的代码处理。如果您想在Rust中创建网站,我强烈建议使用框架而不是此库。

安装

将以下内容添加到您的项目的Cargo.toml文件中

[dependencies]
tiny_http = "0.6"

别忘了添加外部crate

extern crate tiny_http;

使用

use tiny_http::{Server, Response};

let server = Server::http("0.0.0.0:8000").unwrap();

for request in server.incoming_requests() {
    println!("received request! method: {:?}, url: {:?}, headers: {:?}",
        request.method(),
        request.url(),
        request.headers()
    );

    let response = Response::from_string("hello world");
    request.respond(response);
}

速度

tiny-http的设计考虑了速度

  • 每个客户端连接将被分配到线程池中。每个线程将处理一个客户端。如果客户端连接时没有可用的线程,将创建一个新的线程。空闲时间较长的线程(目前为5秒)将自动死亡。
  • 如果来自同一客户端的多个请求正在流水线中(即多个请求被发送而不等待响应),tiny-http将一次性读取它们,并且它们将通过server.recv()全部可用。tiny-http将自动重新排列响应,以便按正确顺序发送。
  • 之前的说法有一个例外,当请求体很大(目前大于1KB)时,请求处理器会直接从流中读取请求体,而tiny-http将等待读取完成后再处理下一个请求。tiny-http永远不会等待响应请求来读取下一个请求。
  • 当客户端连接发送了它的最后一个请求(通过发送Connection: close头),线程将立即停止从这个客户端读取,并且可以被回收,即使请求还没有被回答。套接字的读取部分也将立即关闭。
  • 客户端请求的解码是懒加载的。如果您不读取请求的正文,则不会对其进行解码。

示例

tiny-http的使用示例

  • heroku-tiny-http-hello-world - 一个简单的Web应用程序,演示如何将tiny-http部署到Heroku
  • crate-deps - 一个Web服务,为crates.io上托管的crate生成依赖图图像
  • rouille - 基于tiny-http的Web框架

许可证

本项目许可在以下两者之间选择:

任选其一。

贡献

除非您明确声明,否则您提交给tiny-http的任何有意包含的贡献,根据Apache-2.0许可证定义,应如上所述双许可,不附加任何额外条款或条件。

依赖项

~2.1–3MB
~81K SLoC