From 76ad709e0afed734c4331ddb8de91745a541a67d Mon Sep 17 00:00:00 2001 From: "Adam T. Carpenter" Date: Wed, 4 Nov 2020 08:59:41 -0500 Subject: basic photo upload working completely --- dichroism/Cargo.lock | 26 +++++++++++++++++++------- dichroism/Cargo.toml | 9 +++++---- dichroism/src/handlers.rs | 14 ++++++-------- dichroism/src/main.rs | 17 ++++++++++++++--- 4 files changed, 44 insertions(+), 22 deletions(-) (limited to 'dichroism') diff --git a/dichroism/Cargo.lock b/dichroism/Cargo.lock index 06bae04..1fe4b81 100644 --- a/dichroism/Cargo.lock +++ b/dichroism/Cargo.lock @@ -35,6 +35,20 @@ dependencies = [ "trust-dns-resolver", ] +[[package]] +name = "actix-cors" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf0c4345c9663a2822d42602391418fd5766f269109ec6bf1784b056a9356a7" +dependencies = [ + "actix-web", + "derive_more", + "futures-util", + "log", + "once_cell", + "tinyvec 1.0.1", +] + [[package]] name = "actix-http" version = "2.0.0" @@ -738,6 +752,7 @@ dependencies = [ name = "dichroism" version = "0.1.0" dependencies = [ + "actix-cors", "actix-multipart", "actix-web", "async-std", @@ -830,9 +845,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +checksum = "54532e3223c5af90a6a757c90b5c5521564b07e5e7a958681bcd2afad421cdcd" dependencies = [ "atty", "humantime", @@ -1132,12 +1147,9 @@ checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" [[package]] name = "humantime" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] +checksum = "3c1ad908cc71012b7bea4d0c53ba96a8cba9962f048fa68d143376143d863b7a" [[package]] name = "idna" diff --git a/dichroism/Cargo.toml b/dichroism/Cargo.toml index 7dd6036..22b8a42 100644 --- a/dichroism/Cargo.toml +++ b/dichroism/Cargo.toml @@ -5,17 +5,18 @@ authors = ["Adam T. Carpenter "] edition = "2018" [dependencies] -actix-web = "3" +actix-cors = "0.5" actix-multipart = "0.3" -mime = "0.3" -futures = "0.3" +actix-web = "3" async-std = "1" base64 = "0.13" diesel = { version = "1", features = [ "sqlite", "r2d2" ] } -env_logger = "0.7" +env_logger = "0.8" +futures = "0.3" image = "0.23" listenfd = "0.3" log = "0.4" +mime = "0.3" once_cell = "1" regex = "1" serde = { version = "1.0", features = ["derive"] } diff --git a/dichroism/src/handlers.rs b/dichroism/src/handlers.rs index 43c11d2..ccaf347 100644 --- a/dichroism/src/handlers.rs +++ b/dichroism/src/handlers.rs @@ -106,17 +106,15 @@ async fn post_photo( ) -> Result { let mut responses: Vec = Vec::new(); - if let Ok(Some(mut field)) = payload.try_next().await { - // bail if a non-JPEG file was going to be uploaded - if field.content_type() != &mime::IMAGE_JPEG { - return Ok(HttpResponse::BadRequest().body("File must be a JPEG image.")); - } - + while let Some(mut field) = payload + .try_next() + .await + .map_err(|e| HttpResponse::BadRequest().body(e.to_string()))? + { // grab all bytes let mut data: Vec = Vec::new(); while let Some(chunk) = field.next().await { - let chunk = chunk?; - data.extend(chunk); + data.extend(chunk?); } // create new photo_set diff --git a/dichroism/src/main.rs b/dichroism/src/main.rs index 68b7091..6c76f0a 100644 --- a/dichroism/src/main.rs +++ b/dichroism/src/main.rs @@ -3,7 +3,8 @@ extern crate serde; #[macro_use] extern crate diesel; -use actix_web::{App, HttpServer}; +use actix_cors::Cors; +use actix_web::{middleware::Logger, App, HttpServer}; use config::CONFIG_INSTANCE as CONFIG; use diesel::prelude::SqliteConnection; use diesel::r2d2::ConnectionManager; @@ -25,18 +26,28 @@ mod types; #[actix_web::main] async fn main() -> Result<()> { - // Initialize DB connection pool. + // Init logging + std::env::set_var("RUST_LOG", "actix_web=info"); + env_logger::init(); + + // Init DB connection pool let manager = ConnectionManager::::new(&CONFIG.db_url); let pool = Pool::builder().build(manager)?; - // Initialize application server. + // Init application server let mut server = HttpServer::new(move || { + // Init CORS policy + let cors = Cors::permissive(); + App::new() .data(pool.clone()) + .wrap(cors) + .wrap(Logger::default()) .service(handlers::hello) .service(handlers::get_products) .service(handlers::patch_product) .service(handlers::post_product) + .service(handlers::post_photo) }); // If using listenfd, bind to it instead of the configured address to allow for cargo watch -- cgit v1.2.3