#static-file #file-server #static #hyper #file #serve-static

hyper-static

Rust/Hyper的静态文件处理器,逻辑最少

8次发布

0.2.1 2023年12月30日
0.2.0 2023年12月30日
0.1.6 2022年10月30日
0.1.4 2022年4月24日

#535 in HTTP服务器


2 crates 中使用

MIT 协议

18KB
423

hyper-static - Rust/Hyper的静态文件处理器,逻辑最少

想法是拥有一个无开销的静态文件处理器。为Hyper创建任何处理函数,如果有必要返回静态文件,则向crate提供一个路径即可。

对于Hyper 0.14,使用crate版本0.1.x。

  • 使用零拷贝缓冲区服务大文件
  • 正确处理部分请求(Content-Range)
  • 处理If-Modified-Since,If-None-Match
  • crate错误可以直接转换为Hyper结果

示例

use hyper_static::{serve::static_file, Streamed};

async fn handler(req: Request<Incoming>) -> Result<Streamed, http::Error> {
    // ....
    // serve a file when necessary
    // in a simple way
    let mut path = std::path::Path::new("/path/to/files").to_owned();
    path.push(&req.uri().path()[1..]);
    return match static_file(
        &path,
        Some("application/octet-stream"), // mime type
        req.headers(),                    // hyper request header map
        65536,                            // buffer size
    )
    .await
    {
        Ok(v) => v,         // return it
        Err(e) => e.into(), // transform the error and return
    };
    //more complicated - analyze errors, e.g. log them
    match static_file(
        &path,
        Some("application/octet-stream"),
        req.headers(),
        65536,
    )
    .await
    {
        Ok(v) => {
            println!(
                r#""GET {}" {}"#,
                req.uri(),
                v.as_ref().map_or(0, |res| res.status().as_u16())
            );
            v
        }
        Err(e) => {
            let resp: Result<Streamed, http::Error> = e.into();
            eprintln!(
                r#""GET {}" {}"#,
                req.uri(),
                resp.as_ref().map_or(0, |res| res.status().as_u16())
            );
            resp
        }
    }
}

依赖项

~6.5–9.5MB
~165K SLoC