#rocket #range-request #partial-content #rocket-rs #206

rocket_seek_stream

Rocket-rs 0.5.0-rc.3 响应器,使用实现 AsyncRead + AsyncSeek 的类型处理范围请求

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

MIT许可证

23KB
379

rocket_seek_stream

crates.io

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