From 0b706cf8a9f463fd29ac1e6b34cfc2ef4c3f3ede Mon Sep 17 00:00:00 2001 From: Igor Novgorodov Date: Fri, 10 Jul 2026 16:06:09 +0000 Subject: [PATCH 1/3] Adapt new `ic-bn-lib` --- Cargo.lock | 731 +++++++++++++------------------------- Cargo.toml | 5 +- src/api.rs | 4 +- src/backend.rs | 12 +- src/cli.rs | 17 +- src/core.rs | 17 +- src/main.rs | 7 +- src/metrics.rs | 3 +- src/middleware/metrics.rs | 6 +- src/tls.rs | 11 +- 10 files changed, 291 insertions(+), 522 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 88d8892..edcdd12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,9 +123,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "ar_archive_writer" @@ -136,11 +136,20 @@ dependencies = [ "object", ] +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arc-swap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" dependencies = [ "rustversion", ] @@ -153,9 +162,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arrayvec" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "ascii-canvas" @@ -380,9 +389,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" dependencies = [ "aws-lc-sys", "untrusted 0.7.1", @@ -391,14 +400,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.41.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] @@ -486,23 +496,6 @@ dependencies = [ "syn 2.0.118", ] -[[package]] -name = "axum-server" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1df331683d982a0b9492b38127151e6453639cd34926eb9c07d4cd8c6d22bfc" -dependencies = [ - "bytes", - "either", - "fs-err", - "http", - "http-body", - "hyper", - "hyper-util", - "tokio", - "tower-service", -] - [[package]] name = "backoff" version = "0.4.0" @@ -701,9 +694,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "bytesize" @@ -726,9 +719,9 @@ dependencies = [ [[package]] name = "candid" -version = "0.10.29" +version = "0.10.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f781afa4a1303e3eab4ada0720a874942bcfa936ce01b816ac6378945c43a9" +checksum = "b649560badafa98cdf260958393f317c013b5aa819dba26f21cc3e26cae41dae" dependencies = [ "anyhow", "binread", @@ -749,9 +742,9 @@ dependencies = [ [[package]] name = "candid_derive" -version = "0.10.29" +version = "0.10.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6ae8e7944dd0035651bc0e7b3a3e4cb16f5fc43f8ae4fd76b36ff2cd52759f" +checksum = "8f94f9df97dd04077b5a30e82dfb5a5f2eae1a6e8c9d6a98fd24351c8a333464" dependencies = [ "lazy_static", "proc-macro2", @@ -761,9 +754,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.65" +version = "1.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" dependencies = [ "find-msvc-tools", "jobserver", @@ -796,9 +789,9 @@ dependencies = [ [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures 0.3.0", @@ -883,25 +876,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" -[[package]] -name = "cloudflare" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1678b3295890df5895480a7c080430e73df2b7101f1763f62a3b32dd532f1d37" -dependencies = [ - "chrono", - "http", - "reqwest 0.12.28", - "serde", - "serde_json", - "serde_urlencoded", - "serde_with", - "thiserror 2.0.18", - "url", - "urlencoding", - "uuid", -] - [[package]] name = "cmake" version = "0.1.58" @@ -1029,27 +1003,27 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crypto-bigint" @@ -1251,6 +1225,17 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "digest" version = "0.9.0" @@ -1315,12 +1300,6 @@ dependencies = [ "syn 2.0.118", ] -[[package]] -name = "downcast" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" - [[package]] name = "dunce" version = "1.0.5" @@ -1546,6 +1525,7 @@ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -1616,25 +1596,6 @@ dependencies = [ "num", ] -[[package]] -name = "fragile" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8878864ba14bb86e818a412bfd6f18f9eabd4ec0f008a28e8f7eb61db532fcf9" -dependencies = [ - "futures-core", -] - -[[package]] -name = "fs-err" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0" -dependencies = [ - "autocfg", - "tokio", -] - [[package]] name = "fs_extra" version = "1.3.0" @@ -1804,9 +1765,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", "rand_core 0.10.1", + "wasm-bindgen", ] [[package]] @@ -1955,7 +1918,7 @@ dependencies = [ "jni", "lru-cache", "parking_lot", - "rand 0.10.1", + "rand 0.10.2", "rustls", "rustls-pki-types", "thiserror 2.0.18", @@ -1982,7 +1945,7 @@ dependencies = [ "jni", "once_cell", "prefix-trie", - "rand 0.10.1", + "rand 0.10.2", "ring", "rustls-pki-types", "thiserror 2.0.18", @@ -2009,7 +1972,7 @@ dependencies = [ "ndk-context", "once_cell", "parking_lot", - "rand 0.10.1", + "rand 0.10.2", "resolv-conf", "rustls", "smallvec", @@ -2097,15 +2060,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ "typenum", ] @@ -2247,9 +2210,9 @@ dependencies = [ "p256", "pem", "pkcs8", - "rand 0.10.1", + "rand 0.10.2", "rangemap", - "reqwest 0.13.4", + "reqwest", "sec1", "serde", "serde_bytes", @@ -2266,14 +2229,14 @@ dependencies = [ [[package]] name = "ic-bn-lib" -version = "0.2.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3286b4c6224aa495f5e499b8535157018cbf3637aa956d3808fdb920dd6e0bb2" +checksum = "b01fd99aea535d8783406022d4f14e26ce98772c58eea2e381b1c5fc6fd7b7e0" dependencies = [ "ahash", "anyhow", "arc-swap", - "arrayvec 0.7.7", + "arrayvec 0.7.8", "async-channel 2.5.0", "async-trait", "axum", @@ -2282,8 +2245,8 @@ dependencies = [ "bytes", "candid", "chacha20poly1305", + "chrono", "clap", - "cloudflare", "derive-new", "flate2", "fqdn", @@ -2301,12 +2264,14 @@ dependencies = [ "hyper-rustls", "hyper-util", "ic-agent", - "ic-bn-lib-common", + "ic-custom-domains-canister-api", "indoc", "instant-acme", "itertools 0.14.0", "moka", "nix", + "parse-size", + "pem", "ppp", "prometheus", "prost", @@ -2314,7 +2279,7 @@ dependencies = [ "rand 0.8.6", "rcgen 0.14.8", "regex", - "reqwest 0.13.4", + "reqwest", "rustls", "rustls-acme", "rustls-pemfile", @@ -2340,11 +2305,14 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", + "tower-http 0.6.11", "tower-service", "tower_governor", "tracing", "tracing-subscriber", "url", + "utoipa", + "utoipa-swagger-ui", "uuid", "vrl", "webpki-root-certs", @@ -2353,43 +2321,6 @@ dependencies = [ "zstd", ] -[[package]] -name = "ic-bn-lib-common" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549faca5c1a58b591e4fdf7742454aede9ec6ad508761d5bb052ccebddffcd2e" -dependencies = [ - "anyhow", - "async-trait", - "axum", - "candid", - "clap", - "cloudflare", - "derive-new", - "fqdn", - "hickory-proto", - "hickory-resolver", - "http", - "humantime", - "hyper", - "hyper-util", - "ic-agent", - "instant-acme", - "parse-size", - "prometheus", - "rcgen 0.14.8", - "reqwest 0.13.4", - "rustls", - "serde", - "socket2", - "strum", - "thiserror 2.0.18", - "tokio-util", - "tower-service", - "url", - "uuid", -] - [[package]] name = "ic-certification" version = "3.2.0" @@ -2402,74 +2333,11 @@ dependencies = [ "sha2 0.10.9", ] -[[package]] -name = "ic-custom-domains-backend" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6655ea076ea14144139cc38e0a75907016bd68b9af4a795ac2e3da712bf6084" -dependencies = [ - "anyhow", - "axum", - "axum-extra", - "axum-server", - "base64", - "candid", - "chacha20poly1305", - "clap", - "derive-new", - "fqdn", - "ic-bn-lib", - "ic-bn-lib-common", - "ic-custom-domains-base", - "ic-custom-domains-canister-client", - "prometheus", - "serde", - "serde_json", - "strum", - "thiserror 2.0.18", - "tokio", - "tokio-util", - "tower-http 0.6.11", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "ic-custom-domains-base" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ce0d7b9b102d7680752d59016af984d223e6855bb185aefe3297bde5347854" -dependencies = [ - "anyhow", - "async-trait", - "axum", - "candid", - "chacha20poly1305", - "chrono", - "clap", - "derive-new", - "fqdn", - "humantime", - "ic-bn-lib", - "ic-bn-lib-common", - "ic-custom-domains-canister-api", - "mockall", - "pem", - "prometheus", - "serde", - "strum", - "thiserror 2.0.18", - "tokio", - "tokio-util", - "tracing", - "x509-parser 0.18.1", -] - [[package]] name = "ic-custom-domains-canister-api" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ce91ac62ff60b8031d2a6e9c8e3d1ea2460d0868fc6e2f45e97322a49378dc" +checksum = "2de86775118895562a2a7213de27c767c3d66237b6370e99e84727dc948b70a5" dependencies = [ "candid", "derive-new", @@ -2478,27 +2346,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "ic-custom-domains-canister-client" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c30f0ddaea8a7550f11c5e72a9dda8abd3742e08efd8f80ec95e41b33b17587" -dependencies = [ - "anyhow", - "arc-swap", - "async-trait", - "candid", - "derive-new", - "fqdn", - "ic-bn-lib", - "ic-bn-lib-common", - "ic-custom-domains-base", - "ic-custom-domains-canister-api", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "ic-ed25519" version = "0.6.0" @@ -2534,9 +2381,6 @@ dependencies = [ "http-body-util", "humantime", "ic-bn-lib", - "ic-bn-lib-common", - "ic-custom-domains-backend", - "ic-custom-domains-base", "itertools 0.15.0", "prometheus", "serde", @@ -2604,9 +2448,9 @@ dependencies = [ [[package]] name = "ic_principal" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aea751965eaf92990be8c79c64b4f3174ff22dd3604e6696a06a494afbaba2a" +checksum = "0c2732829022822ec69021c336d23b32a053e07abdd08553c71407d6e2d1675d" dependencies = [ "crc32fast", "data-encoding", @@ -2910,19 +2754,19 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.102" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", @@ -3054,9 +2898,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "libc", ] @@ -3141,9 +2985,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.8.2" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "merlin" @@ -3200,45 +3044,16 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "mockall" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58d964098a5f9c6b63d0798e5372fd04708193510a7af313c22e9f29b7b620b" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca41ce716dda6a9be188b385aa78ee5260fc25cd3802cb2a8afdc6afbe6b6dbf" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 2.0.118", -] - [[package]] name = "moka" version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ - "async-lock", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", "equivalent", - "event-listener 5.4.1", - "futures-util", "parking_lot", "portable-atomic", "smallvec", @@ -3335,9 +3150,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", @@ -3392,11 +3207,10 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -3750,32 +3564,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -[[package]] -name = "predicates" -version = "3.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" -dependencies = [ - "anstyle", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" - -[[package]] -name = "predicates-tree" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" -dependencies = [ - "predicates-core", - "termtree", -] - [[package]] name = "prefix-trie" version = "0.8.4" @@ -3936,15 +3724,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.15" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.4", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", "rustls", @@ -3958,16 +3747,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4014,11 +3803,11 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "chacha20 0.10.0", + "chacha20 0.10.1", "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -4067,6 +3856,15 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rangemap" version = "1.7.1" @@ -4166,9 +3964,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.4" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" dependencies = [ "aho-corasick", "memchr", @@ -4178,9 +3976,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db" dependencies = [ "aho-corasick", "memchr", @@ -4205,46 +4003,6 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http 0.6.11", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.8", -] - [[package]] name = "reqwest" version = "0.13.4" @@ -4275,6 +4033,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", + "serde_urlencoded", "sync_wrapper", "tokio", "tokio-rustls", @@ -4339,11 +4098,46 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust-embed" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" +dependencies = [ + "mime_guess", + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.118", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" +dependencies = [ + "sha2 0.11.0", + "walkdir", +] + [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -4387,7 +4181,6 @@ dependencies = [ "brotli-decompressor", "log", "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -4443,9 +4236,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", @@ -4492,9 +4285,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" @@ -5173,12 +4966,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "termtree" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" - [[package]] name = "thiserror" version = "1.0.69" @@ -5261,9 +5048,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.51" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", "num-conv", @@ -5281,9 +5068,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.30" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -5719,12 +5506,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -5737,6 +5518,48 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "utoipa" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bde15df68e80b16c7d16b9616e80770ad158988daa56a27dccd1e55558b0160" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_json", + "utoipa-gen", +] + +[[package]] +name = "utoipa-gen" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba0b99ee52df3028635d93840c797102da61f8a7bb3cf751032455895b52ef8" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.118", +] + +[[package]] +name = "utoipa-swagger-ui" +version = "9.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" +dependencies = [ + "axum", + "base64", + "mime_guess", + "regex", + "rust-embed", + "serde", + "serde_json", + "url", + "utoipa", + "zip", +] + [[package]] name = "uuid" version = "1.12.1" @@ -5838,9 +5661,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -5851,9 +5674,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.75" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -5861,9 +5684,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5871,9 +5694,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", @@ -5884,9 +5707,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] @@ -5906,9 +5729,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.102" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -6064,16 +5887,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -6091,31 +5905,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -6124,96 +5921,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "wit-bindgen" version = "0.57.1" @@ -6327,18 +6076,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.52" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.52" +version = "0.8.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" dependencies = [ "proc-macro2", "quote", @@ -6419,12 +6168,44 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "zip" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" +dependencies = [ + "arbitrary", + "crc32fast", + "flate2", + "indexmap 2.14.0", + "memchr", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + [[package]] name = "zstd" version = "0.13.3" diff --git a/Cargo.toml b/Cargo.toml index 56455c2..97cf50c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,15 +22,12 @@ hostname = "0.4.0" http = "1.3.1" http-body-util = "0.1.3" humantime = "2.2.0" -ic-bn-lib = { version = "0.2.1", features = [ +ic-bn-lib = { version = "0.3.1", features = [ "acme-alpn", "cert-providers", "clients-hyper", "vector", ] } -ic-bn-lib-common = "0.2.1" -ic-custom-domains-backend = "0.2" -ic-custom-domains-base = "0.2" itertools = "0.15.0" prometheus = "0.14.0" serde = "1.0" diff --git a/src/api.rs b/src/api.rs index 4819221..91dd5de 100644 --- a/src/api.rs +++ b/src/api.rs @@ -237,7 +237,7 @@ mod test { #[tokio::test] async fn test_api_auth() { - let _ = ic_bn_lib::rustls::crypto::ring::default_provider().install_default(); + let _ = ic_bn_lib::rustls::crypto::aws_lc_rs::default_provider().install_default(); let args: Vec<&str> = vec!["", "--config-path", "foo", "--api-token", "deadbeef"]; let cli = Cli::parse_from(args); @@ -301,7 +301,7 @@ mod test { #[tokio::test] async fn test_config() { - let _ = ic_bn_lib::rustls::crypto::ring::default_provider().install_default(); + let _ = ic_bn_lib::rustls::crypto::aws_lc_rs::default_provider().install_default(); let args: Vec<&str> = vec!["", "--config-path", "foo", "--api-token", "deadbeef"]; let cli = Cli::parse_from(args); diff --git a/src/backend.rs b/src/backend.rs index 36c4f6d..9af0b54 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -9,21 +9,15 @@ use axum::{body::Body, extract::Request, response::Response}; use derive_new::new; use http::{Uri, Version, uri::PathAndQuery}; use ic_bn_lib::{ - http::headers::strip_connection_headers, + http::{ClientHttp, Error as HttpError, headers::strip_connection_headers}, + tasks::Run, utils::{ + ChecksTarget, ExecutesRequest, TargetState, backend_router::BackendRouter, distributor::{self, Strategy}, health_check::{self}, }, }; -use ic_bn_lib_common::{ - traits::{ - Run, - http::ClientHttp, - utils::{ChecksTarget, ExecutesRequest}, - }, - types::{http::Error as HttpError, utils::TargetState}, -}; use itertools::Itertools; use prometheus::Registry; use serde::{Deserialize, Serialize}; diff --git a/src/cli.rs b/src/cli.rs index 3d32c89..a227def 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -5,14 +5,13 @@ use std::{net::SocketAddr, path::PathBuf, time::Duration}; use clap::{Args, Parser}; use fqdn::FQDN; use humantime::parse_duration; -use ic_bn_lib_common::{ +use ic_bn_lib::{ + custom_domains::base::cli::CustomDomainsCli, + dns::cli::DnsCli, + http::{client::cli::HttpClientCli, middleware::waf::WafCli, server::cli::HttpServerCli}, parse_size_usize, - types::{ - acme::AcmeUrl, - dns::DnsCli, - http::{HttpClientCli, HttpServerCli, WafCli}, - vector::VectorCli, - }, + tls::acme::AcmeUrl, + vector::cli::VectorCli, }; use crate::core::{AUTHOR_NAME, SERVICE_NAME}; @@ -52,7 +51,7 @@ pub struct Cli { pub dns: DnsCli, #[command(flatten, next_help_heading = "Custom Domains")] - pub custom_domains: Option, + pub custom_domains: Option, #[command(flatten, next_help_heading = "Certificates")] pub cert: Cert, @@ -65,7 +64,7 @@ pub struct Cli { #[cfg(all(target_os = "linux", feature = "sev-snp"))] #[command(flatten, next_help_heading = "SEV-SNP")] - pub sev_snp: ic_bn_lib_common::types::utils::SevSnpCli, + pub sev_snp: ic_bn_lib::utils::sev_snp::SevSnpCli, #[command(flatten, next_help_heading = "Misc")] pub misc: Misc, diff --git a/src/core.rs b/src/core.rs index afc8ee1..06b730e 100644 --- a/src/core.rs +++ b/src/core.rs @@ -3,22 +3,17 @@ use std::sync::{Arc, OnceLock}; use anyhow::{Context, Error}; use axum::{Router, body::Body}; use ic_bn_lib::{ + dns::{Options as DnsOptions, resolvers::Resolver}, http::{ - self as bnhttp, HyperClient, HyperClientLeastLoaded, ReqwestClient, ServerBuilder, dns, - middleware::waf::WafLayer, redirect_to_https, + self as bnhttp, ClientHttp, HyperClient, HyperClientLeastLoaded, ReqwestClient, + ServerBuilder, client::ClientOptions, middleware::waf::WafLayer, redirect_to_https, + server::metrics::Metrics, }, rustls, tasks::TaskManager, tls::{prepare_client_config, verify::NoopServerCertVerifier}, vector::{VectorOptions, client::Vector}, }; -use ic_bn_lib_common::{ - traits::http::ClientHttp, - types::{ - dns::Options as DnsOptions, - http::{ClientOptions, Metrics}, - }, -}; use prometheus::Registry; use tokio::{ select, @@ -48,7 +43,7 @@ pub async fn main( cli: &Cli, log_handle: Handle, ) -> Result<(), Error> { - let _ = ic_bn_lib::rustls::crypto::ring::default_provider().install_default(); + let _ = ic_bn_lib::rustls::crypto::aws_lc_rs::default_provider().install_default(); ENV.set(cli.misc.env.clone()).unwrap(); HOSTNAME.set(cli.misc.hostname.clone()).unwrap(); @@ -74,7 +69,7 @@ pub async fn main( http_client_opts.tls_config = Some(http_client_tls_config); let dns_opts: DnsOptions = (&cli.dns).into(); - let resolver = dns::Resolver::new(dns_opts).context("unable to create DNS resolver")?; + let resolver = Resolver::new(dns_opts).context("unable to create DNS resolver")?; let http_client_reqwest = Arc::new( ReqwestClient::new(http_client_opts.clone(), Some(resolver.clone())) diff --git a/src/main.rs b/src/main.rs index 5d0ff1a..2f0a915 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,11 +58,14 @@ mod test { use clap::Parser; use http::StatusCode; use ic_bn_lib::{ - http::Server, + http::{ + Server, + server::{ServerOptions, metrics::Metrics}, + }, + network::Addr, reqwest, tests::{TEST_CERT_1, TEST_KEY_1}, }; - use ic_bn_lib_common::types::http::{Addr, Metrics, ServerOptions}; use prometheus::Registry; use serde_json::json; use tempfile::tempdir; diff --git a/src/metrics.rs b/src/metrics.rs index 0c1006e..b1a1c53 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -11,8 +11,7 @@ use async_trait::async_trait; use axum::{Router, extract::State, response::IntoResponse, routing::get}; use bytes::{BufMut, Bytes, BytesMut}; use http::header::CONTENT_TYPE; -use ic_bn_lib::tasks::TaskManager; -use ic_bn_lib_common::traits::Run; +use ic_bn_lib::tasks::{Run, TaskManager}; use prometheus::{Encoder, IntGauge, Registry, TextEncoder, register_int_gauge_with_registry}; use tikv_jemalloc_ctl::{epoch, stats}; use tokio_util::sync::CancellationToken; diff --git a/src/middleware/metrics.rs b/src/middleware/metrics.rs index e93225b..6d500aa 100644 --- a/src/middleware/metrics.rs +++ b/src/middleware/metrics.rs @@ -18,10 +18,12 @@ use derive_new::new; use http::{HeaderValue, StatusCode}; use ic_bn_lib::{ dyn_event, - http::{extract_authority, headers::X_REAL_IP, http_method, http_version}, + http::{ + extract_authority, headers::X_REAL_IP, http_method, http_version, server::conn::ConnInfo, + }, + network::TlsInfo, vector::client::Vector, }; -use ic_bn_lib_common::types::http::{ConnInfo, TlsInfo}; use prometheus::{ HistogramVec, IntCounterVec, Registry, register_histogram_vec_with_registry, register_int_counter_vec_with_registry, diff --git a/src/tls.rs b/src/tls.rs index 7e8f6c5..863d26f 100644 --- a/src/tls.rs +++ b/src/tls.rs @@ -2,22 +2,21 @@ use std::sync::Arc; use anyhow::{Error, bail}; use ic_bn_lib::{ + custom_domains::base::cli::CustomDomainsCli, + dns::Options as DnsOptions, rustls::{ server::{ResolvesServerCert, ServerConfig}, version::{TLS12, TLS13}, }, tasks::TaskManager, tls::{ + ALPN_ACME, ProvidesCertificates, TlsOptions, acme::alpn::{AcmeAlpn, Opts}, prepare_server_config, providers::{self, Aggregator, storage}, resolver, }, }; -use ic_bn_lib_common::{ - traits::tls::ProvidesCertificates, - types::{dns::Options as DnsOptions, http::ALPN_ACME, tls::TlsOptions}, -}; use prometheus::Registry; use crate::{cli::Cli, core::HOSTNAME}; @@ -102,14 +101,14 @@ pub async fn setup( } async fn setup_custom_domains( - cli: &ic_custom_domains_base::cli::CustomDomainsCli, + cli: &CustomDomainsCli, dns_options: DnsOptions, metrics_registry: &Registry, tasks: &mut TaskManager, certificate_providers: &mut Vec>, ) -> Result<(), Error> { let token = tasks.token(); - let (workers, _, client) = ic_custom_domains_backend::setup( + let (workers, _, client) = ic_bn_lib::custom_domains::backend::setup( cli, dns_options, token, From 8264cce087181fbc6fa9dc0f099ee645fb122128 Mon Sep 17 00:00:00 2001 From: Igor Novgorodov Date: Tue, 14 Jul 2026 13:32:53 +0000 Subject: [PATCH 2/3] ic-bn-lib v0.4 --- Cargo.lock | 68 +++++++++++++++++++++++++------------------------- Cargo.toml | 3 ++- src/api.rs | 4 +-- src/backend.rs | 4 +-- src/cli.rs | 2 +- src/routing.rs | 2 +- 6 files changed, 42 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index edcdd12..26d375e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -504,7 +504,7 @@ checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "getrandom 0.2.17", "instant", - "rand 0.8.6", + "rand 0.8.7", ] [[package]] @@ -754,9 +754,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.66" +version = "1.2.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" +checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" dependencies = [ "find-msvc-tools", "jobserver", @@ -1789,7 +1789,7 @@ dependencies = [ "parking_lot", "portable-atomic", "quanta", - "rand 0.9.4", + "rand 0.9.5", "smallvec", "spinning_top", "web-time", @@ -2025,9 +2025,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -2035,9 +2035,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", @@ -2229,9 +2229,9 @@ dependencies = [ [[package]] name = "ic-bn-lib" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01fd99aea535d8783406022d4f14e26ce98772c58eea2e381b1c5fc6fd7b7e0" +checksum = "8b5172fe60f8ac24121193a97a05ab475f3eb8c6d0713f9dc8ccd2ef26345f88" dependencies = [ "ahash", "anyhow", @@ -2276,7 +2276,7 @@ dependencies = [ "prometheus", "prost", "prost-types", - "rand 0.8.6", + "rand 0.8.7", "rcgen 0.14.8", "regex", "reqwest", @@ -2358,7 +2358,7 @@ dependencies = [ "hkdf", "ic_principal", "pem", - "rand 0.8.6", + "rand 0.8.7", "thiserror 2.0.18", "zeroize", ] @@ -2428,7 +2428,7 @@ dependencies = [ "ic_bls12_381", "lazy_static", "pairing", - "rand 0.8.6", + "rand 0.8.7", "sha2 0.10.9", ] @@ -3035,9 +3035,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "wasi", @@ -3170,7 +3170,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.6", + "rand 0.8.7", "smallvec", "zeroize", ] @@ -3782,9 +3782,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -3793,9 +3793,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -4172,9 +4172,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.41" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "aws-lc-rs", "brotli", @@ -4672,9 +4672,9 @@ checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simd_cesu8" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" dependencies = [ "rustc_version", "simdutf8", @@ -4727,9 +4727,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -4737,9 +4737,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" [[package]] name = "spinning_top" @@ -5008,9 +5008,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -5088,9 +5088,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -6190,9 +6190,9 @@ checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zopfli" diff --git a/Cargo.toml b/Cargo.toml index 97cf50c..53ab196 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,10 +22,11 @@ hostname = "0.4.0" http = "1.3.1" http-body-util = "0.1.3" humantime = "2.2.0" -ic-bn-lib = { version = "0.3.1", features = [ +ic-bn-lib = { version = "0.4", features = [ "acme-alpn", "cert-providers", "clients-hyper", + "lb", "vector", ] } itertools = "0.15.0" diff --git a/src/api.rs b/src/api.rs index 91dd5de..ed979be 100644 --- a/src/api.rs +++ b/src/api.rs @@ -197,9 +197,9 @@ pub fn setup_api_axum_router( if cli.sev_snp.sev_snp_enable { router = router.route( "/sev-snp/report", - post(ic_bn_lib::utils::sev_snp::handler) + post(ic_bn_lib::sev_snp::handler) .with_state( - ic_bn_lib::utils::sev_snp::SevSnpState::new( + ic_bn_lib::sev_snp::SevSnpState::new( cli.sev_snp.sev_snp_cache_ttl, cli.sev_snp.sev_snp_cache_size, ) diff --git a/src/backend.rs b/src/backend.rs index 9af0b54..d15537b 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -10,13 +10,13 @@ use derive_new::new; use http::{Uri, Version, uri::PathAndQuery}; use ic_bn_lib::{ http::{ClientHttp, Error as HttpError, headers::strip_connection_headers}, - tasks::Run, - utils::{ + lb::{ ChecksTarget, ExecutesRequest, TargetState, backend_router::BackendRouter, distributor::{self, Strategy}, health_check::{self}, }, + tasks::Run, }; use itertools::Itertools; use prometheus::Registry; diff --git a/src/cli.rs b/src/cli.rs index a227def..74e104d 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -64,7 +64,7 @@ pub struct Cli { #[cfg(all(target_os = "linux", feature = "sev-snp"))] #[command(flatten, next_help_heading = "SEV-SNP")] - pub sev_snp: ic_bn_lib::utils::sev_snp::SevSnpCli, + pub sev_snp: ic_bn_lib::sev_snp::SevSnpCli, #[command(flatten, next_help_heading = "Misc")] pub misc: Misc, diff --git a/src/routing.rs b/src/routing.rs index 42839a7..20e4450 100644 --- a/src/routing.rs +++ b/src/routing.rs @@ -19,7 +19,7 @@ use ic_bn_lib::{ body::buffer_body, extract_authority, extract_host, headers::X_FORWARDED_HOST, middleware::waf::WafLayer, }, - utils::backend_router::Error as BackendRouterError, + lb::backend_router::Error as BackendRouterError, vector::client::Vector, }; use prometheus::Registry; From e413e31e425b07a4ed2b5f183fb758f95bc5825b Mon Sep 17 00:00:00 2001 From: Igor Novgorodov Date: Tue, 14 Jul 2026 13:44:58 +0000 Subject: [PATCH 3/3] Add some tests --- src/backend.rs | 164 +++++++++++++++++++++++++++++++++++ src/metrics.rs | 24 +++++ src/middleware/request_id.rs | 38 ++++++++ src/routing.rs | 108 +++++++++++++++++++++++ 4 files changed, 334 insertions(+) diff --git a/src/backend.rs b/src/backend.rs index d15537b..5a257b0 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -477,3 +477,167 @@ impl ExecutesRequest> for RequestExecutor { self.client.execute(req).await } } + +#[cfg(test)] +mod test { + use std::{net::SocketAddr, path::PathBuf}; + + use axum::Router; + use http::StatusCode; + use ic_bn_lib::http::{HyperClient, Server, server::ServerOptions}; + use tokio::net::TcpListener; + + use super::*; + + fn backend_conf(name: &str, url: &str) -> BackendConf { + BackendConf { + name: name.into(), + url: Url::parse(url).unwrap(), + enabled: true, + weight: 1, + } + } + + fn new_manager() -> BackendManager { + let client = Arc::new(HyperClient::default()); + BackendManager::new( + client, + PathBuf::new(), + Duration::from_millis(50), + Duration::from_millis(500), + &Registry::new(), + ) + } + + /// Spawns a minimal HTTP server that responds to any request (including `/health`) with 200. + async fn spawn_healthy_backend() -> SocketAddr { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + + let server = Server::new( + ic_bn_lib::network::Addr::Tcp(addr), + Router::new().fallback(async || StatusCode::OK), + ServerOptions::default(), + ic_bn_lib::http::server::metrics::Metrics::new(&Registry::new()), + None, + ); + + tokio::spawn(async move { + server + .serve_with_listener(listener.into(), CancellationToken::new()) + .await + .unwrap(); + }); + + addr + } + + #[test] + fn test_config_default() { + let cfg = Config::default(); + assert_eq!(cfg.strategy, Strategy::LeastOutstandingRequests); + assert!(cfg.backends.is_empty()); + assert!(cfg.fallback.is_none()); + } + + #[test] + fn test_backend_from_conf_builds_health_uri() { + let conf = backend_conf("foo", "http://example.com:1234/base/path"); + let backend: Backend = conf.into(); + + assert_eq!(backend.name, "foo"); + assert_eq!( + backend.uri_health.to_string(), + "http://example.com:1234/health" + ); + } + + #[tokio::test] + async fn test_set_config_rejects_duplicate_names() { + let bm = new_manager(); + + let config = Config { + strategy: Strategy::LeastOutstandingRequests, + backends: vec![backend_conf("dup", "http://127.0.0.1:1")], + fallback: Some(vec![backend_conf("dup", "http://127.0.0.1:2")]), + }; + + let err = bm.set_config(config).await.unwrap_err(); + assert!(err.to_string().contains("Non-unique")); + } + + #[tokio::test] + async fn test_set_config_empty_backends_ok() { + let bm = new_manager(); + + let config = Config { + strategy: Strategy::LeastOutstandingRequests, + backends: vec![], + fallback: None, + }; + + bm.set_config(config.clone()).await.unwrap(); + assert_eq!(bm.get_config().await, config); + assert!(bm.get_backend_router().is_none()); + assert!(bm.get_healthy_nodes().is_empty()); + } + + #[tokio::test] + async fn test_set_backend_state_not_found() { + let bm = new_manager(); + let err = bm + .set_backend_state("nonexistent".into(), true) + .await + .unwrap_err(); + assert!(err.to_string().contains("Backend not found")); + } + + #[tokio::test] + async fn test_set_backend_state_toggle() { + let bm = new_manager(); + + // Backend is disabled initially - no health check happens + let config = Config { + strategy: Strategy::LeastOutstandingRequests, + backends: vec![BackendConf { + enabled: false, + ..backend_conf("foo", "http://127.0.0.1:1") + }], + fallback: None, + }; + bm.set_config(config).await.unwrap(); + assert!(bm.get_backend_router().is_none()); + + // Enabling it triggers a health check against a closed port -> stays unhealthy + bm.set_backend_state("foo".into(), true).await.unwrap(); + assert!(bm.get_healthy_nodes().is_empty()); + assert!(bm.get_backend_router().is_none()); + + // Disabling it again removes the router entirely + bm.set_backend_state("foo".into(), false).await.unwrap(); + assert!(bm.get_backend_router().is_none()); + } + + #[tokio::test] + async fn test_get_backend_router_falls_back_when_main_unhealthy() { + let bm = new_manager(); + let healthy_addr = spawn_healthy_backend().await; + + let config = Config { + strategy: Strategy::LeastOutstandingRequests, + backends: vec![backend_conf("main", "http://127.0.0.1:1")], + fallback: Some(vec![backend_conf("fb", &format!("http://{healthy_addr}"))]), + }; + + bm.set_config(config).await.unwrap(); + + // Main backend is unreachable, so it has no healthy nodes + assert!(bm.get_healthy_nodes().is_empty()); + + // But the router falls back to the healthy fallback backend + let router = bm.get_backend_router().expect("should fall back"); + let healthy = router.get_healthy(); + assert_eq!(healthy.len(), 1); + assert_eq!(healthy[0].name, "fb"); + } +} diff --git a/src/metrics.rs b/src/metrics.rs index b1a1c53..f77dda1 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -136,3 +136,27 @@ pub fn setup(registry: &Registry, tasks: &mut TaskManager) -> Router { ) .with_state(cache) } + +#[cfg(test)] +mod test { + use http::StatusCode; + + use super::*; + + #[tokio::test] + async fn test_metrics_handler_serves_cached_snapshot() { + let registry = Registry::new(); + let cache = Arc::new(MetricsCache::new()); + let runner = MetricsRunner::new(cache.clone(), ®istry); + + runner.update().unwrap(); + + let response = handler(State(cache)).await.into_response(); + + assert_eq!(response.status(), StatusCode::OK); + assert_eq!( + response.headers().get(CONTENT_TYPE).unwrap(), + PROMETHEUS_CONTENT_TYPE + ); + } +} diff --git a/src/middleware/request_id.rs b/src/middleware/request_id.rs index 21ce0f1..378a177 100644 --- a/src/middleware/request_id.rs +++ b/src/middleware/request_id.rs @@ -31,3 +31,41 @@ pub async fn middleware(mut request: Request, next: Next) -> Response { response } + +#[cfg(test)] +mod test { + use axum::{Router, body::Body, extract::Extension, middleware::from_fn, routing::get}; + use http::StatusCode; + use http_body_util::BodyExt; + use tower::ServiceExt; + + use super::*; + + async fn echo_request_id(Extension(id): Extension) -> String { + id.to_string() + } + + #[tokio::test] + async fn test_request_id_middleware_sets_matching_header_and_extension() { + let app = Router::new() + .route("/", get(echo_request_id)) + .layer(from_fn(middleware)); + + let request = Request::builder().uri("/").body(Body::empty()).unwrap(); + let response = app.oneshot(request).await.unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + let header_id = response + .headers() + .get(X_REQUEST_ID) + .unwrap() + .to_str() + .unwrap() + .to_string(); + + let body = response.into_body().collect().await.unwrap().to_bytes(); + let body_id = String::from_utf8(body.to_vec()).unwrap(); + + assert_eq!(header_id, body_id); + } +} diff --git a/src/routing.rs b/src/routing.rs index 20e4450..43f407b 100644 --- a/src/routing.rs +++ b/src/routing.rs @@ -296,3 +296,111 @@ pub fn setup_axum_router( }) .layer(middlewares) } + +#[cfg(test)] +mod test { + use std::path::PathBuf; + + use http::header::HOST; + use ic_bn_lib::http::HyperClient; + + use super::*; + + fn new_backend_manager() -> Arc { + Arc::new(BackendManager::new( + Arc::new(HyperClient::default()), + PathBuf::new(), + Duration::from_secs(1), + Duration::from_secs(1), + &Registry::new(), + )) + } + + fn new_state(response_body_buffer: bool, response_body_size_limit: usize) -> HandlerState { + HandlerState::new( + new_backend_manager(), + false, + 1024, + Duration::from_secs(1), + response_body_buffer, + response_body_size_limit, + Duration::from_secs(1), + 1, + Duration::from_millis(1), + Duration::from_millis(1), + ) + } + + #[tokio::test] + async fn test_buffer_response_disabled_passes_through() { + let state = new_state(false, 1024); + let response = Response::new(Body::from(Bytes::from_static(b"hello"))); + + let response = buffer_response(&state, response).await; + let body = response.into_body().collect().await.unwrap().to_bytes(); + assert_eq!(&body[..], b"hello"); + } + + #[tokio::test] + async fn test_buffer_response_buffers_small_body() { + let state = new_state(true, 1024); + let response = Response::new(Body::from(Bytes::from_static(b"hello"))); + + let response = buffer_response(&state, response).await; + assert_eq!(response.status(), StatusCode::OK); + let body = response.into_body().collect().await.unwrap().to_bytes(); + assert_eq!(&body[..], b"hello"); + } + + #[tokio::test] + async fn test_buffer_response_skips_body_over_limit() { + // Body size hint (5 bytes) exceeds the configured limit (2), so it's left untouched + let state = new_state(true, 2); + let response = Response::new(Body::from(Bytes::from_static(b"hello"))); + + let response = buffer_response(&state, response).await; + let body = response.into_body().collect().await.unwrap().to_bytes(); + assert_eq!(&body[..], b"hello"); + } + + #[tokio::test] + async fn test_buffer_request_ok() { + let state = new_state(false, 1024); + let request = Request::new(Body::from(Bytes::from_static(b"payload"))); + + let (_, body) = buffer_request(&state, request).await.unwrap(); + let bytes = body.collect().await.unwrap().to_bytes(); + assert_eq!(&bytes[..], b"payload"); + } + + #[tokio::test] + async fn test_buffer_request_too_big() { + let mut state = new_state(false, 1024); + state.request_body_size_limit = 3; + let request = Request::new(Body::from(Bytes::from_static(b"payload"))); + + assert!(buffer_request(&state, request).await.is_err()); + } + + #[tokio::test] + async fn test_handler_missing_authority_returns_bad_request() { + let state = Arc::new(new_state(false, 1024)); + let request = Request::builder().uri("/").body(Body::empty()).unwrap(); + + let response = handler(State(state), request).await; + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + } + + #[tokio::test] + async fn test_handler_backend_not_ready_returns_service_unavailable() { + let state = Arc::new(new_state(false, 1024)); + let request = Request::builder() + .uri("/") + .header(HOST, "example.com") + .body(Body::empty()) + .unwrap(); + + let response = handler(State(state), request).await; + assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE); + } +}