#hyper #static #http-file #file #http #web

hyper-staticfile-jsutf8

为Hyper 0.14提供静态文件服务,修复了没有正确内容类型的js响应

1个不稳定版本

0.0.1 2024年6月25日

#33#http-file

MIT 许可证

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 类型是 resolveResponseBuilder 的简单包装。你可以通过以下类似的方式进行相同的操作

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的结构体,并实现了一个产生Bytesfutures::Stream。它可以用于在自定义响应中流式传输文件。

依赖项

~5.5–7.5MB
~151K SLoC