From 78ef5c0630eef0bc2938f4a78c06ea913a9777ba Mon Sep 17 00:00:00 2001 From: Jason Carver Date: Mon, 14 Oct 2024 12:13:38 -0700 Subject: [PATCH 1/2] feat: add favicon.ico for browser icon While adding this, I discovered that the fallback service was overwritten by a 404 fallback, so static files were not being served correctly from the root URL: http://glados/ This 404 handler was first added in https://github.com/ethereum/glados/issues/64 but this seems to have been a mistake, since the fallback doesn't get invoked in the use case for the issue. I confirmed that 404s are still returned by a missing url like: http://glados/UNSUPPORTED_PATH --- glados-web/assets/favicon.ico | Bin 0 -> 15406 bytes glados-web/src/lib.rs | 9 --------- 2 files changed, 9 deletions(-) create mode 100644 glados-web/assets/favicon.ico diff --git a/glados-web/assets/favicon.ico b/glados-web/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..798e580cbf4fa6787ddba69e3871bb727ed9f7ad GIT binary patch literal 15406 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

mE(2fE5ga6V!<9wEmY7c;&J576r-bRH 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 literal 0 HcmV?d00001 diff --git a/glados-web/src/lib.rs b/glados-web/src/lib.rs index 2ab343d6..c9135ff5 100644 --- a/glados-web/src/lib.rs +++ b/glados-web/src/lib.rs @@ -2,7 +2,6 @@ use std::sync::Arc; use std::{net::SocketAddr, path::Path}; use anyhow::{bail, Result}; -use axum::http::{StatusCode, Uri}; use axum::{ extract::Extension, routing::{get, get_service}, @@ -101,17 +100,9 @@ pub async fn run_glados_web(config: Arc) -> Result<()> { .fallback_service(serve_dir) .layer(Extension(config)); - let app = app.fallback(handler_404); - let socket: SocketAddr = SOCKET.parse()?; info!("Serving glados-web at {}", socket); Ok(axum::Server::bind(&socket) .serve(app.into_make_service()) .await?) } - -/// Global routing error handler to prevent panics. -async fn handler_404(uri: Uri) -> StatusCode { - tracing::error!("404: Nothing to serve for '{uri}'"); - StatusCode::NOT_FOUND -} From 444447563196c9130ff4054bd1d4deda1574fa0a Mon Sep 17 00:00:00 2001 From: Jason Carver Date: Mon, 14 Oct 2024 12:58:52 -0700 Subject: [PATCH 2/2] test(web): test static file routing from root --- Cargo.lock | 104 ++++++++++++++++++++++++++++++++++++------ glados-web/Cargo.toml | 3 ++ glados-web/src/lib.rs | 65 +++++++++++++++++--------- 3 files changed, 135 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 904d307d..741c219e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -811,6 +811,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "auto-future" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1e7e457ea78e524f48639f551fd79703ac3f2237f5ecccdf4708f8a75ad373" + [[package]] name = "auto_impl" version = "1.2.0" @@ -877,6 +883,31 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-test" +version = "13.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deffdcc6ae7bc024b82f4bd3f46b048781a504588e86716a6d5ccc10b2615e99" +dependencies = [ + "anyhow", + "async-trait", + "auto-future", + "axum", + "bytes", + "cookie", + "http 0.2.12", + "hyper 0.14.28", + "pretty_assertions", + "reserve-port", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "tokio", + "tower", + "url", +] + [[package]] name = "backtrace" version = "0.3.71" @@ -1120,9 +1151,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -1347,6 +1378,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1615,6 +1656,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.9.0" @@ -2492,6 +2539,7 @@ dependencies = [ "anyhow", "askama", "axum", + "axum-test", "chrono", "clap 4.5.4", "enr", @@ -3622,13 +3670,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4106,6 +4155,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "primitive-types" version = "0.10.1" @@ -4457,6 +4516,16 @@ dependencies = [ "winreg", ] +[[package]] +name = "reserve-port" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9838134a2bfaa8e1f40738fcc972ac799de6e0e06b5157acb95fc2b05a0ea283" +dependencies = [ + "lazy_static", + "thiserror", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -5776,28 +5845,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot 0.12.2", "pin-project-lite", "signal-hook-registry", "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", @@ -5956,15 +6024,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -6711,6 +6779,12 @@ dependencies = [ "tap", ] +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "zerocopy" version = "0.7.34" diff --git a/glados-web/Cargo.toml b/glados-web/Cargo.toml index f9d95b44..8ef3e566 100644 --- a/glados-web/Cargo.toml +++ b/glados-web/Cargo.toml @@ -27,3 +27,6 @@ serde.workspace = true tokio.workspace = true tower-http = { version = "0.3.5", features = ["fs"] } tracing.workspace = true + +[dev-dependencies] +axum-test = "13.4.1" diff --git a/glados-web/src/lib.rs b/glados-web/src/lib.rs index c9135ff5..3fd174c3 100644 --- a/glados-web/src/lib.rs +++ b/glados-web/src/lib.rs @@ -24,7 +24,7 @@ const SOCKET: &str = "0.0.0.0:3001"; const ASSET_PATH_ENV_VAR: &str = "GLADOS_WEB_ASSETS_PATH"; -pub async fn run_glados_web(config: Arc) -> Result<()> { +async fn build_router(config: Arc) -> Result { let assets_path = match std::env::var(ASSET_PATH_ENV_VAR) { Ok(path) => Path::new(&path).to_path_buf(), Err(_) => { @@ -40,27 +40,8 @@ pub async fn run_glados_web(config: Arc) -> Result<()> { let serve_dir = get_service(ServeDir::new(assets_path)).handle_error(routes::handle_error); - let nodes_with_zero_high_bits = entity::node::Entity::find() - .filter(entity::node::Column::NodeIdHigh.eq(0)) - .all(&config.database_connection) - .await - .unwrap(); - - info!(rows=?nodes_with_zero_high_bits.len(), "One time migration: setting high bits for node model"); - - for node_model in nodes_with_zero_high_bits { - let raw_node_id = U256::from_be_slice(&node_model.get_node_id().raw()); - let node_id_high: i64 = raw_node_id.wrapping_shr(193).to::(); - - let mut node: entity::node::ActiveModel = node_model.into(); - let previous_value = node.node_id_high; - node.node_id_high = Set(node_id_high); - let updated = node.update(&config.database_connection).await?; - info!(row.id=?updated.id, old=?previous_value, new=?updated.node_id_high, "Setting high bits"); - } - // setup router - let app = Router::new() + Ok(Router::new() .route("/", get(routes::network_overview)) .route("/census/census-list/", get(routes::census_explorer_list)) .route("/census/", get(routes::single_census_view)) @@ -98,11 +79,51 @@ pub async fn run_glados_web(config: Arc) -> Result<()> { ) .nest_service("/static/", serve_dir.clone()) .fallback_service(serve_dir) - .layer(Extension(config)); + .layer(Extension(config))) +} +pub async fn run_glados_web(config: Arc) -> Result<()> { + let nodes_with_zero_high_bits = entity::node::Entity::find() + .filter(entity::node::Column::NodeIdHigh.eq(0)) + .all(&config.database_connection) + .await + .unwrap(); + + info!(rows=?nodes_with_zero_high_bits.len(), "One time migration: setting high bits for node model"); + + for node_model in nodes_with_zero_high_bits { + let raw_node_id = U256::from_be_slice(&node_model.get_node_id().raw()); + let node_id_high: i64 = raw_node_id.wrapping_shr(193).to::(); + + let mut node: entity::node::ActiveModel = node_model.into(); + let previous_value = node.node_id_high; + node.node_id_high = Set(node_id_high); + let updated = node.update(&config.database_connection).await?; + info!(row.id=?updated.id, old=?previous_value, new=?updated.node_id_high, "Setting high bits"); + } + + let app = build_router(config).await?; let socket: SocketAddr = SOCKET.parse()?; info!("Serving glados-web at {}", socket); Ok(axum::Server::bind(&socket) .serve(app.into_make_service()) .await?) } + +#[cfg(test)] +mod tests { + use super::*; + use axum_test::TestServer; + + #[tokio::test] + async fn test_root_routing() { + // Confirm that basic routing from the root works by loading the favicon + let config = Arc::new(State { + database_connection: Default::default(), + }); + let router = build_router(config).await.unwrap(); + let server = TestServer::new(router).unwrap(); + let response = server.get("/favicon.ico").await; + response.assert_status_ok(); + } +}