2019-08-20 23:53:00 +00:00
|
|
|
#![feature(proc_macro_hygiene)]
|
2016-09-12 09:43:34 +00:00
|
|
|
|
2018-06-28 15:55:15 +00:00
|
|
|
#[macro_use] extern crate rocket;
|
2016-09-12 09:43:34 +00:00
|
|
|
|
2017-05-25 05:45:03 +00:00
|
|
|
#[cfg(test)] mod tests;
|
|
|
|
|
2016-10-25 11:03:50 +00:00
|
|
|
use rocket::response::{content, Stream};
|
2016-09-12 09:43:34 +00:00
|
|
|
|
2019-08-27 23:40:23 +00:00
|
|
|
use std::io::repeat;
|
2016-09-12 09:43:34 +00:00
|
|
|
|
2019-08-27 23:40:23 +00:00
|
|
|
use tokio::fs::File;
|
|
|
|
use futures_tokio_compat::Compat as TokioCompat;
|
|
|
|
|
|
|
|
use rocket::AsyncReadExt as _;
|
|
|
|
|
|
|
|
//type LimitedRepeat = Take<Repeat>;
|
|
|
|
type LimitedRepeat = Box<dyn futures::io::AsyncRead + Send + Unpin>;
|
2016-09-12 09:43:34 +00:00
|
|
|
|
2017-05-25 05:45:03 +00:00
|
|
|
// Generate this file using: head -c BYTES /dev/random > big_file.dat
|
2018-07-28 16:58:10 +00:00
|
|
|
const FILENAME: &str = "big_file.dat";
|
2017-05-25 05:45:03 +00:00
|
|
|
|
2016-09-12 09:43:34 +00:00
|
|
|
#[get("/")]
|
2016-10-25 11:03:50 +00:00
|
|
|
fn root() -> content::Plain<Stream<LimitedRepeat>> {
|
2019-08-27 23:40:23 +00:00
|
|
|
content::Plain(Stream::from(Box::new(repeat('a' as u8).take(25000)) as Box<_>))
|
2016-09-12 09:43:34 +00:00
|
|
|
}
|
|
|
|
|
2016-09-25 11:07:03 +00:00
|
|
|
#[get("/big_file")]
|
2019-08-27 23:40:23 +00:00
|
|
|
async fn file() -> Option<Stream<TokioCompat<File>>> {
|
|
|
|
File::open(FILENAME).await.map(|file| Stream::from(TokioCompat::new(file))).ok()
|
2016-09-25 11:07:03 +00:00
|
|
|
}
|
|
|
|
|
2017-05-25 05:45:03 +00:00
|
|
|
fn rocket() -> rocket::Rocket {
|
|
|
|
rocket::ignite().mount("/", routes![root, file])
|
|
|
|
}
|
|
|
|
|
2016-09-12 09:43:34 +00:00
|
|
|
fn main() {
|
2017-05-25 05:45:03 +00:00
|
|
|
rocket().launch();
|
2016-09-12 09:43:34 +00:00
|
|
|
}
|