8次发布
0.2.1 | 2023年12月30日 |
---|---|
0.2.0 |
|
0.1.6 | 2022年10月30日 |
0.1.4 | 2022年4月24日 |
#535 in HTTP服务器
在 2 crates 中使用
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