13 个版本
0.3.6 | 2022年5月2日 |
---|---|
0.3.5 | 2021年12月29日 |
0.3.4 | 2021年8月31日 |
0.3.2 | 2021年7月9日 |
0.1.2 | 2018年10月29日 |
383 在 HTTP服务器 中
83 每月下载次数
115KB
1.5K SLoC
http-serve
Rust 用于通过 hyper 0.14.x 和 tokio 服务器端编程响应 HTTP GET 和 HEAD 的辅助工具。
此 crate 提供两种响应 HTTP GET 和 HEAD 请求的方法
serve
函数可用于服务一个Entity
,这是一个表示可重用、可字节范围 HTTP 实体的 trait。《code>Entity 必须在每次调用时产生相同的数据,事先知道其大小,并能按需生成数据的一部分。streaming_body
函数可用于向一个完整响应添加正文。如果需要正文(在GET
而不是HEAD
请求中),则返回一个BodyWriter
(实现了std::io::Writer
)。调用者应生成完整的正文或调用BodyWriter::abort
,导致 HTTP 流突然终止。
它提供静态文件 Entity
实现,以及一个(目前仅限 Unix)从本地文件系统服务完整目录树的辅助工具,包括在客户端声明接受 Accept-Encoding: gzip
时自动查找以 .gz
结尾的文件。
为什么有两种方法?
它们各有优缺点。下表显示了其中的一些
serve | streaming_body | |
---|---|---|
自动字节范围服务 | 是 | 否 [1] |
背压 | 是 | 否 [2] |
条件GET | 是 | 无 [3] |
在知道长度之前发送第一个字节 | 无 | 是 |
自动gzip内容编码 | 无 [4] | 是 |
[1]: streaming_body
总是发送完整的正文。由于接口限制,使用字节范围服务没有太大意义。应用程序每次都会生成所有字节,并且http-serve
的缓冲逻辑必须很复杂才能很好地处理多个范围。
[2]: streaming_body
通常在持有锁或打开数据库事务时附加,此时不希望有回压。可以添加对“等待点”的支持,其中调用者明确希望回压。这使得它更适合大型流,甚至无限流,如Server-sent events。
[3]: streaming_body
尚不支持生成etags或遵守条件GET请求。欢迎提交PR!
[4]: serve
不会自动应用Content-Encoding: gzip
,因为内容编码是您提供的实体的属性。实体的etag、长度和字节范围边界必须与编码匹配。您可以使用http_serve::should_gzip
辅助函数来决定提供普通实体或gzip实体。当浏览器通过TE: gzip
请求时,serve
可以自动应用相关的Transfer-Encoding: gzip
,但常见浏览器已选择避免请求或处理Transfer-Encoding
。
更多信息请参阅文档。
还有一个内置的Entity
实现,ChunkedReadFile
。它从本地文件系统提供静态文件,在单独的线程池中读取块以避免阻塞tokio反应器线程。
尽管如此,您不仅限于内置的实体类型。您可以提供自己的实体,以满足您的任何需求
- 通过
include_bytes!
嵌入到二进制文件中的字节。 - 从另一个HTTP服务器或网络文件系统中检索的字节。
- 基于memcached的另一个实体的缓存。
- 对于计算etag、大小和字节范围比计算整个数据更便宜的其他任何内容。 (参见moonfire-nvr生成代表任意时间范围的
.mp4
文件的逻辑。)
http_serve::serve
类似于golang的http.ServeContent。它是从moonfire-nvr的.mp4
文件提供中提取出来的。
示例
- 提供单个文件
$ cargo run --example serve_file /usr/share/dict/words
- 提供目录树
$ cargo run --features dir --example serve_dir .
作者
有关详细信息,请参阅AUTHORS文件。
许可证
您可以选择MIT或Apache;请参阅LICENSE-MIT.txt或LICENSE-APACHE。
依赖关系
~4–6MB
~101K SLoC