From 05c58f6daf2de98c1b3baec7817696ebb0aa2739 Mon Sep 17 00:00:00 2001 From: Zeragamba Date: Sun, 14 Jul 2024 17:57:36 -0400 Subject: [PATCH] handle non-text client files --- packages/og-injector-rust/Cargo.lock | 27 +++++++++++++++++++ packages/og-injector-rust/Cargo.toml | 2 ++ .../src/client/client_files.rs | 10 +++++-- packages/og-injector-rust/src/error.rs | 7 +++++ .../og-injector-rust/src/injector/router.rs | 9 +++++-- .../src/injector/router_response.rs | 8 ++++++ .../src/server_api/server_api.rs | 8 ------ 7 files changed, 59 insertions(+), 12 deletions(-) diff --git a/packages/og-injector-rust/Cargo.lock b/packages/og-injector-rust/Cargo.lock index 39b237c..d9a6723 100644 --- a/packages/og-injector-rust/Cargo.lock +++ b/packages/og-injector-rust/Cargo.lock @@ -652,6 +652,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -743,6 +753,8 @@ dependencies = [ "derive_builder", "dotenv", "iso8601", + "mime", + "mime_guess", "reqwest", "serde", "serde_json", @@ -1421,6 +1433,15 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -1502,6 +1523,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "want" version = "0.3.1" diff --git a/packages/og-injector-rust/Cargo.toml b/packages/og-injector-rust/Cargo.toml index fd716f0..b55d4c1 100644 --- a/packages/og-injector-rust/Cargo.toml +++ b/packages/og-injector-rust/Cargo.toml @@ -18,6 +18,8 @@ url = "1.7.2" uuid = { version = "1.10.0", features = ["v4", "serde"] } iso8601 = "0.6.1" derive_builder = "0.20.0" +mime_guess = "2.0.5" +mime = "0.3.17" [profile.release] panic = "abort" diff --git a/packages/og-injector-rust/src/client/client_files.rs b/packages/og-injector-rust/src/client/client_files.rs index 7bcf905..42df11a 100644 --- a/packages/og-injector-rust/src/client/client_files.rs +++ b/packages/og-injector-rust/src/client/client_files.rs @@ -8,6 +8,12 @@ pub struct ClientFiles; impl ClientFiles { pub async fn read(file: &str) -> AppResult { + let raw = Self::read_raw(file).await?; + let contents = std::str::from_utf8(&raw)?; + Ok(contents.to_string()) + } + + pub async fn read_raw(file: &str) -> AppResult> { let config = ClientConfig::new(); let file_path = config.dir.join(file); @@ -16,10 +22,10 @@ impl ClientFiles { return Err(AppError::NotFoundError(path.to_string())); } - let mut contents = String::new(); + let mut contents = vec![]; let mut file = File::open(file_path)?; - file.read_to_string(&mut contents)?; + file.read_to_end(&mut contents)?; Ok(contents) } diff --git a/packages/og-injector-rust/src/error.rs b/packages/og-injector-rust/src/error.rs index d7c4ced..f645f27 100644 --- a/packages/og-injector-rust/src/error.rs +++ b/packages/og-injector-rust/src/error.rs @@ -1,5 +1,6 @@ use std::error::Error; use std::fmt; +use std::str::Utf8Error; use axum::body::Body; use axum::http::StatusCode; @@ -69,3 +70,9 @@ impl From for AppError { AppError::new(error.to_string()) } } + +impl From for AppError { + fn from(error: Utf8Error) -> Self { + AppError::new(error.to_string()) + } +} diff --git a/packages/og-injector-rust/src/injector/router.rs b/packages/og-injector-rust/src/injector/router.rs index e342b07..cf3c573 100644 --- a/packages/og-injector-rust/src/injector/router.rs +++ b/packages/og-injector-rust/src/injector/router.rs @@ -3,6 +3,7 @@ use axum::extract::Path; use axum::http::Request; use axum::Router; use axum::routing::get; +use mime_guess::mime; use crate::client::ClientFiles; use crate::injector::{inject_default_meta, inject_post_meta, inject_tag_meta}; @@ -67,6 +68,10 @@ async fn get_fallback(req: Request) -> Result { let file_path = uri.path().strip_prefix('/').unwrap_or(""); - let body = ClientFiles::read(file_path).await?; - Ok(RouterResponse::Html(body)) + let body = ClientFiles::read_raw(file_path).await?; + let mime_type = mime_guess::from_path(uri.to_string()) + .first() + .unwrap_or(mime::APPLICATION_OCTET_STREAM); + + Ok(RouterResponse::Raw { body, mime_type }) } diff --git a/packages/og-injector-rust/src/injector/router_response.rs b/packages/og-injector-rust/src/injector/router_response.rs index c29d810..cb74323 100644 --- a/packages/og-injector-rust/src/injector/router_response.rs +++ b/packages/og-injector-rust/src/injector/router_response.rs @@ -1,9 +1,11 @@ use axum::body::Body; use axum::http::{header, StatusCode}; use axum::response::{IntoResponse, Response}; +use mime::Mime; pub enum RouterResponse { Html(String), + Raw { body: Vec, mime_type: Mime }, } impl IntoResponse for RouterResponse { @@ -15,6 +17,12 @@ impl IntoResponse for RouterResponse { .header("x-generated-by", "rust") .body(Body::from(body)) .unwrap(), + RouterResponse::Raw { body, mime_type } => Response::builder() + .status(StatusCode::OK) + .header(header::CONTENT_TYPE, mime_type.to_string()) + .header("x-generated-by", "rust") + .body(Body::from(body)) + .unwrap(), } } } diff --git a/packages/og-injector-rust/src/server_api/server_api.rs b/packages/og-injector-rust/src/server_api/server_api.rs index 45e7973..6266b9f 100644 --- a/packages/og-injector-rust/src/server_api/server_api.rs +++ b/packages/og-injector-rust/src/server_api/server_api.rs @@ -43,8 +43,6 @@ impl ServerApi { let res = self.client.get(url).send().await?; let body = res.text().await?; - println!("{}", body); - let res: GetPostRes = serde_json::from_str(&body)?; Ok(res.post) } @@ -55,8 +53,6 @@ impl ServerApi { let res = self.client.get(url).send().await?; let body = res.text().await?; - println!("{}", body); - let res: GetPostRes = serde_json::from_str(&body)?; Ok(res.post) } @@ -68,8 +64,6 @@ impl ServerApi { let res = self.client.get(url).send().await?; let body = res.text().await?; - println!("{}", body); - let res: GetTagRes = serde_json::from_str(&body)?; Ok(res.tag) } @@ -81,8 +75,6 @@ impl ServerApi { let res = self.client.get(url).send().await?; let body = res.text().await?; - println!("{}", body); - let res: GetTaggedPostsRes = serde_json::from_str(&body)?; Ok(res.posts) }