diff --git a/Cargo.lock b/Cargo.lock index bffc72e..4e66bd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,15 +4,16 @@ version = 3 [[package]] name = "actix-codec" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d5dbeb2d9e51344cb83ca7cc170f1217f9fe25bfc50160e6e200b5c31c1019a" +checksum = "13895df506faee81e423febbae3a33b27fca71831b96bb3d60adf16ebcfea952" dependencies = [ "bitflags", "bytes", "futures-core", "futures-sink", "log", + "memchr", "pin-project-lite", "tokio", "tokio-util", @@ -20,14 +21,13 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.0.0-beta.10" +version = "3.0.0-beta.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd38a862fa7fead2b47ee55e550982aba583ebc7365ccf0155b49934ad6f16f9" +checksum = "6294c508c1413346857838356f53f45dbfd257ea31dca19470d9ce78750a7d37" dependencies = [ "actix-codec", "actix-rt", "actix-service", - "actix-tls", "actix-utils", "ahash", "base64", @@ -39,34 +39,29 @@ dependencies = [ "encoding_rs", "flate2", "futures-core", - "futures-util", + "futures-task", "h2", "http", "httparse", + "httpdate", "itoa", "language-tags", "local-channel", "log", "mime", - "once_cell", "percent-encoding", - "pin-project", "pin-project-lite", "rand 0.8.4", - "regex", - "serde", "sha-1", "smallvec", - "time 0.2.27", - "tokio", "zstd", ] [[package]] name = "actix-macros" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f86cd6857c135e6e9fe57b1619a88d1f94a7df34c00e11fe13e64fd3438837" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ "quote", "syn", @@ -74,9 +69,9 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.5.0-beta.2" +version = "0.5.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36b95ce0d76d1aa2f98b681702807475ade0f99bd4552546a6843a966d42ea3d" +checksum = "ddd9f117b910fbcce6e9f45092ffd4ff017785a346d09e2d4fd049f4e20384f4" dependencies = [ "bytestring", "firestorm", @@ -88,9 +83,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d7cd957c9ed92288a7c3c96af81fa5291f65247a76a34dac7b6af74e52ba0" +checksum = "05c2f80ce8d0c990941c7a7a931f69fd0701b76d521f8d36298edf59cd3fbf1f" dependencies = [ "actix-macros", "futures-core", @@ -99,18 +94,19 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.0.0-beta.5" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26369215fcc3b0176018b3b68756a8bcc275bb000e6212e454944913a1f9bf87" +checksum = "78c9b22794b8af1c2e02434873ef858f2a7db40dbbf861ce77a04cd81ac6b767" dependencies = [ "actix-rt", "actix-service", "actix-utils", "futures-core", + "futures-util", "log", - "mio", + "mio 0.8.0", "num_cpus", - "slab", + "socket2", "tokio", ] @@ -125,23 +121,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "actix-tls" -version = "3.0.0-beta.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b7bb60840962ef0332f7ea01a57d73a24d2cb663708511ff800250bbfef569" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "derive_more", - "futures-core", - "http", - "log", - "tokio-util", -] - [[package]] name = "actix-utils" version = "3.0.0" @@ -154,9 +133,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.0.0-beta.9" +version = "4.0.0-beta.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34aa2b23ec9c7c9a799b3cf9258f67c91b18ac3f0f5f484e175c7ac46739bb5" +checksum = "4609cf57246040316642d4dc4c03d7f3d4a083a892122829dbd9e6ec8db7cd67" dependencies = [ "actix-codec", "actix-http", @@ -172,7 +151,6 @@ dependencies = [ "cfg-if", "cookie", "derive_more", - "either", "encoding_rs", "futures-core", "futures-util", @@ -182,22 +160,22 @@ dependencies = [ "mime", "once_cell", "paste", - "pin-project", + "pin-project-lite", "regex", "serde", "serde_json", "serde_urlencoded", "smallvec", "socket2", - "time 0.2.27", + "time 0.3.5", "url", ] [[package]] name = "actix-web-codegen" -version = "0.5.0-beta.4" +version = "0.5.0-beta.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a11fd6f322120a74b23327e778ef0a4950b1f44a2b76468a69316a150f5c6dd" +checksum = "30a90b7f6c2fde9a1fe3df4da758c2c3c9d620dfa3eae4da0b6925dc0a13444a" dependencies = [ "actix-router", "proc-macro2", @@ -885,9 +863,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c06815895acec637cd6ed6e9662c935b866d20a106f8361892893a7d9234964" +checksum = "8f072413d126e57991455e0a922b31e4c8ba7c2ffbebf6b78b4f8521397d65cd" dependencies = [ "bytes", "fnv", @@ -1207,9 +1185,9 @@ dependencies = [ [[package]] name = "matchers" -version = "0.0.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ "regex-automata", ] @@ -1272,6 +1250,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "mio" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + [[package]] name = "miow" version = "0.3.7" @@ -2168,6 +2159,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "time" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad" +dependencies = [ + "itoa", + "libc", +] + [[package]] name = "time-macros" version = "0.1.1" @@ -2216,7 +2217,7 @@ dependencies = [ "bytes", "libc", "memchr", - "mio", + "mio 0.7.13", "num_cpus", "once_cell", "parking_lot", @@ -2294,11 +2295,12 @@ dependencies = [ [[package]] name = "tracing-actix-web" -version = "0.4.0-beta.13" +version = "0.5.0-beta.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64be7b20ed6dfa15ddd89a964f28724360f9769eee60712666f20924d9a82c35" +checksum = "940f76971e1a1ca2c64e8f915aec14acbc61a5b1c1c177dedf64eb8dd41b204d" dependencies = [ "actix-web", + "pin-project", "tracing", "tracing-futures", "uuid", @@ -2317,15 +2319,15 @@ dependencies = [ [[package]] name = "tracing-bunyan-formatter" -version = "0.2.6" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c408910c9b7eabc0215fe2b4a89f8ec95581a91cea1f7619f7c78caf14cbc2a1" +checksum = "1cb2ad6aa9b1c637d84c54db002275bbf72a7f3c6fed80f8b33f5af0c39027e9" dependencies = [ - "chrono", "gethostname", "log", "serde", "serde_json", + "time 0.3.5", "tracing", "tracing-core", "tracing-log", @@ -2362,36 +2364,22 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-serde" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" -dependencies = [ - "serde", - "tracing-core", -] - [[package]] name = "tracing-subscriber" -version = "0.2.24" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd0568dbfe3baf7048b7908d2b32bca0d81cd56bec6d2a8f894b01d74f86be3" +checksum = "d5e6136799e1079699e0d9784c883e03af55cf6a1bee48fe1d79ca552c1bc36f" dependencies = [ "ansi_term", - "chrono", "lazy_static", "matchers", "regex", - "serde", - "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", - "tracing-serde", ] [[package]] @@ -2700,8 +2688,6 @@ dependencies = [ name = "zero2prod" version = "0.1.0" dependencies = [ - "actix-http", - "actix-rt", "actix-web", "anyhow", "argon2", @@ -2737,18 +2723,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.7.0+zstd.1.4.9" +version = "0.9.1+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9428752481d8372e15b1bf779ea518a179ad6c771cca2d2c60e4fbff3cc2cd52" +checksum = "538b8347df9257b7fbce37677ef7535c00a3c7bf1f81023cc328ed7fe4b41de8" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "3.1.0+zstd.1.4.9" +version = "4.1.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa1926623ad7fe406e090555387daf73db555b948134b4d73eac5eb08fb666d" +checksum = "9fb4cfe2f6e6d35c5d27ecd9d256c4b6f7933c4895654917460ec56c29336cc1" dependencies = [ "libc", "zstd-sys", @@ -2756,9 +2742,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.5.0+zstd.1.4.9" +version = "1.6.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e6c094340240369025fc6b731b054ee2a834328fa584310ac96aa4baebdc465" +checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index db09ab2..ba99943 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,8 +13,8 @@ path = "src/main.rs" name = "zero2prod" [dependencies] -actix-http = "=3.0.0-beta.10" -actix-web = "=4.0.0-beta.9" +actix-web = "=4.0.0-beta.15" +tokio = { version = "1", features = ["macros"] } serde = "1.0.115" config = { version = "0.10.1", default-features = false, features = ["yaml"] } @@ -25,15 +25,15 @@ reqwest = { version = "0.11", default-features = false, features = ["json", "rus log = "0.4" tracing = "0.1.19" tracing-futures = "0.2.4" -tracing-subscriber = { version = "0.2.12", features = ["registry", "env-filter"] } -tracing-bunyan-formatter = "0.2.2" +tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] } +tracing-bunyan-formatter = "0.3" tracing-log = "0.1.1" thiserror = "1.0.24" serde-aux = "1.0.1" unicode-segmentation = "1.7.1" validator = "0.12.0" rand = { version = "0.8", features= ["std_rng"] } -tracing-actix-web = "0.4.0-beta.12" +tracing-actix-web = "0.5.0-beta.6" anyhow = "1.0.40" base64 = "0.13.0" argon2 = { version = "0.3", features = ["std"] } @@ -46,6 +46,4 @@ quickcheck_macros = "0.9.1" fake = "~2.3.0" wiremock = "0.5" serde_json = "1.0.61" -actix-rt = "2" -tokio = { version = "1", features = ["macros"] } linkify = "0.5.0" diff --git a/src/main.rs b/src/main.rs index a185acb..6ec5821 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ use zero2prod::configuration::get_configuration; use zero2prod::startup::Application; use zero2prod::telemetry::{get_subscriber, init_subscriber}; -#[actix_web::main] +#[tokio::main] async fn main() -> std::io::Result<()> { let subscriber = get_subscriber("zero2prod".into(), "info".into(), std::io::stdout); init_subscriber(subscriber); diff --git a/src/routes/newsletters.rs b/src/routes/newsletters.rs index fdf97be..e327bd5 100644 --- a/src/routes/newsletters.rs +++ b/src/routes/newsletters.rs @@ -2,7 +2,10 @@ use crate::domain::SubscriberEmail; use crate::email_client::EmailClient; use crate::routes::error_chain_fmt; use crate::telemetry::spawn_blocking_with_tracing; -use actix_web::http::{HeaderMap, HeaderValue, StatusCode}; +use actix_web::http::{ + header::{HeaderMap, HeaderValue}, + StatusCode, +}; use actix_web::{web, HttpResponse, ResponseError}; use anyhow::Context; use argon2::{Argon2, PasswordHash, PasswordVerifier}; diff --git a/src/telemetry.rs b/src/telemetry.rs index 2a8cb18..d8fe503 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -12,11 +12,14 @@ use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; /// /// We are using `impl Subscriber` as return type to avoid having to spell out the actual /// type of the returned subscriber, which is indeed quite complex. -pub fn get_subscriber( +pub fn get_subscriber( name: String, env_filter: String, - sink: impl MakeWriter + Send + Sync + 'static, -) -> impl Subscriber + Sync + Send { + sink: Sink, +) -> impl Subscriber + Sync + Send +where + Sink: for<'a> MakeWriter<'a> + Send + Sync + 'static, +{ let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(env_filter)); let formatting_layer = BunyanFormattingLayer::new(name, sink); diff --git a/tests/api/health_check.rs b/tests/api/health_check.rs index e0fbb4f..ca17875 100644 --- a/tests/api/health_check.rs +++ b/tests/api/health_check.rs @@ -1,6 +1,6 @@ use crate::helpers::spawn_app; -#[actix_rt::test] +#[tokio::test] async fn health_check_works() { // Arrange let app = spawn_app().await; diff --git a/tests/api/newsletter.rs b/tests/api/newsletter.rs index 344b5be..ddcd2be 100644 --- a/tests/api/newsletter.rs +++ b/tests/api/newsletter.rs @@ -128,7 +128,7 @@ async fn newsletters_returns_400_for_invalid_data() { } } -#[actix_rt::test] +#[tokio::test] async fn requests_missing_authorization_are_rejected() { // Arrange let app = spawn_app().await; @@ -154,7 +154,7 @@ async fn requests_missing_authorization_are_rejected() { ); } -#[actix_rt::test] +#[tokio::test] async fn non_existing_user_is_rejected() { // Arrange let app = spawn_app().await; @@ -184,7 +184,7 @@ async fn non_existing_user_is_rejected() { ); } -#[actix_rt::test] +#[tokio::test] async fn invalid_password_is_rejected() { // Arrange let app = spawn_app().await; diff --git a/tests/api/subscriptions.rs b/tests/api/subscriptions.rs index e588a19..f335c9a 100644 --- a/tests/api/subscriptions.rs +++ b/tests/api/subscriptions.rs @@ -2,7 +2,7 @@ use crate::helpers::spawn_app; use wiremock::matchers::{method, path}; use wiremock::{Mock, ResponseTemplate}; -#[actix_rt::test] +#[tokio::test] async fn subscribe_returns_a_200_for_valid_form_data() { // Arrange let app = spawn_app().await; @@ -21,7 +21,7 @@ async fn subscribe_returns_a_200_for_valid_form_data() { assert_eq!(200, response.status().as_u16()); } -#[actix_rt::test] +#[tokio::test] async fn subscribe_persists_the_new_subscriber() { // Arrange let app = spawn_app().await; @@ -41,7 +41,7 @@ async fn subscribe_persists_the_new_subscriber() { assert_eq!(saved.status, "pending_confirmation"); } -#[actix_rt::test] +#[tokio::test] async fn subscribe_fails_if_there_is_a_fatal_database_error() { // Arrange let app = spawn_app().await; @@ -59,7 +59,7 @@ async fn subscribe_fails_if_there_is_a_fatal_database_error() { assert_eq!(response.status().as_u16(), 500); } -#[actix_rt::test] +#[tokio::test] async fn subscribe_sends_a_confirmation_email_for_valid_data() { // Arrange let app = spawn_app().await; @@ -79,7 +79,7 @@ async fn subscribe_sends_a_confirmation_email_for_valid_data() { // Mock asserts on drop } -#[actix_rt::test] +#[tokio::test] async fn subscribe_sends_a_confirmation_email_with_a_link() { // Arrange let app = spawn_app().await; @@ -102,7 +102,7 @@ async fn subscribe_sends_a_confirmation_email_with_a_link() { assert_eq!(confirmation_links.html, confirmation_links.plain_text); } -#[actix_rt::test] +#[tokio::test] async fn subscribe_returns_a_400_when_data_is_missing() { // Arrange let app = spawn_app().await; @@ -127,7 +127,7 @@ async fn subscribe_returns_a_400_when_data_is_missing() { } } -#[actix_rt::test] +#[tokio::test] async fn subscribe_returns_a_400_when_fields_are_present_but_invalid() { // Arrange let app = spawn_app().await; diff --git a/tests/api/subscriptions_confirm.rs b/tests/api/subscriptions_confirm.rs index 7ee4e0f..cda5de1 100644 --- a/tests/api/subscriptions_confirm.rs +++ b/tests/api/subscriptions_confirm.rs @@ -2,7 +2,7 @@ use crate::helpers::spawn_app; use wiremock::matchers::{method, path}; use wiremock::{Mock, ResponseTemplate}; -#[actix_rt::test] +#[tokio::test] async fn confirmations_without_token_are_rejected_with_a_400() { // Arrange let app = spawn_app().await; @@ -16,7 +16,7 @@ async fn confirmations_without_token_are_rejected_with_a_400() { assert_eq!(response.status().as_u16(), 400); } -#[actix_rt::test] +#[tokio::test] async fn the_link_returned_by_subscribe_returns_a_200_if_called() { // Arrange let app = spawn_app().await; @@ -39,7 +39,7 @@ async fn the_link_returned_by_subscribe_returns_a_200_if_called() { assert_eq!(response.status().as_u16(), 200); } -#[actix_rt::test] +#[tokio::test] async fn clicking_on_the_confirmation_link_confirms_a_subscriber() { // Arrange let app = spawn_app().await;