From 49b79eedaa9f773e7d5963fe5422c91493939a91 Mon Sep 17 00:00:00 2001 From: MegaBrutal Date: Sat, 25 Jun 2022 12:30:00 +0200 Subject: [PATCH] Percent decode --- Cargo.lock | 16 ++++++++++++++++ Cargo.toml | 2 ++ src/main.rs | 26 ++++++++++++++++---------- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9894ebc..34a3e1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,6 +125,8 @@ version = "0.0.0" dependencies = [ "actix-web", "image", + "percent-encoding", + "serde", ] [[package]] @@ -1156,6 +1158,20 @@ name = "serde" version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "serde_json" diff --git a/Cargo.toml b/Cargo.toml index 9265f3f..dbc8a8d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,8 @@ edition = "2021" [dependencies] actix-web = "4.1.0" image = "0.24.2" +percent-encoding = "2.1.0" +serde = { version = "1.0.137", features = ["derive"] } [profile.release] lto = true diff --git a/src/main.rs b/src/main.rs index 2b8da32..d721276 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,19 @@ use std::io::Cursor; use std::fmt::Display; use std::fmt; +use serde::Deserialize; +use percent_encoding::percent_decode_str; use actix_web::{get, web, App, HttpServer, HttpResponse, Responder, ResponseError, Result}; use actix_web::body::BoxBody; use actix_web::http::StatusCode; use image::{ImageBuffer, ColorType, Rgb, RgbImage, write_buffer_with_format}; use image::ImageOutputFormat::Png; +use image::imageops::{FilterType, resize}; + +#[derive(Deserialize)] +struct Data { + data: String +} #[derive(Debug)] struct ImageError(image::ImageError); @@ -27,24 +35,22 @@ impl ResponseError for ImageError { } struct StringToRgb<'a> { - text: &'a str, iter: Box + 'a> } impl<'a> StringToRgb<'a> { fn new(text: &'a str) -> StringToRgb { - StringToRgb { text, iter: Box::new(text.chars()) } + StringToRgb { iter: Box::new(text.chars()) } } } - - impl Iterator for StringToRgb<'_> { type Item = Rgb; fn next(&mut self) -> Option> { let r = self.iter.next(); let g = self.iter.next(); let b = self.iter.next(); + println!("{:?} {:?} {:?}", r, g, b); if r.is_none() && g.is_none() && b.is_none() { None } @@ -67,19 +73,19 @@ async fn greet(name: web::Path) -> impl Responder { } #[get("/gen/{data}")] -async fn img_gen(data: web::Path) -> Result { +async fn img_gen(data: web::Path) -> Result { let mut cursor = Cursor::new(Vec::new()); - let mut img: RgbImage = ImageBuffer::new(128, 128); + let mut img: RgbImage = ImageBuffer::new(32, 32); let mut pixels = img.pixels_mut(); - //let mut rgb = Box::new(StringToRgb::new(&data)); - let mut rgb = StringToRgb::new(&data); - for sp in rgb { + for sp in StringToRgb::new(&percent_decode_str(&data.data).decode_utf8_lossy()) { let mut dp = pixels.next().unwrap(); + println!("{:?}", sp); dp.0 = sp.0; } - to_imageresult(write_buffer_with_format(&mut cursor, &img, 128, 128, ColorType::Rgb8, Png))?; + let img = resize(&img, 512, 512, FilterType::Nearest); + to_imageresult(write_buffer_with_format(&mut cursor, &img, 512, 512, ColorType::Rgb8, Png))?; Ok(HttpResponse::build(StatusCode::OK) .content_type("image/png") .body(cursor.into_inner())) -- 2.34.1