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
每月下载量 250
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。
任何同时实现 AsyncRead
和 AsyncSeekStart
的类型都可以使用 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