diff --git a/ActixAPI/Cargo.lock b/ActixAPI/Cargo.lock index 3d688d4..3784675 100644 --- a/ActixAPI/Cargo.lock +++ b/ActixAPI/Cargo.lock @@ -9,6 +9,7 @@ dependencies = [ "actix-files", "actix-web", "magick_rust", + "qstring", ] [[package]] @@ -299,9 +300,9 @@ checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" [[package]] name = "bindgen" -version = "0.66.1" +version = "0.68.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" +checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078" dependencies = [ "bitflags 2.4.0", "cexpr", @@ -785,9 +786,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "magick_rust" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce666df6ace809001c625ad383f4727657c7c7881df43b3b71486e8e9f07d017" +checksum = "c912b69250bcd5d024852a1a75c567d3b5d881871a55b741018741632a921bf8" dependencies = [ "bindgen", "libc", @@ -952,6 +953,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + [[package]] name = "quote" version = "1.0.33" diff --git a/ActixAPI/Cargo.toml b/ActixAPI/Cargo.toml index 7f3cd04..776380e 100644 --- a/ActixAPI/Cargo.toml +++ b/ActixAPI/Cargo.toml @@ -8,4 +8,5 @@ edition = "2021" [dependencies] actix-web = "4" actix-files = "0.6.2" -magick_rust = "0.19.0" +magick_rust = "0.19.1" +qstring = "0.7.2" diff --git a/ActixAPI/Dockerfile b/ActixAPI/Dockerfile index dce9b80..15fc885 100644 --- a/ActixAPI/Dockerfile +++ b/ActixAPI/Dockerfile @@ -16,10 +16,19 @@ RUN cargo build --release FROM debian:bullseye-slim +ENV MAGICK_VERSION 7.1 + +RUN curl https://imagemagick.org/archive/ImageMagick.tar.gz | tar xz \ + && cd ImageMagick-${MAGICK_VERSION}* \ + && ./configure --with-magick-plus-plus=no --with-perl=no \ + && make \ + && make install \ + && cd .. \ + && rm -r ImageMagick-${MAGICK_VERSION}* + WORKDIR /app COPY --from=build-env /app/target/release . - COPY --from=build-env /app/static ./static ENTRYPOINT ["./ActixAPI"] diff --git a/ActixAPI/src/main.rs b/ActixAPI/src/main.rs index 1f93dbb..6abe78d 100644 --- a/ActixAPI/src/main.rs +++ b/ActixAPI/src/main.rs @@ -1,22 +1,13 @@ +use qstring::QString; use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder, HttpRequest, Result}; use actix_files::NamedFile; -use magick_rust::{MagickWand, ToMagick}; -use magick_rust::{self, FilterType}; +use magick_rust::MagickWand; #[get("/status/ok")] async fn hello() -> impl Responder { HttpResponse::Ok().body("{\"status\": 200}") } -#[post("/echo")] -async fn echo(req_body: String) -> impl Responder { - HttpResponse::Ok().body(req_body) -} - -async fn manual_hello() -> impl Responder { - HttpResponse::Ok().body("Hey there!") -} - async fn static_serve(req: HttpRequest) -> Result { let path: &str = req.path(); let real_path = &path[1..]; @@ -24,19 +15,39 @@ async fn static_serve(req: HttpRequest) -> Result { Ok(NamedFile::open(real_path)?) } +#[get("/image/load-small-image")] +async fn load_small_image() -> Result { + let real_path = "static/small-image.png"; + + Ok(NamedFile::open(real_path)?) +} + +#[get("/image/load-big-image")] +async fn load_big_image() -> Result { + let real_path = "static/big-image.png"; + + Ok(NamedFile::open(real_path)?) +} + #[post("/image/blur")] -async fn blur_image(image_data: web::Bytes) -> Result { +async fn blur_image(image_data: web::Bytes, req: HttpRequest) -> Result { // Load the image from the incoming bytes - let image = ToMagick::::to_magick(image_data).unwrap(); + let mut wand = MagickWand::new(); + wand.read_image_blob(&image_data).unwrap(); - // Apply a blur filter to the image - let blurred_image = image.blur(FilterType::Gaussian, 0.0).unwrap(); + let query_str = req.query_string(); + let qs = QString::from(query_str); + let radius = qs.get("radius").unwrap_or("5").parse::().unwrap_or(5.0); - // Convert the blurred image back to bytes - let blurred_image_bytes = blurred_image.to_bytes().unwrap(); + // Blur the image + wand.blur_image(radius, radius).unwrap(); + // Convert the image back to bytes + let blurred_image_bytes = wand.write_image_blob("png").unwrap(); + + // Return the blurred image bytes Ok(HttpResponse::Ok() - .content_type("image/jpeg") + .content_type("image/png") .body(blurred_image_bytes)) } @@ -48,11 +59,11 @@ async fn main() -> std::io::Result<()> { App::new() .route("/static/{filename:.*}", web::get().to(static_serve)) .service(hello) - .service(echo) + .service(load_small_image) + .service(load_big_image) .service(blur_image) - .route("/hey", web::get().to(manual_hello)) }) - .bind(("0.0.0.0", 9090))? + .bind(("0.0.0.0", 5000))? .run() .await } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index a26c77c..373409b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,7 @@ services: build: ./ActixAPI restart: always ports: - - "9083:9090" + - "9083:5000" deploy: resources: limits: