axum-range
HTTP range responses for axum.
Fully generic, supports any body implementing the [RangeBody] trait.
Any type implementing both [AsyncRead] and [AsyncSeekStart] can be
used the [KnownSize] adapter struct. There is also special cased support
for [tokio::fs::File], see the [KnownSize::file] method.
[AsyncSeekStart] is a trait defined by this crate which only allows
seeking from the start of a file. It is automatically implemented for any
type implementing [AsyncSeek].
use axum::{Router, TypedHeader};
use axum::headers::Range;
use axum::http::StatusCode;
use axum::routing::get;
use tokio::fs::File;
use axum_range::Ranged;
use axum_range::KnownSize;
#[axum::debug_handler]
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() {
let _app = Router::<()>::new().route("/", get(file));
#[cfg(feature = "run_server_in_example")]
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(_app.into_make_service())
.await
.unwrap();
}