#range #axum #response #http #file #body #async

axum-range

为 axum 提供的 HTTP Range 响应

6 个版本 (3 个破坏性版本)

0.4.0 2023年12月29日
0.3.0 2023年9月10日
0.2.2 2023年9月10日
0.1.0 2023年9月9日

#12 in #body

Download history 29/week @ 2024-03-13 33/week @ 2024-03-20 27/week @ 2024-03-27 16/week @ 2024-04-03 13/week @ 2024-04-10 9/week @ 2024-04-17 71/week @ 2024-04-24 65/week @ 2024-05-01 19/week @ 2024-05-08 21/week @ 2024-05-15 24/week @ 2024-05-22 19/week @ 2024-05-29 29/week @ 2024-06-05 77/week @ 2024-06-12 64/week @ 2024-06-19 75/week @ 2024-06-26

每月下载量 250

MIT 许可证

23KB
391

axum-range

axum 提供的 HTTP Range 响应。

文档.

MIT 许可证。

示例用法

use axum::TypedHeader;
use axum::headers::Range;

use tokio::fs::File;

use axum_range::Ranged;
use axum_range::KnownSize;

async fn file(range: Option<TypedHeader<Range>>) -> Ranged<KnownSize<File>> {
    let file = File::open("archlinux-x86_64.iso").await.unwrap();
    let body = KnownSize::file(file).await.unwrap();
    let range = range.map(|TypedHeader(range)| range);
    Ranged::new(range, body)
}

lib.rs:

axum-range

axum 提供的 HTTP Range 响应。

完全泛型,支持任何实现 RangeBody 特性的 body。

任何同时实现 AsyncReadAsyncSeekStart 的类型都可以使用 KnownSize 适配器结构。此外,还特别支持 tokio::fs::File,请参阅 KnownSize::file 方法。

AsyncSeekStart 是此软件包定义的一个 trait,它只允许从文件开头进行搜索。任何实现 AsyncSeek 的类型都会自动实现此 trait。

use axum::Router;
use axum::routing::get;
use axum_extra::TypedHeader;
use axum_extra::headers::Range;

use tokio::fs::File;

use axum_range::Ranged;
use axum_range::KnownSize;

async fn file(range: Option<TypedHeader<Range>>) -> Ranged<KnownSize<File>> {
    let file = File::open("The Sims 1 - The Complete Collection.rar").await.unwrap();
    let body = KnownSize::file(file).await.unwrap();
    let range = range.map(|TypedHeader(range)| range);
    Ranged::new(range, body)
}

#[tokio::main]
async fn main() {
    // build our application with a single route
    let _app = Router::<()>::new().route("/", get(file));

    // run it with hyper on localhost:3000
    #[cfg(feature = "run_server_in_example")]
    axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
       .serve(_app.into_make_service())
       .await
       .unwrap();
}

依赖项

~6.5–8.5MB
~152K SLoC