From 916f47e2f557ceac4ae79fc3bf54578af3d20039 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 29 Sep 2024 12:01:32 +0100 Subject: [PATCH] feat(services/autumn): cors support --- Cargo.lock | 17 +++++++++++++++++ crates/services/autumn/Cargo.toml | 1 + crates/services/autumn/src/api.rs | 20 ++++++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 00c8ad7c..b126cdc0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5323,6 +5323,7 @@ dependencies = [ "strum_macros", "tempfile", "tokio 1.35.1", + "tower-http", "tracing", "tracing-subscriber", "ulid 1.1.3", @@ -7122,6 +7123,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.6.0", + "bytes 1.5.0", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "pin-project-lite 0.2.13", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.2" diff --git a/crates/services/autumn/Cargo.toml b/crates/services/autumn/Cargo.toml index 7871b10f..e45c23f0 100644 --- a/crates/services/autumn/Cargo.toml +++ b/crates/services/autumn/Cargo.toml @@ -57,6 +57,7 @@ tempfile = "3.12.0" axum-macros = "0.4.1" axum_typed_multipart = "0.12.1" axum = { version = "0.7.5", features = ["multipart"] } +tower-http = { version = "0.5.2", features = ["cors"] } # OpenAPI & documentation generation utoipa-scalar = { version = "0.1.0", features = ["axum"] } diff --git a/crates/services/autumn/src/api.rs b/crates/services/autumn/src/api.rs index 79fb413b..3c61ee90 100644 --- a/crates/services/autumn/src/api.rs +++ b/crates/services/autumn/src/api.rs @@ -5,7 +5,7 @@ use std::{ use axum::{ extract::{DefaultBodyLimit, Path, State}, - http::header, + http::{header, Method}, response::{IntoResponse, Redirect, Response}, routing::{get, post}, Json, Router, @@ -21,6 +21,7 @@ use serde::{Deserialize, Serialize}; use sha2::Digest; use tempfile::NamedTempFile; use tokio::time::Instant; +use tower_http::cors::{AllowHeaders, Any, CorsLayer}; use utoipa::ToSchema; use crate::{exif::strip_metadata, metadata::generate_metadata, mime_type::determine_mime_type}; @@ -29,16 +30,24 @@ use crate::{exif::strip_metadata, metadata::generate_metadata, mime_type::determ pub async fn router() -> Router { let config = config().await; + let cors = CorsLayer::new() + .allow_methods([Method::POST]) + .allow_headers(AllowHeaders::mirror_request()) + .allow_origin(Any); + Router::new() .route("/", get(root)) .route( "/:tag", - post(upload_file).layer(DefaultBodyLimit::max( - config.features.limits.global.body_limit_size, - )), + post(upload_file) + .options(options) + .layer(DefaultBodyLimit::max( + config.features.limits.global.body_limit_size, + )), ) .route("/:tag/:file_id", get(fetch_preview)) .route("/:tag/:file_id/:file_name", get(fetch_file)) + .layer(cors) } lazy_static! { @@ -86,6 +95,9 @@ async fn root() -> Json { }) } +/// Empty handler for OPTIONS routes +async fn options() {} + /// Available tags to upload to #[derive(Clone, Deserialize, Debug, ToSchema, strum_macros::IntoStaticStr)] #[allow(non_camel_case_types)]