From b42e35da4559137f99a027b333ba58df1dda5245 Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Wed, 26 Jul 2023 17:36:04 +0200 Subject: [PATCH] feat: return IPFS header for CDN --- src/cdn/error.rs | 3 +++ src/cdn/mod.rs | 4 +++- src/cdn/sql.rs | 11 ++++++----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cdn/error.rs b/src/cdn/error.rs index d59ea00..0442733 100644 --- a/src/cdn/error.rs +++ b/src/cdn/error.rs @@ -4,6 +4,7 @@ use axum::{ body::{Bytes, Empty}, response::IntoResponse, }; +use hyper::header::InvalidHeaderValue; use reqwest::StatusCode; use thiserror::Error; @@ -17,6 +18,8 @@ pub enum CDNError { Service(#[from] ServiceError), #[error("Decode error: {0}")] Decode(#[from] FromUtf8Error), + #[error("Header error: {0}")] + Header(#[from] InvalidHeaderValue), #[error("Internal server error")] Internal, } diff --git a/src/cdn/mod.rs b/src/cdn/mod.rs index 3654d2f..a66128c 100644 --- a/src/cdn/mod.rs +++ b/src/cdn/mod.rs @@ -7,7 +7,7 @@ use axum::{ routing::BoxRoute, Router, }; -use headers::{ContentType, HeaderMapExt}; +use headers::{ContentType, HeaderMapExt, HeaderValue}; use reqwest::{ header::{HeaderName, CONTENT_LENGTH}, StatusCode, @@ -38,6 +38,7 @@ async fn image( ) -> Result { let filename = urlencoding::decode(&filename)?.into_owned(); let cid = sql::get_cid(user, filename.clone(), &service.db_pool).await?; + let ipfs_path = format!("/ipfs/{}", cid); let res = service.ipfs_cat(cid).await?; let clength = res .headers() @@ -48,6 +49,7 @@ async fn image( let ctype = ContentType::from(new_mime_guess::from_path(filename).first_or_octet_stream()); headers.typed_insert(ctype); headers.insert(CONTENT_LENGTH, clength.clone()); + headers.insert("X-Ipfs-Path", HeaderValue::from_str(ipfs_path.as_str())?); Ok(( StatusCode::OK, diff --git a/src/cdn/sql.rs b/src/cdn/sql.rs index 6f3029f..e03f2f7 100644 --- a/src/cdn/sql.rs +++ b/src/cdn/sql.rs @@ -12,11 +12,12 @@ pub async fn get_cid(user: String, filename: String, pool: &PgPool) -> Result Result> { - let q: Vec = sqlx::query("SELECT filename FROM memes WHERE userid = $1 ORDER BY filename") - .bind(user) - .map(|row: PgRow| row.get("filename")) - .fetch_all(pool) - .await?; + let q: Vec = + sqlx::query("SELECT filename FROM memes WHERE userid = $1 ORDER BY filename") + .bind(user) + .map(|row: PgRow| row.get("filename")) + .fetch_all(pool) + .await?; Ok(q) }