From 82d54c7005c113f5bc65771956ba6f10a8d8147d Mon Sep 17 00:00:00 2001 From: inq Date: Sat, 27 Jun 2026 17:04:55 +0000 Subject: [PATCH 1/5] optimize sark-ws --- frameworks/sark/Cargo.lock | 36 ++++++++++++++++++------------------ frameworks/sark/Cargo.toml | 16 ++++++++-------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/frameworks/sark/Cargo.lock b/frameworks/sark/Cargo.lock index 4f6b3896c..7bc5fc77b 100644 --- a/frameworks/sark/Cargo.lock +++ b/frameworks/sark/Cargo.lock @@ -996,9 +996,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "sark" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ca0d62dc00179336a99c67ba367e73df0d5e577a56f12110478697d8e9512d" +checksum = "68881120e423823121c35612cbff8eea27dad94705232c6b396474e9b412765a" dependencies = [ "dope", "dope-extra", @@ -1017,9 +1017,9 @@ dependencies = [ [[package]] name = "sark-core" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd4939154594f8aa2f44bc0460b8f4038abda3f6ac5a427f83fbe2c2521a93" +checksum = "e5dcbf331077bc09156d0db2c79b429a3f30a37adabd677fd20706a518c211fe" dependencies = [ "http", "httparse", @@ -1034,9 +1034,9 @@ dependencies = [ [[package]] name = "sark-gen" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea73efb9483ff8e25d560a00416a584a19bec3d999b7f87c8089e54ff5e07d8" +checksum = "8b9ad14380ebef99847caa736bf02b17343d611616313562181c7ec51195277c" dependencies = [ "dope", "o3", @@ -1047,9 +1047,9 @@ dependencies = [ [[package]] name = "sark-grpc" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3665a1f8ebf14b599ead1ebae3c333e00133ed22630a255f1828e171378b87c" +checksum = "190132a99a159d540efc8b05136d09b047e7bdd5b82afb1818a68116c0e9fa75" dependencies = [ "dope", "dope-extra", @@ -1064,18 +1064,18 @@ dependencies = [ [[package]] name = "sark-grpc-build" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14991dcd6c9a4f5330d8ef012f3d749cab682512647be1bb4edffa9acfd7bc9a" +checksum = "f2c7916d41af772066db345b560d039bade7634ea4c9b185dccd0de07f492b06" dependencies = [ "prost-build", ] [[package]] name = "sark-h2" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9daff2eebc0646ec9e82752cdd4c8196f7c16a85c2bf1c360ca4a26b1317cff" +checksum = "011f5a745e87dde20f7de8f6427817ec3c016ec0cc8a16269f55065f05463c8f" dependencies = [ "dope", "dope-extra", @@ -1089,9 +1089,9 @@ dependencies = [ [[package]] name = "sark-h3" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "108b80be29c10a88c345594513b9664e173e02f55cd28b482e3860afac7a9f57" +checksum = "891e452b212e949a5840acb2084fd2f69d7716e65a70d9730d73ba74b3305832" dependencies = [ "dope-quic", "sark", @@ -1100,9 +1100,9 @@ dependencies = [ [[package]] name = "sark-json" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3a6140ea76e6e5497d57a968a6098a0be3701e64883ed7e4eb627384dc8a2f" +checksum = "7963cba1db5bff423d7efdb9446417966d488d3567cd7a8d932e40cb50795160" dependencies = [ "http", "o3", @@ -1111,9 +1111,9 @@ dependencies = [ [[package]] name = "sark-ws" -version = "0.6.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebce2b50a1ff93bedc56f4a49691e818e504228db2e697f4ac3fb18205df9a65" +checksum = "23a5920f8bc11c7838d8094a2ffaae4285b1635996a7028ec656110874d85f64" dependencies = [ "dope", "dope-extra", diff --git a/frameworks/sark/Cargo.toml b/frameworks/sark/Cargo.toml index ef7af5dff..5f3f868df 100644 --- a/frameworks/sark/Cargo.toml +++ b/frameworks/sark/Cargo.toml @@ -12,14 +12,14 @@ dope-extra = "0.5" dope-tls = "0.6" dope-quic = "0.3" o3 = "0.2" -sark = "0.6" -sark-core = "0.6" -sark-gen = "0.6" -sark-ws = "0.6" -sark-h2 = "0.6" -sark-h3 = "0.6" -sark-grpc = "0.6" -sark-grpc-build = "0.6" +sark = "0.7" +sark-core = "0.7" +sark-gen = "0.7" +sark-ws = "0.7" +sark-h2 = "0.7" +sark-h3 = "0.7" +sark-grpc = "0.7" +sark-grpc-build = "0.7" cartel-pg = "0.3" cartel-redis = "0.3" cartel-gen = "0.3" From b383f267e342d94b675a0979f05c7d2b88e7abc6 Mon Sep 17 00:00:00 2001 From: inq Date: Sun, 28 Jun 2026 17:49:18 +0000 Subject: [PATCH 2/5] update --- frameworks/sark-gateway/compose.gateway.yml | 8 +- .../compose.production-stack.yml | 13 +- frameworks/sark/Cargo.lock | 230 ++++++++++++++---- frameworks/sark/Cargo.toml | 22 +- frameworks/sark/httparena/src/lib.rs | 2 +- frameworks/sark/httparena/src/main.rs | 20 +- 6 files changed, 222 insertions(+), 73 deletions(-) diff --git a/frameworks/sark-gateway/compose.gateway.yml b/frameworks/sark-gateway/compose.gateway.yml index ba5cb8b62..bccd4d134 100644 --- a/frameworks/sark-gateway/compose.gateway.yml +++ b/frameworks/sark-gateway/compose.gateway.yml @@ -1,3 +1,7 @@ +# The sark io_uring `server` busy-polls (Throughput profile spins while it holds +# connections), so it must NOT share cores with the yielding proxy — otherwise it +# starves nginx and the stack serves 0 RPS. Keep GATEWAY_SERVER_CPUS disjoint from +# GATEWAY_PROXY_CPUS (compose.gateway-h3.yml already does: proxy 0-1, server 2). services: proxy: build: @@ -16,7 +20,7 @@ services: context: ../sark dockerfile: Dockerfile network_mode: host - cpuset: "${GATEWAY_SERVER_CPUS:-0-2}" + cpuset: "${GATEWAY_SERVER_CPUS:-3-5}" security_opt: - seccomp:unconfined ulimits: @@ -26,7 +30,7 @@ services: hard: 1048576 environment: - SARK_HTTPARENA_BIND=0.0.0.0:8080 - - SARK_HTTPARENA_CPU_CORE=${GATEWAY_SERVER_CPU_CORE:-0} + - SARK_HTTPARENA_CPU_CORE=${GATEWAY_SERVER_CPU_CORE:-3} - SARK_HTTPARENA_CPU_COUNT=${GATEWAY_SERVER_CPU_COUNT:-3} - DATABASE_URL=${DATABASE_URL} - DATABASE_MAX_CONN=${DATABASE_MAX_CONN:-32} diff --git a/frameworks/sark-production/compose.production-stack.yml b/frameworks/sark-production/compose.production-stack.yml index d7d80a58d..072387c78 100644 --- a/frameworks/sark-production/compose.production-stack.yml +++ b/frameworks/sark-production/compose.production-stack.yml @@ -1,3 +1,8 @@ +# CPU layout: the sark io_uring `server` busy-polls (Throughput profile spins +# while it holds connections), so it must NOT share cores with the yielding +# edge/authsvc/cache — otherwise it starves them and the whole stack serves +# 0 RPS. `server` is pinned to GATEWAY_SERVER_CPUS (its own range); the proxy, +# auth sidecar and redis share GATEWAY_PROXY_CPUS. Keep the two ranges DISJOINT. services: edge: build: ./proxy-production @@ -20,14 +25,14 @@ services: cache: image: redis:7-alpine network_mode: host - cpuset: "${GATEWAY_SERVER_CPUS:-0-2}" + cpuset: "${GATEWAY_PROXY_CPUS:-0-2}" security_opt: - seccomp:unconfined authsvc: build: ../_shared/authsvc network_mode: host - cpuset: "${GATEWAY_SERVER_CPUS:-0-2}" + cpuset: "${GATEWAY_PROXY_CPUS:-0-2}" security_opt: - seccomp:unconfined environment: @@ -39,7 +44,7 @@ services: context: ../sark dockerfile: Dockerfile network_mode: host - cpuset: "${GATEWAY_SERVER_CPUS:-0-2}" + cpuset: "${GATEWAY_SERVER_CPUS:-3-5}" security_opt: - seccomp:unconfined ulimits: @@ -49,7 +54,7 @@ services: hard: 1048576 environment: - SARK_HTTPARENA_BIND=0.0.0.0:8080 - - SARK_HTTPARENA_CPU_CORE=${GATEWAY_SERVER_CPU_CORE:-0} + - SARK_HTTPARENA_CPU_CORE=${GATEWAY_SERVER_CPU_CORE:-3} - SARK_HTTPARENA_CPU_COUNT=${GATEWAY_SERVER_CPU_COUNT:-3} - DATABASE_URL=${DATABASE_URL} - DATABASE_MAX_CONN=${DATABASE_MAX_CONN:-128} diff --git a/frameworks/sark/Cargo.lock b/frameworks/sark/Cargo.lock index 7bc5fc77b..3f8939a99 100644 --- a/frameworks/sark/Cargo.lock +++ b/frameworks/sark/Cargo.lock @@ -11,6 +11,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "anyhow" version = "1.0.103" @@ -91,6 +106,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bit-vec" version = "0.9.1" @@ -115,6 +136,27 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bytes" version = "1.12.0" @@ -204,6 +246,12 @@ 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 = "cpufeatures" version = "0.3.0" @@ -220,6 +268,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ "hybrid-array", + "rand_core", ] [[package]] @@ -237,6 +286,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" +[[package]] +name = "der" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "der-parser" version = "10.0.0" @@ -281,9 +340,9 @@ dependencies = [ [[package]] name = "dope" -version = "0.5.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f2af5f0b2507932706f970ded9a6c4de89431a9f855a7d61a0c7e698857781" +checksum = "99b1fe82bd8665f9b2d78a47b2c28834c9d3dbd6497575d7ebdad07de6acc35e" dependencies = [ "io-uring", "libc", @@ -293,9 +352,9 @@ dependencies = [ [[package]] name = "dope-extra" -version = "0.5.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ce0d8ae99e97adb8a9b4247d382d0726ee84c01547e2151909dd967d2ca411" +checksum = "0acda19f64a371f88a39a77b27322719008851221fd670b206544f0fe46be8c5" dependencies = [ "dope", "libc", @@ -304,9 +363,9 @@ dependencies = [ [[package]] name = "dope-gen" -version = "0.5.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8352e7b40f75f8af0e895b272048761eb16809c91f387d5d3cdac28c0b05a029" +checksum = "172c8823fb0399a240959a6707648cb73153b102cfdd3d565b6eb49dc9a777ee" dependencies = [ "proc-macro2", "quote", @@ -315,9 +374,9 @@ dependencies = [ [[package]] name = "dope-quic" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd83eb653fea7b22da51f6db6294f3fb80071313067fb5199ba45b32110170" +checksum = "a61b598cd75cc71e9cf380dbfa88d6438bf9603acd2c50b86a27d793e25084fe" dependencies = [ "dope", "dope-gen", @@ -330,9 +389,9 @@ dependencies = [ [[package]] name = "dope-tls" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c9396db331682a3e5ef84809f1b86bf40599ba4326c47d81b2e15ff7d7fc1c7" +checksum = "46cfc0e9cac6cc1975deab97fa718cdacc9fc0a5c0f14528cd6b2cfa26859cc3" dependencies = [ "dope", "libc", @@ -441,7 +500,7 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", - "rand_core 0.10.1", + "rand_core", ] [[package]] @@ -531,11 +590,13 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[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 = [ + "ctutils", "typenum", + "zeroize", ] [[package]] @@ -550,9 +611,9 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d09b98f7eace8982db770e4408e7470b028ce513ac28fecdc6bf4c30fe92b62" +checksum = "9080b15e63775b9a2ac7dca720f7050a8b955e092ea0f6020a4a80f69998cdc0" dependencies = [ "bitflags", "cfg-if", @@ -584,6 +645,26 @@ dependencies = [ "libc", ] +[[package]] +name = "keccak" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +dependencies = [ + "cfg-if", + "cpufeatures", +] + +[[package]] +name = "kem" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01737161ba802849cfd486b5bd209d38ba4943494c249a8126005170c7621edd" +dependencies = [ + "crypto-common", + "rand_core", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -638,6 +719,33 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "ml-kem" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e15f3e5b957493873e396a66914e83e616b6afe335cdef7efe5c6e1216aba66" +dependencies = [ + "hybrid-array", + "kem", + "module-lattice", + "pkcs8", + "rand_core", + "sha3", + "zeroize", +] + +[[package]] +name = "module-lattice" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febe" +dependencies = [ + "ctutils", + "hybrid-array", + "num-traits", + "zeroize", +] + [[package]] name = "multimap" version = "0.10.1" @@ -759,6 +867,16 @@ dependencies = [ "syn", ] +[[package]] +name = "pkcs8" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -872,26 +990,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ "getrandom 0.4.3", - "rand_core 0.10.1", + "rand_core", ] [[package]] name = "rand_chacha" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" dependencies = [ "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", + "rand_core", ] [[package]] @@ -996,9 +1105,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "sark" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68881120e423823121c35612cbff8eea27dad94705232c6b396474e9b412765a" +checksum = "2f49f8bcc0aee3abc64004f3ff0613991ae0e113db1804de733ff4e21d5068b0" dependencies = [ "dope", "dope-extra", @@ -1017,10 +1126,11 @@ dependencies = [ [[package]] name = "sark-core" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5dcbf331077bc09156d0db2c79b429a3f30a37adabd677fd20706a518c211fe" +checksum = "c5b98f9add5709c56105ca6953a1a7b1e2e1c31674acc83e0fc8329bbff62b0b" dependencies = [ + "brotli", "http", "httparse", "libdeflater", @@ -1034,9 +1144,9 @@ dependencies = [ [[package]] name = "sark-gen" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ad14380ebef99847caa736bf02b17343d611616313562181c7ec51195277c" +checksum = "6cc2893dc2722c712d51f3b3fe2bc4b2f9813ca0869b5b3b6df31098cd7312ad" dependencies = [ "dope", "o3", @@ -1047,9 +1157,9 @@ dependencies = [ [[package]] name = "sark-grpc" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190132a99a159d540efc8b05136d09b047e7bdd5b82afb1818a68116c0e9fa75" +checksum = "c07d9c0ebca90e7898e72c62d5d5865bf5c6eb18fc3187317808ba71fdca1d78" dependencies = [ "dope", "dope-extra", @@ -1064,18 +1174,18 @@ dependencies = [ [[package]] name = "sark-grpc-build" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c7916d41af772066db345b560d039bade7634ea4c9b185dccd0de07f492b06" +checksum = "06d10e832cef71ad2b2a42142da5977ad2a0845146c4cc289941104d0f792553" dependencies = [ "prost-build", ] [[package]] name = "sark-h2" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "011f5a745e87dde20f7de8f6427817ec3c016ec0cc8a16269f55065f05463c8f" +checksum = "d2c9821c8febe8b907540f1ef8992c03b7b746280b51cad45b2535d74b9b90aa" dependencies = [ "dope", "dope-extra", @@ -1089,9 +1199,9 @@ dependencies = [ [[package]] name = "sark-h3" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891e452b212e949a5840acb2084fd2f69d7716e65a70d9730d73ba74b3305832" +checksum = "f2a2068e90a4eb87c8d259816ed869984250f972a04caeed57a666a292e06b5b" dependencies = [ "dope-quic", "sark", @@ -1100,9 +1210,9 @@ dependencies = [ [[package]] name = "sark-json" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7963cba1db5bff423d7efdb9446417966d488d3567cd7a8d932e40cb50795160" +checksum = "7ae8edd3611bb5a717fa5d6afbe4a75d6ad6dba1703c986d0186f229498abd6b" dependencies = [ "http", "o3", @@ -1111,9 +1221,9 @@ dependencies = [ [[package]] name = "sark-ws" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a5920f8bc11c7838d8094a2ffaae4285b1635996a7028ec656110874d85f64" +checksum = "cabe4a9454308a6cad78df9a90a0353c30857f9fee7314dd2b7dc7108635c4ae" dependencies = [ "dope", "dope-extra", @@ -1122,7 +1232,7 @@ dependencies = [ "o3", "pin-project", "rand_chacha", - "rand_core 0.9.5", + "rand_core", "sark-core", ] @@ -1192,12 +1302,24 @@ dependencies = [ "digest", ] +[[package]] +name = "sha3" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "shin" -version = "0.3.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a10cddc4d4991f721e480d80f9825b5e1113b02750f8eaa612a23b42266ff88" +checksum = "05cab1b518ee86d87f298dc380d376159b46b0dcf5e02ab5c698410819efa9bb" dependencies = [ + "ml-kem", + "rand_core", "ring", "subtle", ] @@ -1208,6 +1330,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +[[package]] +name = "spki" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stringprep" version = "0.1.5" diff --git a/frameworks/sark/Cargo.toml b/frameworks/sark/Cargo.toml index 5f3f868df..a55867ebd 100644 --- a/frameworks/sark/Cargo.toml +++ b/frameworks/sark/Cargo.toml @@ -9,22 +9,22 @@ edition = "2024" dope = "0.5" dope-gen = "0.5" dope-extra = "0.5" -dope-tls = "0.6" -dope-quic = "0.3" +dope-tls = "0.8" +dope-quic = "0.5" o3 = "0.2" -sark = "0.7" -sark-core = "0.7" -sark-gen = "0.7" -sark-ws = "0.7" -sark-h2 = "0.7" -sark-h3 = "0.7" -sark-grpc = "0.7" -sark-grpc-build = "0.7" +sark = "0.8" +sark-core = "0.8" +sark-gen = "0.8" +sark-ws = "0.8" +sark-h2 = "0.8" +sark-h3 = "0.8" +sark-grpc = "0.8" +sark-grpc-build = "0.8" cartel-pg = "0.3" cartel-redis = "0.3" cartel-gen = "0.3" tent = "0.2" -shin = "0.3" +shin = "0.7" http = "1.4" prost = "0.14.3" pin-project = "1" diff --git a/frameworks/sark/httparena/src/lib.rs b/frameworks/sark/httparena/src/lib.rs index bd2face41..40abe3d46 100644 --- a/frameworks/sark/httparena/src/lib.rs +++ b/frameworks/sark/httparena/src/lib.rs @@ -46,7 +46,7 @@ pub mod tls { }, transport_params: Vec::new(), alpn_protocols, - ticket_secret: None, + ticket_keys: None, accept_early_data: false, } } diff --git a/frameworks/sark/httparena/src/main.rs b/frameworks/sark/httparena/src/main.rs index 2bc46d5d9..a5150283b 100644 --- a/frameworks/sark/httparena/src/main.rs +++ b/frameworks/sark/httparena/src/main.rs @@ -31,7 +31,7 @@ use sark::fs::ServeDir; use sark::json::{Encode, Json, JsonDecode, JsonEncode, Writer}; use sark::request::BodyLen; use sark::timer::{DEFAULT_HEAD_TIMEOUT, SARK_TIMER_ID, TimerHost}; -use sark_core::http::compress::Gzip; +use sark_core::http::compress::{Brotli, Gzip}; use sark_core::http::{LocalFrameBytes, Response}; use sark_grpc::server::App as GrpcApp; use sark_h2::server::App as H2App; @@ -114,15 +114,15 @@ fn u64_owned(n: u64) -> Owned { body } -fn accepts_gzip(accept_encoding: &[u8]) -> bool { +fn accepts(accept_encoding: &[u8], coding: &[u8]) -> bool { accept_encoding.split(|&b| b == b',').any(|part| { - let part = part.trim_ascii(); - let coding = part + let c = part + .trim_ascii() .split(|&b| b == b';') .next() .unwrap_or(b"") .trim_ascii(); - coding.eq_ignore_ascii_case(b"gzip") + c.eq_ignore_ascii_case(coding) }) } @@ -130,7 +130,14 @@ fn respond_json(value: T, accept_encoding: &[u8]) -> Response { let body = value.encode_json(); let mut response = Response::ok(); response.content_type("application/json"); - if accepts_gzip(accept_encoding) { + // Prefer brotli (much smaller body → better compression-ratio score), fall + // back to gzip, then identity. + if accepts(accept_encoding, b"br") { + let compressed = Brotli::with_thread_local(|b| Shared::from(b.encode(&body).to_vec())); + response.append_wire_header_static("content-encoding", "br"); + response.append_wire_header_static("vary", "accept-encoding"); + response.set_body(compressed); + } else if accepts(accept_encoding, b"gzip") { let compressed = Gzip::with_thread_local(|g| Shared::from(g.encode(&body).to_vec())); response.append_wire_header_static("content-encoding", "gzip"); response.append_wire_header_static("vary", "accept-encoding"); @@ -311,6 +318,7 @@ struct PipelineRequest {} #[sark_gen::handler] #[static_response] +#[skip(date, server)] fn pipeline_endpoint(_req: PipelineRequest, _state: &AppState<'_>) -> PipelineResponse { PipelineResponse { status: StatusCode::OK, From 1689a0f9c5adfa08324095040a9d697c2d68624a Mon Sep 17 00:00:00 2001 From: inq Date: Sun, 28 Jun 2026 18:13:22 +0000 Subject: [PATCH 3/5] Update --- frameworks/sark/Cargo.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/frameworks/sark/Cargo.lock b/frameworks/sark/Cargo.lock index 3f8939a99..c15648bb7 100644 --- a/frameworks/sark/Cargo.lock +++ b/frameworks/sark/Cargo.lock @@ -1105,9 +1105,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "sark" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f49f8bcc0aee3abc64004f3ff0613991ae0e113db1804de733ff4e21d5068b0" +checksum = "c074073311f259491c43e71ef403113566d558678fee3a9ebed80d88c6b22f9f" dependencies = [ "dope", "dope-extra", @@ -1126,9 +1126,9 @@ dependencies = [ [[package]] name = "sark-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98f9add5709c56105ca6953a1a7b1e2e1c31674acc83e0fc8329bbff62b0b" +checksum = "a263050d776dbf457a3bf0eb28df254eb11d25f519b2a9c29e4c3289712a557a" dependencies = [ "brotli", "http", @@ -1144,9 +1144,9 @@ dependencies = [ [[package]] name = "sark-gen" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cc2893dc2722c712d51f3b3fe2bc4b2f9813ca0869b5b3b6df31098cd7312ad" +checksum = "d273611f47e093b0a2228260a52ab361810e7cc3035f7efcce39382f89e5d8e0" dependencies = [ "dope", "o3", @@ -1157,9 +1157,9 @@ dependencies = [ [[package]] name = "sark-grpc" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07d9c0ebca90e7898e72c62d5d5865bf5c6eb18fc3187317808ba71fdca1d78" +checksum = "89f0982698fe1792fe0f71663f3b7a2f28dc138582e7fdfa34baa758bf2156e1" dependencies = [ "dope", "dope-extra", @@ -1174,18 +1174,18 @@ dependencies = [ [[package]] name = "sark-grpc-build" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d10e832cef71ad2b2a42142da5977ad2a0845146c4cc289941104d0f792553" +checksum = "add09b235922ec12cae7ca6c352eedc28fe366da642f4d821585874ead160fdf" dependencies = [ "prost-build", ] [[package]] name = "sark-h2" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c9821c8febe8b907540f1ef8992c03b7b746280b51cad45b2535d74b9b90aa" +checksum = "d18815697f35de53ebd20ec0b8f9f4c4bb721c5b82e03b3a37cc6f8e7fb0c697" dependencies = [ "dope", "dope-extra", @@ -1199,9 +1199,9 @@ dependencies = [ [[package]] name = "sark-h3" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2a2068e90a4eb87c8d259816ed869984250f972a04caeed57a666a292e06b5b" +checksum = "6fa4f58a2394f2dee18efa3f30899078bad2708631805c093dc935ad6479cc82" dependencies = [ "dope-quic", "sark", @@ -1210,9 +1210,9 @@ dependencies = [ [[package]] name = "sark-json" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ae8edd3611bb5a717fa5d6afbe4a75d6ad6dba1703c986d0186f229498abd6b" +checksum = "5c2f794d3ff39b204e674c1f66dd59d214a654671c3ecbb3e0ae481432335b09" dependencies = [ "http", "o3", @@ -1221,9 +1221,9 @@ dependencies = [ [[package]] name = "sark-ws" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cabe4a9454308a6cad78df9a90a0353c30857f9fee7314dd2b7dc7108635c4ae" +checksum = "044b40ee798b48b34f93957e1c4947a822d3dc563c4e33d4b0ebeadbbe12d97e" dependencies = [ "dope", "dope-extra", From f1d66b1042c6348c0ab37ba07ad357b5802c16e0 Mon Sep 17 00:00:00 2001 From: inq Date: Mon, 29 Jun 2026 06:29:40 +0000 Subject: [PATCH 4/5] bump --- .../sark-gateway/compose.gateway-h3.yml | 1 + frameworks/sark-gateway/compose.gateway.yml | 1 + .../compose.production-stack.yml | 1 + frameworks/sark/Cargo.lock | 36 +++---- frameworks/sark/httparena/src/main.rs | 94 +++++++++++-------- 5 files changed, 76 insertions(+), 57 deletions(-) diff --git a/frameworks/sark-gateway/compose.gateway-h3.yml b/frameworks/sark-gateway/compose.gateway-h3.yml index ec9355518..70d937d4b 100644 --- a/frameworks/sark-gateway/compose.gateway-h3.yml +++ b/frameworks/sark-gateway/compose.gateway-h3.yml @@ -31,3 +31,4 @@ services: - DATABASE_URL=${DATABASE_URL} - DATABASE_MAX_CONN=${DATABASE_MAX_CONN:-32} - SARK_HTTPARENA_PER_IP_CAP=0 + - SARK_HTTPARENA_H1_ONLY=1 diff --git a/frameworks/sark-gateway/compose.gateway.yml b/frameworks/sark-gateway/compose.gateway.yml index bccd4d134..879e12091 100644 --- a/frameworks/sark-gateway/compose.gateway.yml +++ b/frameworks/sark-gateway/compose.gateway.yml @@ -35,3 +35,4 @@ services: - DATABASE_URL=${DATABASE_URL} - DATABASE_MAX_CONN=${DATABASE_MAX_CONN:-32} - SARK_HTTPARENA_PER_IP_CAP=0 + - SARK_HTTPARENA_H1_ONLY=1 diff --git a/frameworks/sark-production/compose.production-stack.yml b/frameworks/sark-production/compose.production-stack.yml index 072387c78..73e91a680 100644 --- a/frameworks/sark-production/compose.production-stack.yml +++ b/frameworks/sark-production/compose.production-stack.yml @@ -60,5 +60,6 @@ services: - DATABASE_MAX_CONN=${DATABASE_MAX_CONN:-128} - REDIS_URL=redis://127.0.0.1:6379 - SARK_HTTPARENA_PER_IP_CAP=0 + - SARK_HTTPARENA_H1_ONLY=1 depends_on: - cache diff --git a/frameworks/sark/Cargo.lock b/frameworks/sark/Cargo.lock index c15648bb7..36581c11c 100644 --- a/frameworks/sark/Cargo.lock +++ b/frameworks/sark/Cargo.lock @@ -1105,9 +1105,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "sark" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c074073311f259491c43e71ef403113566d558678fee3a9ebed80d88c6b22f9f" +checksum = "c7196fcd46aacb13236dca521543dfb57c2f56d2c4051c85f2964046ece54fb2" dependencies = [ "dope", "dope-extra", @@ -1126,9 +1126,9 @@ dependencies = [ [[package]] name = "sark-core" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a263050d776dbf457a3bf0eb28df254eb11d25f519b2a9c29e4c3289712a557a" +checksum = "cf083a0795bfd547429867b02ee87199488eab1f554ae33d393975fa59d262b7" dependencies = [ "brotli", "http", @@ -1144,9 +1144,9 @@ dependencies = [ [[package]] name = "sark-gen" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273611f47e093b0a2228260a52ab361810e7cc3035f7efcce39382f89e5d8e0" +checksum = "96ea2a2d9138d08ac00c8920d42ee85a87c23f1364c317e17076dcf6f1ac9a56" dependencies = [ "dope", "o3", @@ -1157,9 +1157,9 @@ dependencies = [ [[package]] name = "sark-grpc" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89f0982698fe1792fe0f71663f3b7a2f28dc138582e7fdfa34baa758bf2156e1" +checksum = "9393f1a9f03f4649c9a87cdd54b34b571028418d451734e5d0a8c3d0b1ab565c" dependencies = [ "dope", "dope-extra", @@ -1174,18 +1174,18 @@ dependencies = [ [[package]] name = "sark-grpc-build" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add09b235922ec12cae7ca6c352eedc28fe366da642f4d821585874ead160fdf" +checksum = "20309e9e3d9c9793baa03d5eb654fa1fac813b1f8d78dc27a079c02401932d19" dependencies = [ "prost-build", ] [[package]] name = "sark-h2" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18815697f35de53ebd20ec0b8f9f4c4bb721c5b82e03b3a37cc6f8e7fb0c697" +checksum = "8bdbb30c78ee58e806414e86f2b7a8bb73702323a27111d18e0381b76fb1a249" dependencies = [ "dope", "dope-extra", @@ -1199,9 +1199,9 @@ dependencies = [ [[package]] name = "sark-h3" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa4f58a2394f2dee18efa3f30899078bad2708631805c093dc935ad6479cc82" +checksum = "c3d3eb1a264db3666f88b41c636e6fb58710024f870ee61955691bace1b57101" dependencies = [ "dope-quic", "sark", @@ -1210,9 +1210,9 @@ dependencies = [ [[package]] name = "sark-json" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2f794d3ff39b204e674c1f66dd59d214a654671c3ecbb3e0ae481432335b09" +checksum = "4cacf8894eab059e3d30e9926352b14f4c81852ce674f207cc132780bab9e9b3" dependencies = [ "http", "o3", @@ -1221,9 +1221,9 @@ dependencies = [ [[package]] name = "sark-ws" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "044b40ee798b48b34f93957e1c4947a822d3dc563c4e33d4b0ebeadbbe12d97e" +checksum = "b895365c8ce10f2652171c53647a2d62bd3f0283c649fe2f794dc044e013b9b3" dependencies = [ "dope", "dope-extra", diff --git a/frameworks/sark/httparena/src/main.rs b/frameworks/sark/httparena/src/main.rs index a5150283b..c7fba52c1 100644 --- a/frameworks/sark/httparena/src/main.rs +++ b/frameworks/sark/httparena/src/main.rs @@ -822,6 +822,7 @@ struct PortArgs { json_tls_bind: SocketAddr, h2c_bind: SocketAddr, h2_bind: SocketAddr, + h1_only: bool, } struct PgArgs { @@ -916,53 +917,63 @@ fn run_thread(pg: PgArgs, ports: PortArgs, cfg: ServerCfg, ctx: launcher::Ctx) - std::ptr::NonNull::from(handler.date_stamp()) }; - let mut json_tls = { - let driver = exec.driver_mut(); - Listener::<2, _, TlsProd>::open_in( - tls_app::new::(&()), - listener_cfg(ports.json_tls_bind, cfg.max_conn), - driver, - )? - }; - json_tls.set_cfg(Endpoint::Server(Box::new(httparena_sark::tls::config( - vec![b"http/1.1".to_vec()], - )))); - let tls_stamp = { - let handler = json_tls.handler_mut(); - if !handler.is_timer_bound() { - handler.bind_timer(timer_borrow, DEFAULT_HEAD_TIMEOUT); - } - std::ptr::NonNull::from(handler.date_stamp()) - }; + let (json_tls, tls_stamp, h2c, h2) = if ports.h1_only { + ( + None::>, + h1_stamp, + None::, IdThru>>, + None::, TlsThru>>, + ) + } else { + let mut json_tls = { + let driver = exec.driver_mut(); + Listener::<2, _, TlsProd>::open_in( + tls_app::new::(&()), + listener_cfg(ports.json_tls_bind, cfg.max_conn), + driver, + )? + }; + json_tls.set_cfg(Endpoint::Server(Box::new(httparena_sark::tls::config( + vec![b"http/1.1".to_vec()], + )))); + let tls_stamp = { + let handler = json_tls.handler_mut(); + if !handler.is_timer_bound() { + handler.bind_timer(timer_borrow, DEFAULT_HEAD_TIMEOUT); + } + std::ptr::NonNull::from(handler.date_stamp()) + }; - let h2c = { - let driver = exec.driver_mut(); - Listener::<4, H2App<'_, BenchHandler, Identity>, IdThru>::open_in( - H2App::new(&h2c_handler), - listener_cfg(ports.h2c_bind, cfg.max_conn), - driver, - )? - }; + let h2c = { + let driver = exec.driver_mut(); + Listener::<4, H2App<'_, BenchHandler, Identity>, IdThru>::open_in( + H2App::new(&h2c_handler), + listener_cfg(ports.h2c_bind, cfg.max_conn), + driver, + )? + }; - let mut h2 = { - let driver = exec.driver_mut(); - Listener::<5, H2App<'_, BenchHandler, Tls>, TlsThru>::open_in( - H2App::new(&h2_handler), - listener_cfg(ports.h2_bind, cfg.max_conn), - driver, - )? + let mut h2 = { + let driver = exec.driver_mut(); + Listener::<5, H2App<'_, BenchHandler, Tls>, TlsThru>::open_in( + H2App::new(&h2_handler), + listener_cfg(ports.h2_bind, cfg.max_conn), + driver, + )? + }; + h2.set_cfg(Endpoint::Server(Box::new(httparena_sark::tls::config( + vec![b"h2".to_vec()], + )))); + (Some(json_tls), tls_stamp, Some(h2c), Some(h2)) }; - h2.set_cfg(Endpoint::Server(Box::new(httparena_sark::tls::config( - vec![b"h2".to_vec()], - )))); let mut init = app.as_mut().project(); init.date_h1.as_mut().get_mut().bind(h1_stamp); init.date_tls.as_mut().get_mut().bind(tls_stamp); init.p8080.set(Some(http)); - init.json_tls.set(Some(json_tls)); - init.h2c.set(Some(h2c)); - init.p8443.set(Some(h2)); + init.json_tls.set(json_tls); + init.h2c.set(h2c); + init.p8443.set(h2); exec.run(app.as_mut()) } @@ -987,11 +998,15 @@ fn main() -> io::Result<()> { .precompressed_gzip(), )); + let h1_only = std::env::var("SARK_HTTPARENA_H1_ONLY") + .map(|v| v == "1" || v.eq_ignore_ascii_case("true")) + .unwrap_or(false); let ports = PortArgs { h1_bind: boot.bind, json_tls_bind: SocketAddr::from(([0, 0, 0, 0], 8081)), h2c_bind: SocketAddr::from(([0, 0, 0, 0], 8082)), h2_bind: SocketAddr::from(([0, 0, 0, 0], 8443)), + h1_only, }; let cfg = ServerCfg { @@ -1014,6 +1029,7 @@ fn main() -> io::Result<()> { json_tls_bind: ports.json_tls_bind, h2c_bind: ports.h2c_bind, h2_bind: ports.h2_bind, + h1_only: ports.h1_only, }; run_thread(pg, ports, cfg.clone(), ctx) }) From 9a198c100ad09a5abf5af3dfae1822ea3525b982 Mon Sep 17 00:00:00 2001 From: inq Date: Mon, 29 Jun 2026 07:30:11 +0000 Subject: [PATCH 5/5] update --- frameworks/sark/httparena/src/main.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/frameworks/sark/httparena/src/main.rs b/frameworks/sark/httparena/src/main.rs index c7fba52c1..b6ab0a77a 100644 --- a/frameworks/sark/httparena/src/main.rs +++ b/frameworks/sark/httparena/src/main.rs @@ -130,18 +130,16 @@ fn respond_json(value: T, accept_encoding: &[u8]) -> Response { let body = value.encode_json(); let mut response = Response::ok(); response.content_type("application/json"); - // Prefer brotli (much smaller body → better compression-ratio score), fall - // back to gzip, then identity. - if accepts(accept_encoding, b"br") { - let compressed = Brotli::with_thread_local(|b| Shared::from(b.encode(&body).to_vec())); - response.append_wire_header_static("content-encoding", "br"); - response.append_wire_header_static("vary", "accept-encoding"); - response.set_body(compressed); - } else if accepts(accept_encoding, b"gzip") { + if accepts(accept_encoding, b"gzip") { let compressed = Gzip::with_thread_local(|g| Shared::from(g.encode(&body).to_vec())); response.append_wire_header_static("content-encoding", "gzip"); response.append_wire_header_static("vary", "accept-encoding"); response.set_body(compressed); + } else if accepts(accept_encoding, b"br") { + let compressed = Brotli::with_thread_local(|b| Shared::from(b.encode(&body).to_vec())); + response.append_wire_header_static("content-encoding", "br"); + response.append_wire_header_static("vary", "accept-encoding"); + response.set_body(compressed); } else { response.set_body(body); }