使用旧的Rust 2015
0.7.0 |
|
---|
#21 in #服务器响应
95KB
2K SLoC
tiny-http
这是一个小巧但强大的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框架
许可证
本项目许可在以下两者之间选择:
- Apache License, Version 2.0, (LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您提交给tiny-http的任何有意包含的贡献,根据Apache-2.0许可证定义,应如上所述双许可,不附加任何额外条款或条件。
依赖项
~2.1–3MB
~81K SLoC