6个版本
0.2.6 | 2023年5月4日 |
---|---|
0.2.5 | 2022年8月26日 |
0.2.4 | 2021年8月3日 |
0.2.3 | 2019年9月7日 |
#47 in #rocket
23KB
379 行
rocket_seek_stream
A Rocket 响应器,用于实现 AsyncRead + AsyncSeek
特性的类型,例如文件和 rocket::futures::io::Cursor
,将以 206 部分内容响应来响应范围请求。可以通过从流的开始处取字节样本来可选地推断 Content-Type
,或手动提供。所有响应将发送 Accept-Ranges: bytes
标头来通知浏览器该资源支持范围请求。
这支持单部分和 multipart/byterange 请求。 https://tools.ietf.org/html/rfc7233
Cargo.toml
将此添加到您的依赖项中。
rocket_seek_stream = {git="https://github.com/rydz/rocket_seek_stream"}
示例
从磁盘服务文件
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
use rocket_seek_stream::SeekStream;
#[get("/")]
fn home<'a>() -> std::io::Result<SeekStream<'a>> {
SeekStream::from_path("kosmodrom.webm")
}
#[rocket::main]
async fn main() {
match rocket::build().mount("/", routes![home]).launch().await {
Ok(_) => (),
Err(e) => {
eprintln!("Rocket stopped unexpectedly. (Error {})", e);
}
};
}
服务内存缓冲区
#[get("/")]
fn cursor<'a>() -> SeekStream<'a> {
let bytes = &include_bytes!("./fly_me_to_the_moon.webm")[..];
let len = bytes.len();
let stream = std::io::Cursor::new(bytes);
SeekStream::with_opts(stream, len as u64, "video/webm")
}
使用 cargo run --example server
运行示例。运行 examples/download.sh
使用 yt-dlp 下载它所依赖的媒体。
待办事项
- 编写一些测试
我已经比较了 Golang stdlib http 路由器多部分响应的输出和我这里输出的内容,除了空白符有细微差异外,看起来几乎相同。
依赖项
~19–50MB
~849K SLoC