diff --git a/license_server/src/controllers/downloads.rs b/license_server/src/controllers/downloads.rs new file mode 100644 index 0000000..62a896c --- /dev/null +++ b/license_server/src/controllers/downloads.rs @@ -0,0 +1,47 @@ +use std::path::PathBuf; + +use axum::{ + body::Body, + http::{header, StatusCode}, + response::{IntoResponse, Response}, + routing, Router, +}; +use tokio::fs::File; +use tokio_util::io::ReaderStream; + +pub struct DownloadHandler { + routes: Router, +} + +impl Into for DownloadHandler { + fn into(self) -> Router { + self.routes + } +} + +impl DownloadHandler { + pub fn init() -> Self { + let routes = Router::new().route("/package", routing::get(download_netfiler)); + + Self { routes } + } +} + +async fn download_netfiler() -> Result { + let netfilter_file_path = PathBuf::from("./netfilter.zip"); + if !netfilter_file_path.exists() { + return Err(StatusCode::NOT_FOUND); + } + let file = File::open(netfilter_file_path).await.unwrap(); + let stream = ReaderStream::new(file); + let body = Body::from_stream(stream); + let response = Response::new(body); + Ok(( + StatusCode::OK, + [( + header::CONTENT_DISPOSITION, + "attachment; filename=netfilter.zip", + )], + response, + )) +} diff --git a/license_server/src/controllers/mod.rs b/license_server/src/controllers/mod.rs index be7571c..e522197 100644 --- a/license_server/src/controllers/mod.rs +++ b/license_server/src/controllers/mod.rs @@ -1,3 +1,4 @@ +mod downloads; mod license; mod products; @@ -8,6 +9,7 @@ pub fn controllers() -> Box>> { let controllers: Vec> = vec![ Box::new(products::ProductsController::init().into()), Box::new(license::LicenseController::init().into()), + Box::new(downloads::DownloadHandler::init().into()), ]; Box::from(controllers.into_iter())