From 36ab680c563052ea38623effefd94457b0c7b09a Mon Sep 17 00:00:00 2001 From: MegaBrutal Date: Sat, 25 Jun 2022 22:45:00 +0200 Subject: [PATCH] Process raw path UTF-8 conversion corrupted the intended data. --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 49 +++++++++++++++++++++++++++---------------------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 34a3e1e..0624152 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,6 +125,7 @@ version = "0.0.0" dependencies = [ "actix-web", "image", + "num-traits", "percent-encoding", "serde", ] diff --git a/Cargo.toml b/Cargo.toml index dbc8a8d..f37ccb1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +num-traits = "0.2.15" actix-web = "4.1.0" image = "0.24.2" percent-encoding = "2.1.0" diff --git a/src/main.rs b/src/main.rs index d721276..550b458 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,17 @@ use std::io::Cursor; use std::fmt::Display; use std::fmt; -use serde::Deserialize; +use std::borrow::BorrowMut; +use num_traits::Zero; +use num_traits::cast::AsPrimitive; use percent_encoding::percent_decode_str; -use actix_web::{get, web, App, HttpServer, HttpResponse, Responder, ResponseError, Result}; +use actix_web::{get, web, App, HttpServer, HttpRequest, 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); @@ -34,28 +32,28 @@ impl ResponseError for ImageError { } } -struct StringToRgb<'a> { - iter: Box + 'a> +struct ToRgbIter<'a, T> where T: AsPrimitive { + iter: Box<&'a mut dyn Iterator> } -impl<'a> StringToRgb<'a> { - fn new(text: &'a str) -> StringToRgb { - StringToRgb { iter: Box::new(text.chars()) } +impl<'a, T: AsPrimitive> ToRgbIter<'a, T> { + fn new(data: &'a mut (dyn Iterator)) -> ToRgbIter { + ToRgbIter { iter: Box::new(data) } } } -impl Iterator for StringToRgb<'_> { +impl + Zero> Iterator for ToRgbIter<'_, T> { 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 + if let Some(r) = self.iter.next() { + let g = self.iter.next().unwrap_or(T::zero()); + let b = self.iter.next().unwrap_or(T::zero()); + println!("{} {} {}", r.as_(), g.as_(), b.as_()); + //Some(Rgb([r.unwrap_or(0) as u8, g.unwrap_or(0) as u8, b.unwrap_or(0) as u8])) + Some(Rgb([r.as_(), g.as_(), b.as_()])) } else { - Some(Rgb([r.unwrap_or('\0') as u8, g.unwrap_or('\0') as u8, b.unwrap_or('\0') as u8])) + None } } } @@ -68,23 +66,30 @@ fn to_imageresult (result: Result) -> Result) -> impl Responder { +async fn greet(name: web::Path, req: HttpRequest) -> impl Responder { + println!("{:?}", req); format!("Hello {name}!") } #[get("/gen/{data}")] -async fn img_gen(data: web::Path) -> Result { +async fn img_gen(req: HttpRequest) -> Result { let mut cursor = Cursor::new(Vec::new()); let mut img: RgbImage = ImageBuffer::new(32, 32); let mut pixels = img.pixels_mut(); + let data = req.uri().path().split("/").skip(2).next().unwrap(); + + //println!("{:#?}\n{:#?}", req.uri().path().split("/").skip(2).next(), req.match_info().get("data")); - for sp in StringToRgb::new(&percent_decode_str(&data.data).decode_utf8_lossy()) { + println!("{:?}", data); + //for sp in ToRgbIter::new(percent_decode(&RawOsString::from_string(data.into_inner()).as_raw_bytes()).into_iter().borrow_mut()) { + for sp in ToRgbIter::new(percent_decode_str(&data).into_iter().borrow_mut()) { let mut dp = pixels.next().unwrap(); println!("{:?}", sp); dp.0 = sp.0; } let img = resize(&img, 512, 512, FilterType::Nearest); + println!("Here!"); to_imageresult(write_buffer_with_format(&mut cursor, &img, 512, 512, ColorType::Rgb8, Png))?; Ok(HttpResponse::build(StatusCode::OK) .content_type("image/png") -- 2.34.1