From 1864c643cbffcb9f7e2d43985dc9bab61fb9bb15 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Tue, 20 Oct 2026 17:05:39 -0500 Subject: [PATCH 1/2] Bump dependencies with security advisories Lockfile-only updates to clear open RustSec advisories: - webpki-roots 1.0.10: the bundled root certificates allowed trust in distrusted emSign intermediates (RUSTSEC-2026-0381). - rustls-webpki 0.103.16: certificate verification could accept distrusted intermediates (RUSTSEC-2026-0382). - rustls 0.23.46: fixes for RUSTSEC-2026-0285, -0346, -0348 and -0349. aws-lc-rs and aws-lc-sys are updated as required. - tokio-postgres 0.7.18 and postgres-protocol 0.6.12: a malicious server could exhaust CPU with an unbounded SCRAM iteration count (RUSTSEC-2026-0179) or cause panics on malformed rows and hstore values (RUSTSEC-2026-0178, RUSTSEC-2026-0180). - h2 0.4.20: unbounded empty DATA frames (RUSTSEC-2026-0258). - bytes 1.12.1: integer overflow in BytesMut::reserve (RUSTSEC-2026-0007). - quinn-proto 0.11.19: several remote memory exhaustion and panic issues (RUSTSEC-2026-0185, -0338, -0339, -0340, -0342). - anyhow 1.0.104 and rand 0.8.8 / 0.10.3: unsoundness warnings (RUSTSEC-2026-0190, RUSTSEC-2026-0097). The new RustCrypto crates pulled in by postgres-protocol were resolved against the 1.85 MSRV, holding sha2 at 0.11.0 and ctutils at 0.4.2 since later releases require a newer compiler. Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 248 ++++++++++++++++++++++++++----------------- e2e-tests/Cargo.lock | 127 ++++++++++++---------- 2 files changed, 221 insertions(+), 154 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 049f124e..a5d1c464 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,9 +40,9 @@ checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arrayvec" @@ -75,9 +75,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.17.0" +version = "1.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "faac5829c2b74c28f830747e7818ccfb684261b5f48a1118b1e2a13d36dfab13" dependencies = [ "aws-lc-sys", "zeroize", @@ -85,14 +85,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.41.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "f1622d8446a2d4b2ce0c7eefc73dd43a99779028d5ee5c2dd8073a658ba8a2bc" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] @@ -256,7 +257,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4559bb9225f8401dcea601cf8dc9ed81ea0dadd9cf7755fdefdd93ef7961e19e" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.8", "rand_core 0.6.4", "serde", "unicode-normalization", @@ -362,22 +363,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b65c2e1ab98050c93cc9ada070d5070e014329c65196d03f6f8f1f75c2666f37" dependencies = [ "base64 0.22.1", - "rustls 0.23.42", - "rustls-webpki 0.103.13", + "rustls 0.23.46", + "rustls-webpki 0.103.16", "serde", "serde_json", "tokio", "tokio-rustls 0.26.4", - "webpki-roots 1.0.9", + "webpki-roots 1.0.10", ] [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "generic-array", + "hybrid-array", ] [[package]] @@ -394,9 +395,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] @@ -425,6 +426,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.10.1", +] + [[package]] name = "chacha20-poly1305" version = "0.1.2" @@ -506,6 +518,18 @@ dependencies = [ "cc", ] +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "core-foundation" version = "0.9.4" @@ -534,32 +558,41 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.17" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] [[package]] name = "crypto-common" -version = "0.1.7" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "generic-array", - "typenum", + "hybrid-array", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", ] [[package]] name = "digest" -version = "0.10.7" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer", + "const-oid", "crypto-common", - "subtle", + "ctutils", ] [[package]] @@ -605,7 +638,7 @@ dependencies = [ "byteorder", "libc", "log", - "rustls 0.23.42", + "rustls 0.23.46", "serde", "serde_json", "webpki-roots 0.25.4", @@ -634,7 +667,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -827,16 +860,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -857,10 +880,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +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", ] @@ -885,9 +920,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.13" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "7d29020232d6aa3fb1daca64c1127cf662cf97f254ae16c18c05b8ab635fc118" dependencies = [ "atomic-waker", "bytes", @@ -977,9 +1012,9 @@ checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" [[package]] name = "hmac" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ "digest", ] @@ -1061,6 +1096,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "0.14.32" @@ -1095,7 +1139,7 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2 0.4.13", + "h2 0.4.20", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -1131,12 +1175,12 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.42", + "rustls 0.23.46", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.9", + "webpki-roots 1.0.10", ] [[package]] @@ -1417,7 +1461,7 @@ dependencies = [ "postgres-native-tls", "prost", "rusqlite", - "rustls 0.23.42", + "rustls 0.23.46", "serde", "serde_json", "tokio", @@ -1744,9 +1788,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "md-5" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", "digest", @@ -1991,9 +2035,9 @@ dependencies = [ [[package]] name = "postgres-protocol" -version = "0.6.10" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee9dd5fe15055d2b6806f4736aa0c9637217074e224bbec46d4041b91bb9491" +checksum = "08808e3c483c46e999108051c78334f473d5adb59d78bb80a1268c7e6aa6c514" dependencies = [ "base64 0.22.1", "byteorder", @@ -2002,16 +2046,16 @@ dependencies = [ "hmac", "md-5", "memchr", - "rand 0.9.2", + "rand 0.10.3", "sha2", "stringprep", ] [[package]] name = "postgres-types" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b858f82211e84682fecd373f68e1ceae642d8d751a1ebd13f33de6257b3e20" +checksum = "851ca9db4932932d69f3ea811b1abe63087a0f740a47692619dd40d4899b68be" dependencies = [ "bytes", "fallible-iterator 0.2.0", @@ -2121,7 +2165,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.42", + "rustls 0.23.46", "socket2 0.5.10", "thiserror", "tokio", @@ -2131,17 +2175,18 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.2", + "rand 0.10.3", + "rand_pcg", "ring", "rustc-hash", - "rustls 0.23.42", + "rustls 0.23.46", "rustls-pki-types", "slab", "thiserror", @@ -2161,7 +2206,7 @@ dependencies = [ "once_cell", "socket2 0.5.10", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -2179,25 +2224,32 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "libc", - "rand_chacha 0.3.1", + "rand_chacha", "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -2210,16 +2262,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -2231,11 +2273,17 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" dependencies = [ - "getrandom 0.3.4", + "rand_core 0.10.1", ] [[package]] @@ -2337,7 +2385,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.42", + "rustls 0.23.46", "rustls-pki-types", "serde", "serde_json", @@ -2352,7 +2400,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.9", + "webpki-roots 1.0.10", ] [[package]] @@ -2412,7 +2460,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2429,16 +2477,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.42" +version = "0.23.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.13", + "rustls-webpki 0.103.16", "subtle", "zeroize", ] @@ -2474,9 +2522,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" dependencies = [ "aws-lc-rs", "ring", @@ -2528,7 +2576,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.8", "secp256k1-sys", "serde", ] @@ -2631,9 +2679,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.9" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures", @@ -2801,7 +2849,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix 1.1.2", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2898,9 +2946,9 @@ dependencies = [ [[package]] name = "tokio-postgres" -version = "0.7.16" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcea47c8f71744367793f16c2db1f11cb859d28f436bdb4ca9193eb1f787ee42" +checksum = "a528f7d280f6d5b9cd149635c8705b0dd049754bc67d81d31fa25169a93809d3" dependencies = [ "async-trait", "byteorder", @@ -2915,7 +2963,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.9.2", + "rand 0.10.3", "socket2 0.6.1", "tokio", "tokio-util", @@ -2938,7 +2986,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.42", + "rustls 0.23.46", "tokio", ] @@ -3040,7 +3088,7 @@ dependencies = [ "indexmap 1.9.3", "pin-project", "pin-project-lite", - "rand 0.8.5", + "rand 0.8.8", "slab", "tokio", "tokio-util", @@ -3215,7 +3263,7 @@ dependencies = [ "log", "prost", "prost-build", - "rand 0.8.5", + "rand 0.8.8", "serde", "serde_json", "tokio", @@ -3349,9 +3397,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +checksum = "1c1c8e20c8a38fc7d65abfe74eb7280e4aa667e8eec8bc84996d2874810748d9" dependencies = [ "rustls-pki-types", ] diff --git a/e2e-tests/Cargo.lock b/e2e-tests/Cargo.lock index 8849461f..6dce6b6d 100644 --- a/e2e-tests/Cargo.lock +++ b/e2e-tests/Cargo.lock @@ -40,9 +40,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arrayvec" @@ -75,9 +75,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.17.1" +version = "1.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" +checksum = "faac5829c2b74c28f830747e7818ccfb684261b5f48a1118b1e2a13d36dfab13" dependencies = [ "aws-lc-sys", "zeroize", @@ -85,9 +85,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.42.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" +checksum = "f1622d8446a2d4b2ce0c7eefc73dd43a99779028d5ee5c2dd8073a658ba8a2bc" dependencies = [ "cc", "cmake", @@ -218,7 +218,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4559bb9225f8401dcea601cf8dc9ed81ea0dadd9cf7755fdefdd93ef7961e19e" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.8", "rand_core 0.6.4", "serde", "unicode-normalization", @@ -310,13 +310,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b65c2e1ab98050c93cc9ada070d5070e014329c65196d03f6f8f1f75c2666f37" dependencies = [ "base64 0.22.1", - "rustls 0.23.42", - "rustls-webpki 0.103.13", + "rustls 0.23.46", + "rustls-webpki 0.103.16", "serde", "serde_json", "tokio", "tokio-rustls 0.26.4", - "webpki-roots 1.0.9", + "webpki-roots 1.0.10", ] [[package]] @@ -384,6 +384,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.10.1", +] + [[package]] name = "chacha20-poly1305" version = "0.1.2" @@ -477,6 +488,15 @@ dependencies = [ "serde_json", ] +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -549,7 +569,7 @@ dependencies = [ "byteorder", "libc", "log", - "rustls 0.23.42", + "rustls 0.23.46", "serde", "serde_json", "webpki-roots 0.25.4", @@ -796,11 +816,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi 5.3.0", "wasip2", - "wasm-bindgen", ] [[package]] @@ -810,10 +828,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 6.0.0", + "rand_core 0.10.1", "wasip2", "wasip3", + "wasm-bindgen", ] [[package]] @@ -1045,12 +1066,12 @@ dependencies = [ "http 1.4.0", "hyper 1.9.0", "hyper-util", - "rustls 0.23.42", + "rustls 0.23.46", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.9", + "webpki-roots 1.0.10", ] [[package]] @@ -1329,7 +1350,7 @@ dependencies = [ "log", "prost", "rusqlite", - "rustls 0.23.42", + "rustls 0.23.46", "serde", "serde_json", "tokio", @@ -1827,7 +1848,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.42", + "rustls 0.23.46", "socket2 0.5.10", "thiserror", "tokio", @@ -1837,17 +1858,18 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.4.2", "lru-slab", - "rand 0.9.2", + "rand 0.10.3", + "rand_pcg", "ring", "rustc-hash", - "rustls 0.23.42", + "rustls 0.23.46", "rustls-pki-types", "slab", "thiserror", @@ -1893,23 +1915,24 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "libc", - "rand_chacha 0.3.1", + "rand_chacha", "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.1", ] [[package]] @@ -1922,16 +1945,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -1943,11 +1956,17 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.5" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" dependencies = [ - "getrandom 0.3.4", + "rand_core 0.10.1", ] [[package]] @@ -2049,7 +2068,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.42", + "rustls 0.23.46", "rustls-pki-types", "serde", "serde_json", @@ -2064,7 +2083,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.9", + "webpki-roots 1.0.10", ] [[package]] @@ -2141,16 +2160,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.42" +version = "0.23.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" +checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.13", + "rustls-webpki 0.103.16", "subtle", "zeroize", ] @@ -2186,9 +2205,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" dependencies = [ "aws-lc-rs", "ring", @@ -2225,7 +2244,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.8", "secp256k1-sys", "serde", ] @@ -2536,7 +2555,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.42", + "rustls 0.23.46", "tokio", ] @@ -2696,7 +2715,7 @@ dependencies = [ "log", "prost", "prost-build", - "rand 0.8.5", + "rand 0.8.8", "serde", "serde_json", "tokio", @@ -2852,9 +2871,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +checksum = "1c1c8e20c8a38fc7d65abfe74eb7280e4aa667e8eec8bc84996d2874810748d9" dependencies = [ "rustls-pki-types", ] From a52f5d3c8395612c21fef4d36fdcfc178fd4e895 Mon Sep 17 00:00:00 2001 From: benthecarman Date: Tue, 20 Oct 2026 17:12:58 -0500 Subject: [PATCH 2/2] Move ldk-server-client to reqwest 0.12 The client still used reqwest 0.11 for unary calls and a separate hyper 0.14 / hyper-rustls 0.24 client for server streaming. That kept rustls 0.21 and rustls-webpki 0.101 in the tree, which are affected by RUSTSEC-2026-0382 (distrusted intermediates accepted) and several other advisories, plus webpki-roots 0.25 with the distrusted emSign roots from RUSTSEC-2026-0381. reqwest 0.12 exposes response bodies through http-body 1, which passes gRPC trailer frames through, so a single reqwest client now serves both unary and streaming calls and the hyper-rustls, rustls and rustls-pemfile dependencies go away. hyper is kept only for its body trait. reqwest is built with rustls-tls-manual-roots, so no bundled root store is compiled in. Previously the unary client trusted the bundled webpki roots in addition to the server certificate; now both paths trust only the server certificate, as the streaming client already did. Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 198 +++-------------------- e2e-tests/Cargo.lock | 275 +++++--------------------------- ldk-server-client/Cargo.toml | 7 +- ldk-server-client/README.md | 3 +- ldk-server-client/src/client.rs | 214 ++++++++++++------------- 5 files changed, 165 insertions(+), 532 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5d1c464..2f34d10b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -363,12 +363,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b65c2e1ab98050c93cc9ada070d5070e014329c65196d03f6f8f1f75c2666f37" dependencies = [ "base64 0.22.1", - "rustls 0.23.46", - "rustls-webpki 0.103.16", + "rustls", + "rustls-webpki", "serde", "serde_json", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "webpki-roots 1.0.10", ] @@ -530,16 +530,6 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation" version = "0.10.1" @@ -638,22 +628,13 @@ dependencies = [ "byteorder", "libc", "log", - "rustls 0.23.46", + "rustls", "serde", "serde_json", "webpki-roots 0.25.4", "winapi", ] -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -679,7 +660,7 @@ dependencies = [ "bitcoin", "hex-conservative 0.2.2", "log", - "reqwest 0.12.24", + "reqwest", "serde", "serde_json", "tokio", @@ -1152,20 +1133,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" @@ -1175,10 +1142,10 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.46", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower-service", "webpki-roots 1.0.10", ] @@ -1461,7 +1428,7 @@ dependencies = [ "postgres-native-tls", "prost", "rusqlite", - "rustls 0.23.46", + "rustls", "serde", "serde_json", "tokio", @@ -1493,7 +1460,7 @@ dependencies = [ "ring", "serde", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "toml", ] @@ -1515,14 +1482,11 @@ dependencies = [ name = "ldk-server-client" version = "0.1.0" dependencies = [ - "hyper 0.14.32", - "hyper-rustls 0.24.2", + "hyper 1.7.0", "ldk-server-grpc", "ldk-server-macaroons", "prost", - "reqwest 0.11.27", - "rustls 0.21.12", - "rustls-pemfile", + "reqwest", "serde", "tokio", "toml", @@ -2165,7 +2129,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.46", + "rustls", "socket2 0.5.10", "thiserror", "tokio", @@ -2186,7 +2150,7 @@ dependencies = [ "rand_pcg", "ring", "rustc-hash", - "rustls 0.23.46", + "rustls", "rustls-pki-types", "slab", "thiserror", @@ -2324,47 +2288,6 @@ version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.24" @@ -2374,25 +2297,26 @@ dependencies = [ "base64 0.22.1", "bytes", "futures-core", + "h2 0.4.20", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.7.0", - "hyper-rustls 0.27.7", + "hyper-rustls", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.46", + "rustls", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower 0.5.2", "tower-http", "tower-service", @@ -2463,18 +2387,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.46" @@ -2486,20 +2398,11 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.16", + "rustls-webpki", "subtle", "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pki-types" version = "1.13.0" @@ -2510,16 +2413,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "rustls-webpki" version = "0.103.16" @@ -2559,16 +2452,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "secp256k1" version = "0.29.1" @@ -2597,7 +2480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" dependencies = [ "bitflags 2.10.0", - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -2818,27 +2701,6 @@ dependencies = [ "syn 2.0.108", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tempfile" version = "3.23.0" @@ -2970,23 +2832,13 @@ dependencies = [ "whoami", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.46", + "rustls", "tokio", ] @@ -3748,16 +3600,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/e2e-tests/Cargo.lock b/e2e-tests/Cargo.lock index 6dce6b6d..69e1d49a 100644 --- a/e2e-tests/Cargo.lock +++ b/e2e-tests/Cargo.lock @@ -291,12 +291,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.11.0" @@ -315,7 +309,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "webpki-roots 1.0.10", ] @@ -428,16 +422,6 @@ dependencies = [ "cc", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -576,15 +560,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -610,7 +585,7 @@ dependencies = [ "bitcoin", "hex-conservative", "log", - "reqwest 0.12.28", + "reqwest", "serde", "serde_json", "tokio", @@ -839,16 +814,16 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.27" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +checksum = "7d29020232d6aa3fb1daca64c1127cf662cf97f254ae16c18c05b8ab635fc118" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", + "http", "indexmap", "slab", "tokio", @@ -932,17 +907,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.4.0" @@ -953,17 +917,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -971,7 +924,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.4.0", + "http", ] [[package]] @@ -982,8 +935,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -993,36 +946,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.9.0" @@ -1033,8 +956,9 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -1043,33 +967,19 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "http 1.4.0", - "hyper 1.9.0", + "http", + "hyper", "hyper-util", "rustls 0.23.46", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower-service", "webpki-roots 1.0.10", ] @@ -1084,9 +994,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "hyper 1.9.0", + "http", + "http-body", + "hyper", "ipnet", "libc", "percent-encoding", @@ -1363,14 +1273,11 @@ dependencies = [ name = "ldk-server-client" version = "0.1.0" dependencies = [ - "hyper 0.14.32", - "hyper-rustls 0.24.2", + "hyper", "ldk-server-grpc", "ldk-server-macaroons", "prost", - "reqwest 0.11.27", - "rustls 0.21.12", - "rustls-pemfile", + "reqwest", ] [[package]] @@ -1378,8 +1285,8 @@ name = "ldk-server-grpc" version = "0.1.0" dependencies = [ "bytes", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "prost", "prost-build", "serde", @@ -1418,7 +1325,7 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" dependencies = [ - "bitflags 2.11.0", + "bitflags", "libc", "plain", "redox_syscall", @@ -1615,12 +1522,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "miniscript" version = "12.3.5" @@ -1975,7 +1876,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] @@ -2007,47 +1908,6 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.28" @@ -2057,11 +1917,12 @@ dependencies = [ "base64 0.22.1", "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.9.0", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-util", "js-sys", "log", @@ -2073,9 +1934,9 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower", "tower-http", "tower-service", @@ -2106,7 +1967,7 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" dependencies = [ - "bitflags 2.11.0", + "bitflags", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -2126,7 +1987,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2139,7 +2000,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags", "errno", "libc", "linux-raw-sys 0.12.1", @@ -2174,15 +2035,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pki-types" version = "1.14.0" @@ -2397,12 +2249,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -2423,27 +2269,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tar" version = "0.4.45" @@ -2539,16 +2364,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -2582,7 +2397,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -2594,11 +2409,11 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.11.0", + "bitflags", "bytes", "futures-util", - "http 1.4.0", - "http-body 1.0.1", + "http", + "http-body", "iri-string", "pin-project-lite", "tower", @@ -2837,7 +2652,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags", "hashbrown 0.15.5", "indexmap", "semver", @@ -3211,16 +3026,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -3279,7 +3084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags", "indexmap", "log", "serde", diff --git a/ldk-server-client/Cargo.toml b/ldk-server-client/Cargo.toml index 0f8f788e..30ba06b6 100644 --- a/ldk-server-client/Cargo.toml +++ b/ldk-server-client/Cargo.toml @@ -20,12 +20,9 @@ serde = ["dep:serde", "dep:toml", "ldk-server-grpc/serde"] [dependencies] ldk-server-grpc = { path = "../ldk-server-grpc" } ldk-server-macaroons = { path = "../ldk-server-macaroons" } -reqwest = { version = "0.11.13", default-features = false, features = ["rustls-tls"] } +reqwest = { version = "0.12", default-features = false, features = ["http2", "rustls-tls-manual-roots"] } prost = { version = "0.11.6", default-features = false, features = ["std", "prost-derive"] } -hyper = { version = "0.14", default-features = false, features = ["client", "http2", "runtime", "tcp"] } -hyper-rustls = { version = "0.24", default-features = false, features = ["http2", "tls12", "tokio-runtime"] } -rustls = "0.21" -rustls-pemfile = "1" +hyper = { version = "1", default-features = false } serde = { version = "1.0", features = ["derive"], optional = true } toml = { version = "0.8", default-features = false, features = ["parse"], optional = true } diff --git a/ldk-server-client/README.md b/ldk-server-client/README.md index 11459c77..b5f55e98 100644 --- a/ldk-server-client/README.md +++ b/ldk-server-client/README.md @@ -1,8 +1,7 @@ # ldk-server-client Async Rust client library for communicating with an [LDK Server](https://github.com/lightningdevkit/ldk-server) -node over gRPC. Uses `reqwest` for unary RPCs and `hyper` for server-streaming (event -subscriptions). +node over gRPC. Uses `reqwest` for both unary and server-streaming (event subscription) RPCs. ## Usage diff --git a/ldk-server-client/src/client.rs b/ldk-server-client/src/client.rs index 54315a0c..508501ed 100644 --- a/ldk-server-client/src/client.rs +++ b/ldk-server-client/src/client.rs @@ -7,11 +7,10 @@ // You may not use this file except in accordance with one or both of these // licenses. -use std::io::Cursor; +use std::future::poll_fn; +use std::pin::Pin; -use hyper::body::HttpBody as _; -use hyper::{Body as HyperBody, Client as HyperClient, Request as HyperRequest, Version}; -use hyper_rustls::{HttpsConnector, HttpsConnectorBuilder}; +use hyper::body::Body as _; use ldk_server_grpc::api::{ Bolt11ClaimForIdRequest, Bolt11ClaimForIdResponse, Bolt11FailForIdRequest, Bolt11FailForIdResponse, Bolt11ReceiveForHashRequest, Bolt11ReceiveForHashResponse, @@ -78,9 +77,7 @@ use ldk_server_grpc::grpc::{ }; use prost::Message; use reqwest::header::HeaderMap; -use reqwest::{Certificate, Client}; -use rustls::{ClientConfig, RootCertStore}; -use rustls_pemfile::certs; +use reqwest::{Body, Certificate, Client}; use crate::error::LdkServerError; use crate::error::LdkServerErrorCode::{ @@ -88,8 +85,6 @@ use crate::error::LdkServerErrorCode::{ LightningError, }; -type StreamingClient = HyperClient, HyperBody>; - const GRPC_FRAME_HEADER_LEN: usize = 5; // Applies to complete unary gRPC responses. The server applies the same cap to unary request @@ -109,7 +104,6 @@ const MAX_GRPC_STREAM_MESSAGE_LEN: usize = 4 * 1024 * 1024; pub struct LdkServerClient { base_url: String, client: Client, - streaming_client: StreamingClient, macaroon: String, } @@ -123,16 +117,22 @@ impl LdkServerClient { /// found at `/tls.crt` after the server starts. pub fn new(base_url: String, macaroon: String, server_cert_pem: &[u8]) -> Result { crate::macaroon::parse_reusable_macaroon(&macaroon)?; - let cert = Certificate::from_pem(server_cert_pem) + let certs = Certificate::from_pem_bundle(server_cert_pem) .map_err(|e| format!("Failed to parse server certificate: {e}"))?; - let streaming_client = build_streaming_client(server_cert_pem)?; + if certs.is_empty() { + return Err( + "Failed to parse server certificate: no certificates found in PEM".to_string() + ); + } - let client = Client::builder() - .add_root_certificate(cert) - .build() - .map_err(|e| format!("Failed to build HTTP client: {e}"))?; + // reqwest is built without bundled roots, so only the server's certificate is trusted. + let mut builder = Client::builder().https_only(true).http2_prior_knowledge(); + for cert in certs { + builder = builder.add_root_certificate(cert); + } + let client = builder.build().map_err(|e| format!("Failed to build HTTP client: {e}"))?; - Ok(Self { base_url, client, streaming_client, macaroon }) + Ok(Self { base_url, client, macaroon }) } /// Retrieve the latest node info like `node_id`, `current_best_block` etc. @@ -621,32 +621,26 @@ impl LdkServerClient { let auth_header = self.request_macaroon(method, &grpc_body)?; let response = self - .streaming_client - .request( - HyperRequest::post(&url) - .version(Version::HTTP_2) - .header("content-type", "application/grpc+proto") - .header("content-length", content_length) - .header("te", "trailers") - .header("macaroon", auth_header) - .body(HyperBody::from(grpc_body)) - .map_err(|e| { - LdkServerError::new( - InternalError, - format!("Failed to build gRPC request: {e}"), - ) - })?, - ) + .client + .post(&url) + .header("content-type", "application/grpc+proto") + .header("content-length", content_length) + .header("te", "trailers") + .header("macaroon", auth_header) + .body(grpc_body) + .send() .await .map_err(|e| { LdkServerError::new(InternalError, format!("gRPC request failed: {}", e)) })?; - let (parts, body) = response.into_parts(); - if let Some(error) = grpc_error_from_headers(&parts.headers) { + if let Some(error) = grpc_error_from_headers(response.headers()) { return Err(error); } + // Convert into an `http::Response` so the body exposes trailer frames. + let body = hyper::Response::::from(response).into_body(); + Ok(GrpcStream { body, buf: Vec::new(), @@ -737,7 +731,7 @@ fn grpc_error_from_headers(headers: &HeaderMap) -> Option { /// /// Call [`next_message`](GrpcStream::next_message) to receive the next message from the server. pub struct GrpcStream { - body: hyper::Body, + body: Body, buf: Vec, trailers_checked: bool, _marker: std::marker::PhantomData, @@ -794,9 +788,17 @@ impl GrpcStream { } } - // Need more data — read the next chunk from the response body - match self.body.data().await { - Some(Ok(chunk)) => self.buf.extend_from_slice(&chunk), + // Need more data — read the next frame from the response body + match poll_fn(|cx| Pin::new(&mut self.body).poll_frame(cx)).await { + Some(Ok(frame)) => match frame.into_data() { + Ok(chunk) => self.buf.extend_from_slice(&chunk), + Err(frame) => { + if let Ok(trailers) = frame.into_trailers() { + self.trailers_checked = true; + return self.finish_stream(Some(&trailers)); + } + }, + }, Some(Err(e)) => { return Some(Err(LdkServerError::new( InternalError, @@ -808,26 +810,15 @@ impl GrpcStream { return None; } self.trailers_checked = true; - return self.finish_stream().await; + return self.finish_stream(None); }, } } } - async fn finish_stream(&mut self) -> Option> { - match self.body.trailers().await { - Ok(Some(trailers)) => { - if let Some(error) = grpc_error_from_headers(&trailers) { - return Some(Err(error)); - } - }, - Ok(None) => {}, - Err(e) => { - return Some(Err(LdkServerError::new( - InternalError, - format!("Failed to read gRPC stream trailers: {}", e), - ))); - }, + fn finish_stream(&self, trailers: Option<&HeaderMap>) -> Option> { + if let Some(error) = trailers.and_then(grpc_error_from_headers) { + return Some(Err(error)); } if self.buf.is_empty() { @@ -841,40 +832,39 @@ impl GrpcStream { } } -fn build_streaming_client(server_cert_pem: &[u8]) -> Result { - let mut pem_reader = Cursor::new(server_cert_pem); - let certs = - certs(&mut pem_reader).map_err(|e| format!("Failed to parse server certificate: {e}"))?; - if certs.is_empty() { - return Err("Failed to parse server certificate: no certificates found in PEM".to_string()); - } - - let mut roots = RootCertStore::empty(); - let (added, _ignored) = roots.add_parsable_certificates(&certs); - if added == 0 { - return Err("Failed to build streaming client: certificate was not accepted".to_string()); - } - - let tls_config = ClientConfig::builder() - .with_safe_defaults() - .with_root_certificates(roots) - .with_no_client_auth(); - let connector = HttpsConnectorBuilder::new() - .with_tls_config(tls_config) - .https_only() - .enable_http2() - .build(); - - Ok(HyperClient::builder().http2_only(true).build(connector)) -} - #[cfg(test)] mod tests { - use hyper::Body; + use std::collections::VecDeque; + use std::convert::Infallible; + use std::task::{Context, Poll}; + + use hyper::body::Frame; use reqwest::header::HeaderValue; use super::*; + struct FramesBody(VecDeque>); + + impl hyper::body::Body for FramesBody { + type Data = &'static [u8]; + type Error = Infallible; + + fn poll_frame( + mut self: Pin<&mut Self>, _cx: &mut Context<'_>, + ) -> Poll, Infallible>>> { + Poll::Ready(self.0.pop_front().map(Ok)) + } + } + + fn event_stream(frames: Vec>) -> EventStream { + GrpcStream { + body: Body::wrap(FramesBody(frames.into())), + buf: Vec::new(), + trailers_checked: false, + _marker: std::marker::PhantomData, + } + } + #[test] fn test_grpc_error_from_headers_ignores_ok_status() { let mut headers = HeaderMap::new(); @@ -921,19 +911,10 @@ mod tests { #[tokio::test] async fn test_event_stream_surfaces_terminal_grpc_status() { - let (mut sender, body) = Body::channel(); let mut trailers = HeaderMap::new(); trailers.insert("grpc-status", HeaderValue::from_static("14")); trailers.insert("grpc-message", HeaderValue::from_static("server%20restarting")); - sender.send_trailers(trailers).await.unwrap(); - drop(sender); - - let mut stream: EventStream = GrpcStream { - body, - buf: Vec::new(), - trailers_checked: false, - _marker: std::marker::PhantomData, - }; + let mut stream = event_stream(vec![Frame::trailers(trailers)]); let result = stream.next_message().await.unwrap().unwrap_err(); assert_eq!(result.error_code, InternalError); @@ -943,16 +924,7 @@ mod tests { #[tokio::test] async fn test_event_stream_rejects_oversized_frame_header() { - let (mut sender, body) = Body::channel(); - sender.send_data(vec![0u8, 0xff, 0xff, 0xff, 0xff].into()).await.unwrap(); - drop(sender); - - let mut stream: EventStream = GrpcStream { - body, - buf: Vec::new(), - trailers_checked: false, - _marker: std::marker::PhantomData, - }; + let mut stream = event_stream(vec![Frame::data(&[0u8, 0xff, 0xff, 0xff, 0xff])]); let result = stream.next_message().await.unwrap().unwrap_err(); assert_eq!(result.error_code, InternalError); @@ -967,22 +939,40 @@ mod tests { #[tokio::test] async fn test_event_stream_rejects_compressed_frame() { - let (mut sender, body) = Body::channel(); - sender.send_data(vec![1u8, 0, 0, 0, 0].into()).await.unwrap(); - drop(sender); - - let mut stream: EventStream = GrpcStream { - body, - buf: Vec::new(), - trailers_checked: false, - _marker: std::marker::PhantomData, - }; + let mut stream = event_stream(vec![Frame::data(&[1u8, 0, 0, 0, 0])]); let result = stream.next_message().await.unwrap().unwrap_err(); assert_eq!(result.error_code, InternalError); assert_eq!(result.message, "gRPC stream compression is not supported"); } + #[tokio::test] + async fn test_event_stream_ends_after_ok_trailers() { + let mut trailers = HeaderMap::new(); + trailers.insert("grpc-status", HeaderValue::from_static("0")); + let mut stream = event_stream(vec![ + // An uncompressed gRPC frame carrying an empty `EventEnvelope`. + Frame::data(&[0, 0, 0, 0, 0]), + Frame::trailers(trailers), + ]); + + assert_eq!(stream.next_message().await.unwrap().unwrap(), EventEnvelope::default()); + assert!(stream.next_message().await.is_none()); + } + + #[tokio::test] + async fn test_event_stream_rejects_incomplete_frame_before_trailers() { + let mut trailers = HeaderMap::new(); + trailers.insert("grpc-status", HeaderValue::from_static("0")); + let mut stream = + event_stream(vec![Frame::data(&[0u8, 0, 0, 0, 2, 0]), Frame::trailers(trailers)]); + + let result = stream.next_message().await.unwrap().unwrap_err(); + assert_eq!(result.error_code, InternalError); + assert_eq!(result.message, "gRPC stream ended with an incomplete frame"); + assert!(stream.next_message().await.is_none()); + } + #[test] fn test_grpc_code_to_error_all_known_codes() { let cases = [