1个不稳定版本
0.0.1 | 2024年6月25日 |
---|
#33 在 #http-file
42KB
755 行
hyper-staticfile-jsutf8
为Hyper 0.14提供静态文件服务。
文档
lib.rs
:
为Hyper 0.14提供静态文件服务。
此库导出了一个高级接口 Static
用于简单的文件服务,以及用于更多控制响应的较低级别接口。
基本用法
Static
类型本质上是一个包含一些设置的struct,以及一个用于处理请求的 serve
方法。它遵循构建器模式,并实现了 hyper::Service
特性。它可以用作
// Instance of `Static` containing configuration.
let static_ = hyper_staticfile_jsutf8::Static::new("my/doc/root/");
// A dummy request, but normally obtained from Hyper.
let request = http::Request::get("/foo/bar.txt")
.body(())
.unwrap();
// Serve the request. Returns a future for a `hyper::Response`.
let response_future = static_.serve(request);
通常,你会在某个地方存储 Static
实例,例如在你的自己的 hyper::Service
实现中。
高级用法
Static
类型是 resolve
和 ResponseBuilder
的简单包装。你可以通过以下类似的方式进行相同的操作
use std::path::Path;
#[tokio::main]
async fn main() {
// Document root path.
let root = Path::new("my/doc/root/");
// A dummy request, but normally obtained from Hyper.
let request = http::Request::get("/foo/bar.txt")
.body(())
.unwrap();
// First, resolve the request. Returns a future for a `ResolveResult`.
let result = hyper_staticfile_jsutf8::resolve(&root, &request)
.await
.unwrap();
// Then, build a response based on the result.
// The `ResponseBuilder` is typically a short-lived, per-request instance.
let response = hyper_staticfile_jsutf8::ResponseBuilder::new()
.request(&request)
.build(result)
.unwrap();
}
resolve
函数尝试在根目录中找到文件,并返回一个 ResolveResult
枚举的未来,该枚举确定应发送哪种类型的响应。然后使用 ResponseBuilder
创建默认响应。它包含一些设置,并可以使用构建器模式进行构造。
在两个步骤之间进行操作以实现自定义404页面非常有用。你的自定义逻辑可以覆盖 ResolveResult
的特定情况,并在必要时使用 ResponseBuilder
回退到默认行为。
ResponseBuilder
又使用 FileResponseBuilder
来提供找到的文件。如果你有一个现有的打开的 tokio::fs::File
并且想提供它,也可以直接使用 FileResponseBuilder
。它负责基本的头部、'未修改'响应以及在主体中流式传输文件。
最后是FileBytesStream
,它被FileResponseBuilder
用于流式传输文件。这是一个包含tokio::fs::File
的结构体,并实现了一个产生Bytes
的futures::Stream
。它可以用于在自定义响应中流式传输文件。
依赖项
~5.5–7.5MB
~151K SLoC