diff --git a/Cargo.lock b/Cargo.lock index 287f7c6706..f170550ef0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -543,11 +543,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.3.4", "bitflags 1.3.2", "bytes", "futures-util", - "headers", "http 0.2.9", "http-body 0.4.5", "hyper 0.14.27", @@ -559,14 +558,44 @@ dependencies = [ "pin-project-lite 0.2.13", "rustversion", "serde", + "sync_wrapper 0.1.2", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +dependencies = [ + "async-trait", + "axum-core 0.4.3", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite 0.2.13", + "rustversion", + "serde", "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -586,6 +615,50 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite 0.2.13", + "rustversion", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-extra" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be6ea09c9b96cb5076af0de2e383bd2bc0c18f827cf1967bdd353e0b910d733" +dependencies = [ + "axum 0.7.5", + "axum-core 0.4.3", + "bytes", + "futures-util", + "headers", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "mime", + "pin-project-lite 0.2.13", + "serde", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -631,6 +704,12 @@ version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -2569,7 +2648,7 @@ dependencies = [ "rand 0.8.5", "rand_pcg 0.3.1", "rand_seeder", - "reqwest", + "reqwest 0.12.4", "rocket", "rocket_cors", "rocket_okapi", @@ -3203,14 +3282,14 @@ dependencies = [ [[package]] name = "headers" -version = "0.3.9" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" dependencies = [ "base64 0.21.4", "bytes", "headers-core", - "http 0.2.9", + "http 1.1.0", "httpdate", "mime", "sha1", @@ -3218,11 +3297,11 @@ dependencies = [ [[package]] name = "headers-core" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 0.2.9", + "http 1.1.0", ] [[package]] @@ -3404,9 +3483,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" +checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" [[package]] name = "httparse" @@ -3481,9 +3560,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" dependencies = [ "bytes", "futures-channel", @@ -3496,6 +3575,7 @@ dependencies = [ "pin-project-lite 0.2.13", "smallvec", "tokio", + "want", ] [[package]] @@ -3531,13 +3611,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", + "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", - "hyper 1.2.0", + "hyper 1.3.1", "pin-project-lite 0.2.13", "socket2 0.5.4", "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -3805,7 +3889,7 @@ dependencies = [ "socket2 0.5.4", "widestring", "windows-sys 0.48.0", - "winreg", + "winreg 0.50.0", ] [[package]] @@ -5077,7 +5161,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.2.2", "rand_chacha 0.3.1", - "reqwest", + "reqwest 0.12.4", "rocket", "rocket_cors", "rocket_okapi", @@ -5315,7 +5399,7 @@ dependencies = [ "gloo-timers", "http-body-util", "humantime-serde", - "hyper 1.2.0", + "hyper 1.3.1", "hyper-util", "log", "nym-bandwidth-controller", @@ -5649,7 +5733,7 @@ dependencies = [ name = "nym-exit-policy" version = "0.1.0" dependencies = [ - "reqwest", + "reqwest 0.12.4", "serde", "serde_json", "thiserror", @@ -5675,7 +5759,7 @@ version = "0.1.0" dependencies = [ "log", "nym-explorer-api-requests", - "reqwest", + "reqwest 0.12.4", "serde", "thiserror", "tokio", @@ -5810,7 +5894,7 @@ name = "nym-http-api-client" version = "0.1.0" dependencies = [ "async-trait", - "reqwest", + "reqwest 0.12.4", "serde", "serde_json", "thiserror", @@ -5823,7 +5907,7 @@ dependencies = [ name = "nym-http-api-common" version = "0.1.0" dependencies = [ - "axum", + "axum 0.7.5", "bytes", "mime", "serde", @@ -5912,7 +5996,7 @@ dependencies = [ "nym-wireguard", "nym-wireguard-types", "rand 0.8.5", - "reqwest", + "reqwest 0.12.4", "serde", "serde_json", "tap", @@ -5982,7 +6066,7 @@ name = "nym-mixnode" version = "1.1.37" dependencies = [ "anyhow", - "axum", + "axum 0.7.5", "bs58 0.5.0", "clap 4.4.7", "colored", @@ -6134,7 +6218,7 @@ dependencies = [ "publicsuffix", "rand 0.7.3", "regex", - "reqwest", + "reqwest 0.12.4", "serde", "serde_json", "sqlx", @@ -6211,12 +6295,13 @@ dependencies = [ name = "nym-node-http-api" version = "0.1.0" dependencies = [ - "axum", + "axum 0.7.5", + "axum-extra", "colored", "dashmap", "fastrand 2.0.1", + "headers", "hmac 0.12.1", - "hyper 0.14.27", "ipnetwork 0.16.0", "nym-crypto", "nym-http-api-common", @@ -6396,7 +6481,7 @@ dependencies = [ "parking_lot 0.12.1", "pretty_env_logger", "rand 0.7.3", - "reqwest", + "reqwest 0.12.4", "tap", "thiserror", "tokio", @@ -6491,7 +6576,7 @@ dependencies = [ "nym-validator-client", "pin-project", "rand 0.7.3", - "reqwest", + "reqwest 0.12.4", "schemars", "serde", "tap", @@ -6708,7 +6793,7 @@ version = "1.0.1" dependencies = [ "async-trait", "log", - "reqwest", + "reqwest 0.12.4", "serde", "serde_json", "sqlx", @@ -6797,7 +6882,7 @@ dependencies = [ "nym-mixnet-contract-common", "nym-validator-client", "nym-vesting-contract-common", - "reqwest", + "reqwest 0.12.4", "schemars", "serde", "serde_json", @@ -6847,7 +6932,7 @@ dependencies = [ "nym-service-provider-directory-common", "nym-vesting-contract-common", "prost 0.12.1", - "reqwest", + "reqwest 0.12.4", "serde", "serde_json", "sha2 0.9.9", @@ -6978,7 +7063,7 @@ dependencies = [ "nym-bin-common", "nym-config", "nym-task", - "reqwest", + "reqwest 0.12.4", "serde", "serde_json", "sha2 0.10.8", @@ -8328,6 +8413,41 @@ dependencies = [ "system-configuration", "tokio", "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite 0.2.13", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "tokio", "tokio-socks", "tokio-util", "tower-service", @@ -8336,7 +8456,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "winreg", + "winreg 0.52.0", ] [[package]] @@ -8577,9 +8697,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "6.8.1" +version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36224c3276f8c4ebc8c20f158eca7ca4359c8db89991c4925132aaaf6702661" +checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -8588,23 +8708,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "6.8.1" +version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b94b81e5b2c284684141a2fb9e2a31be90638caf040bf9afbc5a0416afe1ac" +checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "shellexpand", "syn 2.0.58", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "7.8.1" +version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74" +checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" dependencies = [ "sha2 0.10.8", "walkdir", @@ -9210,15 +9329,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shellexpand" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" -dependencies = [ - "dirs 4.0.0", -] - [[package]] name = "si-scale" version = "0.2.2" @@ -9731,6 +9841,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + [[package]] name = "synstructure" version = "0.12.6" @@ -9901,7 +10017,7 @@ dependencies = [ "getrandom 0.2.10", "peg", "pin-project", - "reqwest", + "reqwest 0.11.22", "semver 1.0.22", "serde", "serde_bytes", @@ -10263,7 +10379,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-trait", - "axum", + "axum 0.6.20", "base64 0.21.4", "bytes", "futures-core", @@ -10306,16 +10422,16 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.4.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ "bitflags 2.4.1", "bytes", - "futures-core", "futures-util", - "http 0.2.9", - "http-body 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "http-range-header", "httpdate", "mime", @@ -10813,9 +10929,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "utoipa" -version = "3.5.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82b1bc5417102a73e8464c686eef947bdfb99fcdfc0a4f228e81afa9526470a" +checksum = "272ebdfbc99111033031d2f10e018836056e4d2c8e2acda76450ec7974269fa7" dependencies = [ "indexmap 2.0.2", "serde", @@ -10825,9 +10941,9 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "3.5.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d96dcd6fc96f3df9b3280ef480770af1b7c5d14bc55192baa9b067976d920c" +checksum = "d3c9f4d08338c1bfa70dde39412a040a884c6f318b3d09aaaf3437a1e52027fc" dependencies = [ "proc-macro-error", "proc-macro2", @@ -10838,11 +10954,11 @@ dependencies = [ [[package]] name = "utoipa-swagger-ui" -version = "3.1.5" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84614caa239fb25b2bb373a52859ffd94605ceb256eeb1d63436325cf81e3653" +checksum = "0b39868d43c011961e04b41623e050aedf2cc93652562ff7935ce0f819aaf2da" dependencies = [ - "axum", + "axum 0.7.5", "mime_guess", "regex", "rust-embed", @@ -11090,9 +11206,9 @@ dependencies = [ [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -11705,6 +11821,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "with_builtin_macros" version = "0.0.3" diff --git a/Cargo.toml b/Cargo.toml index 1682869b0e..3d37445c3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -160,7 +160,8 @@ license = "Apache-2.0" [workspace.dependencies] anyhow = "1.0.71" async-trait = "0.1.68" -axum = "0.6.20" +axum = "0.7.5" +axum-extra = "0.9.3" base64 = "0.21.4" bs58 = "0.5.0" bip39 = { version = "2.0.0", features = ["zeroize"] } @@ -171,15 +172,16 @@ dotenvy = "0.15.6" futures = "0.3.28" generic-array = "0.14.7" getrandom = "0.2.10" +headers = "0.4.0" humantime-serde = "1.1.1" -hyper = "0.14.27" +hyper = "1.3.1" k256 = "0.13" lazy_static = "1.4.0" log = "0.4" once_cell = "1.7.2" parking_lot = "0.12.1" rand = "0.8.5" -reqwest = { version = "0.11.22", default-features = false } +reqwest = { version = "0.12.4", default-features = false } schemars = "0.8.1" serde = "1.0.152" serde_json = "1.0.91" @@ -193,8 +195,8 @@ tokio-tungstenite = { version = "0.20.1" } tracing = "0.1.37" tungstenite = { version = "0.20.1", default-features = false } ts-rs = "7.0.0" -utoipa = "3.5.0" -utoipa-swagger-ui = "3.1.5" +utoipa = "4.2.0" +utoipa-swagger-ui = "6.0.0" url = "2.4" zeroize = "1.6.0" diff --git a/gateway/src/http/mod.rs b/gateway/src/http/mod.rs index db15fc2a85..5b691ccf0b 100644 --- a/gateway/src/http/mod.rs +++ b/gateway/src/http/mod.rs @@ -5,7 +5,7 @@ use crate::config::Config; use crate::error::GatewayError; use crate::helpers::load_public_key; use ipnetwork::IpNetwork; -use log::{debug, warn}; +use log::{debug, error, warn}; use nym_bin_common::bin_info_owned; use nym_crypto::asymmetric::{encryption, identity}; use nym_network_requester::RequestFilter; @@ -295,12 +295,21 @@ impl<'a> HttpApiBuilder<'a> { .ok() }); + let bind_address = self.gateway_config.http.bind_address; let router = nym_node_http_api::NymNodeRouter::new(config, None, wg_state); - let server = router - .build_server(&self.gateway_config.http.bind_address)? - .with_task_client(task_client); - tokio::spawn(async move { server.run().await }); + tokio::spawn(async move { + let server = match router.build_server(&bind_address).await { + Ok(server) => server.with_task_client(task_client), + Err(err) => { + error!("failed to create http server: {err}"); + // this will cause global shutdown + drop(task_client); + return; + } + }; + server.run().await + }); Ok(()) } } diff --git a/mixnode/src/node/http/mod.rs b/mixnode/src/node/http/mod.rs index 26024574b5..4707a44f71 100644 --- a/mixnode/src/node/http/mod.rs +++ b/mixnode/src/node/http/mod.rs @@ -4,7 +4,7 @@ use crate::config::Config; use crate::error::MixnodeError; use crate::node::node_description::NodeDescription; -use log::info; +use log::{error, info}; use nym_bin_common::bin_info_owned; use nym_crypto::asymmetric::{encryption, identity}; use nym_node_http_api::api::api_requests; @@ -104,11 +104,19 @@ impl<'a> HttpApiBuilder<'a> { .with_landing_page_assets(self.mixnode_config.http.landing_page_assets_path.as_ref()); let router = nym_node_http_api::NymNodeRouter::new(config, None, None); - let server = router - // .with_merged(legacy::routes(self.legacy_mixnode, self.legacy_descriptor)) - .build_server(&bind_address)? - .with_task_client(task_client); - tokio::spawn(async move { server.run().await }); + + tokio::spawn(async move { + let server = match router.build_server(&bind_address).await { + Ok(server) => server.with_task_client(task_client), + Err(err) => { + error!("failed to create http server: {err}"); + // this will cause global shutdown + drop(task_client); + return; + } + }; + server.run().await + }); Ok(()) } } diff --git a/nym-node/nym-node-http-api/Cargo.toml b/nym-node/nym-node-http-api/Cargo.toml index a1150a0a52..1b9fb3043e 100644 --- a/nym-node/nym-node-http-api/Cargo.toml +++ b/nym-node/nym-node-http-api/Cargo.toml @@ -7,18 +7,16 @@ license.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -axum = { workspace = true, features = ["headers"] } -# \/ will be needed once we update axum to 0.7 -#axum-extra = { version = "0.9.3", features = ["typed-header"] } -#headers = "0.4" +axum.workspace = true +axum-extra = { axum.workspace = true, features = ["typed-header"] } +headers.workspace = true # useful for `#[axum_macros::debug_handler]` #axum-macros = "0.3.8" -hyper.workspace = true thiserror.workspace = true time = { workspace = true, features = ["serde"] } tokio = { workspace = true, features = ["macros"] } -tower-http = { version = "0.4.4", features = ["fs"] } +tower-http = { version = "0.5.2", features = ["fs"] } tracing.workspace = true utoipa = { workspace = true, features = ["axum_extras", "time"] } utoipa-swagger-ui = { workspace = true, features = ["axum"] } diff --git a/nym-node/nym-node-http-api/src/error.rs b/nym-node/nym-node-http-api/src/error.rs index b19b8e429b..8019c5fd58 100644 --- a/nym-node/nym-node-http-api/src/error.rs +++ b/nym-node/nym-node-http-api/src/error.rs @@ -1,6 +1,7 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::io; use std::net::SocketAddr; use thiserror::Error; @@ -9,7 +10,7 @@ pub enum NymNodeHttpError { #[error("failed to bind the HTTP API to {bind_address}: {source}")] HttpBindFailure { bind_address: SocketAddr, - source: hyper::Error, + source: io::Error, }, #[error("failed to use nym-node requests: {source}")] diff --git a/nym-node/nym-node-http-api/src/lib.rs b/nym-node/nym-node-http-api/src/lib.rs index 7c690b3ea0..2621a30eda 100644 --- a/nym-node/nym-node-http-api/src/lib.rs +++ b/nym-node/nym-node-http-api/src/lib.rs @@ -2,12 +2,13 @@ // SPDX-License-Identifier: GPL-3.0-only use axum::extract::connect_info::IntoMakeServiceWithConnectInfo; +use axum::extract::ConnectInfo; +use axum::middleware::AddExtension; +use axum::serve::Serve; use axum::Router; -use hyper::server::conn::AddrIncoming; -use hyper::Server; use nym_task::TaskClient; use std::net::SocketAddr; -use tracing::{debug, error, info}; +use tracing::{debug, error}; pub mod error; pub mod middleware; @@ -17,15 +18,18 @@ pub mod state; pub use error::NymNodeHttpError; pub use router::{api, landing_page, Config, NymNodeRouter}; +// I guess this wasn't really meant to be extracted into separate type haha +type InnerService = IntoMakeServiceWithConnectInfo; +type ConnectInfoExt = AddExtension>; +pub type ServeService = Serve; + pub struct NymNodeHTTPServer { task_client: Option, - inner: Server>, + inner: ServeService, } impl NymNodeHTTPServer { - pub(crate) fn new( - inner: Server>, - ) -> Self { + pub(crate) fn new(inner: ServeService) -> Self { NymNodeHTTPServer { task_client: None, inner, @@ -38,9 +42,7 @@ impl NymNodeHTTPServer { self } - async fn run_server_forever( - server: Server>, - ) { + async fn run_server_forever(server: ServeService) { if let Err(err) = server.await { error!("the HTTP server has terminated with the error: {err}"); } else { @@ -49,7 +51,6 @@ impl NymNodeHTTPServer { } pub async fn run(self) { - info!("Started NymNodeHTTPServer on {}", self.inner.local_addr()); if let Some(mut task_client) = self.task_client { tokio::select! { _ = task_client.recv_with_delay() => { diff --git a/nym-node/nym-node-http-api/src/middleware/logging.rs b/nym-node/nym-node-http-api/src/middleware/logging.rs index d191c6f161..ae3c5f1d4e 100644 --- a/nym-node/nym-node-http-api/src/middleware/logging.rs +++ b/nym-node/nym-node-http-api/src/middleware/logging.rs @@ -1,22 +1,24 @@ -// Copyright 2023 - Nym Technologies SA +// Copyright 2023-2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only use axum::{ - extract::ConnectInfo, - http::{HeaderValue, Request}, + extract::{ConnectInfo, Request}, + http::{ + header::{HOST, USER_AGENT}, + HeaderValue, + }, middleware::Next, response::IntoResponse, }; use colored::*; -use hyper::header::{HOST, USER_AGENT}; use std::net::SocketAddr; use tracing::info; /// Simple logger for requests -pub async fn logger( +pub async fn logger( ConnectInfo(addr): ConnectInfo, - req: Request, - next: Next, + req: Request, + next: Next, ) -> impl IntoResponse { let method = req.method().to_string().green(); let uri = req.uri().to_string().blue(); diff --git a/nym-node/nym-node-http-api/src/router/api/v1/metrics/prometheus.rs b/nym-node/nym-node-http-api/src/router/api/v1/metrics/prometheus.rs index eae64267bd..a404cb9871 100644 --- a/nym-node/nym-node-http-api/src/router/api/v1/metrics/prometheus.rs +++ b/nym-node/nym-node-http-api/src/router/api/v1/metrics/prometheus.rs @@ -3,10 +3,10 @@ use crate::state::metrics::MetricsAppState; use axum::extract::State; -use axum::headers::authorization::Bearer; -use axum::headers::Authorization; use axum::http::StatusCode; -use axum::TypedHeader; +use axum_extra::TypedHeader; +use headers::authorization::Bearer; +use headers::Authorization; use nym_metrics::metrics; /// Returns `prometheus` compatible metrics diff --git a/nym-node/nym-node-http-api/src/router/mod.rs b/nym-node/nym-node-http-api/src/router/mod.rs index 5f6819b938..67e51d73f0 100644 --- a/nym-node/nym-node-http-api/src/router/mod.rs +++ b/nym-node/nym-node-http-api/src/router/mod.rs @@ -204,19 +204,22 @@ impl NymNodeRouter { self } - pub fn build_server( + pub async fn build_server( self, bind_address: &SocketAddr, ) -> Result { - let axum_server = axum::Server::try_bind(bind_address) + let listener = tokio::net::TcpListener::bind(bind_address) + .await .map_err(|source| NymNodeHttpError::HttpBindFailure { bind_address: *bind_address, source, - })? - .serve( - self.inner - .into_make_service_with_connect_info::(), - ); + })?; + + let axum_server = axum::serve( + listener, + self.inner + .into_make_service_with_connect_info::(), + ); Ok(NymNodeHTTPServer::new(axum_server)) } diff --git a/nym-node/src/node/mod.rs b/nym-node/src/node/mod.rs index 22ea17fccd..0d7f05f1c5 100644 --- a/nym-node/src/node/mod.rs +++ b/nym-node/src/node/mod.rs @@ -455,7 +455,7 @@ impl NymNode { Ok(()) } - pub(crate) fn build_http_server(&self) -> Result { + pub(crate) async fn build_http_server(&self) -> Result { let host_details = sign_host_details( &self.config, self.x25519_sphinx_keys.public_key(), @@ -559,15 +559,23 @@ impl NymNode { .with_metrics_key(self.config.http.access_token.clone()); Ok(NymNodeRouter::new(config, Some(app_state), Some(wg_state)) - .build_server(&self.config.http.bind_address)?) + .build_server(&self.config.http.bind_address) + .await?) } pub(crate) async fn run(self) -> Result<(), NymNodeError> { let mut task_manager = TaskManager::default().named("NymNode"); let http_server = self - .build_http_server()? + .build_http_server() + .await? .with_task_client(task_manager.subscribe_named("http-server")); - tokio::spawn(async move { http_server.run().await }); + let bind_address = self.config.http.bind_address; + tokio::spawn(async move { + { + info!("Started NymNodeHTTPServer on {bind_address}"); + http_server.run().await + } + }); match self.config.mode { NodeMode::Mixnode => {