1use hyper::{Body, HeaderMap, Response, header::HeaderValue};
2use warp::{Filter, Reply, fs::{File, dir}};
3use warp_range::{filter_range, get_range_with_cb};
4
5fn callback(bytes: u64) {
6 println!("Bytes: {}", bytes);
7}
8
9fn add_headers(reply: File)->Response<Body> {
10 let mut res = reply.into_response();
11 let headers = res.headers_mut();
12 let header_map = create_headers();
13 headers.extend(header_map);
14 res
15}
16
17fn create_headers() -> HeaderMap {
18 let mut header_map = HeaderMap::new();
19 header_map.insert("Server", HeaderValue::from_str("warp-range").unwrap());
20 header_map
21}
22
23#[tokio::main]
24async fn main() {
25 let test_video = "/home/uwe/Videos/Ali.mkv";
26
27 let port = 9860;
28 println!("Running test server on http://localhost:{}", port);
29
30 let route_get_video =
31 warp::path("getvideo")
32 .and(warp::path::end())
33 .and(filter_range())
34 .and_then(move |range_header| get_range_with_cb(range_header, test_video, "video/mp4", |bytes| {
35 callback(bytes);
36 }));
37
38 let route_static = dir(".")
39 .map(add_headers);
40
41 let routes =
42 route_get_video
43 .or(route_static);
44
45 warp::serve(routes)
46 .run(([127, 0, 0, 1], port))
47 .await;
48}