axum-range 0.2.0

HTTP Range responses for axum
Documentation

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() {
// 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();
}