diff --git a/.cargo/audit.toml b/.cargo/audit.toml new file mode 100644 index 00000000..9f684112 --- /dev/null +++ b/.cargo/audit.toml @@ -0,0 +1,9 @@ +[advisories] +ignore = [ + # NOTE: + # Ignored and disabled from the `static-web-server` final binary (experimental feature) temporarily. + # See + # - https://github.com/tikv/rust-prometheus/issues/538 + # - https://github.com/Hanaasagi/tokio-metrics-collector/issues/26 + "RUSTSEC-2024-0437" +] diff --git a/.github/workflows/release.updates.yml b/.github/workflows/release.updates.yml index b85f9d13..70b9ae91 100644 --- a/.github/workflows/release.updates.yml +++ b/.github/workflows/release.updates.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: - fetch-depth: 1 + ref: master - name: Prepare shell: bash @@ -34,8 +34,12 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - git config --global user.name 'Jose Quintana' - git config --global user.email '1700322+joseluisq@users.noreply.github.com' - git add scripts/installer.sh docs/content/download-and-install.md docs/content/download-and-install.template.md - git commit -m "docs: ${{ env.SERVER_VERSION }} [skip ci]" - git push + git config --global user.name 'github-actions[bot]' + git config --global user.email '41898282+github-actions[bot]@users.noreply.github.com' + git add scripts/installer.sh + git add docs/content/download-and-install.md + git add docs/content/download-and-install.template.md + git commit --verbose -m "docs: ${{ env.SERVER_VERSION }} [skip ci]" + git fetch origin + git rebase --strategy-option=theirs origin/master --verbose + git push --verbose diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e2a81ae..2d8137c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 _**Note:** See changelog for v1 under the [1.x](https://github.com/static-web-server/static-web-server/blob/1.x/CHANGELOG.md) branch._ +## v2.36.1 - 2025-03-02 + +This new `v2.36.1` release brings several security and bug fixes and is the last version supporting legacy Windows 7, 8, 8.1 platforms. + +**Security patch for RUSTSEC-2024-0437** + +This release removes the [`experimental`](https://static-web-server.net/building-from-source/#cargo-features) Cargo feature from the resulting `static-web-server` binary temporarily (but not the Cargo feature itself) to prevent shipping the security `RUSTSEC-2024-0437` vulnerability ([#530](https://github.com/static-web-server/static-web-server/pull/530)) in this release. + +The `experimental` Cargo feature (that includes experimental metrics and in-memory cache features) will be restored to be part of the binary again in the next release. + +**End support for unmaintained Windows 7, 8, 8.1 platforms** + +As we mentioned a year ago ([#447](https://github.com/static-web-server/static-web-server/pull/447)), SWS would not continue supporting legacy Windows 7, 8, and 8.1 platforms for so long as [Microsoft stopped support for Windows 7 in 2020](https://learn.microsoft.com/en-us/lifecycle/products/windows-7) and Rust requires *Windows 10* as the minimum supported platform since [1.78](https://blog.rust-lang.org/2024/02/26/Windows-7.html). + +Today, we announce that `v2.36.1` release is the last version supporting such legacy platforms and having Rust `1.76.0` as MSRV. +Future releases will bump up the MSRV when convenient and will require *Windows 10* as the minimum supported platform. +However, although we will *try* to provide a patch for users wanting to build SWS manually for those legacy platforms in the future, we *cannot* fully guarantee that SWS will continue building for the aforementioned platforms. + +__Fixes__ + +- [ad4c171](https://github.com/static-web-server/static-web-server/commit/ad4c171) Bugfix/security dependency updates including tokio, httparse, ring, rustls, bytes, serde and other crates. PR [#532](https://github.com/static-web-server/static-web-server/pull/532). +- [5fbd0c5](https://github.com/static-web-server/static-web-server/commit/5fbd0c5) CORS: Add missing `Origin` to the `Vary` header value when CORS feature enabled. PR [#534](https://github.com/static-web-server/static-web-server/pull/534) resolves [#533](https://github.com/static-web-server/static-web-server/issues/533) reported by [@rbozan](https://github.com/rbozan) + +For more details see the [v2.36.1 milestone](https://github.com/static-web-server/static-web-server/milestone/28?closed=1) and the full changelog [v2.36.0...v2.36.1](https://github.com/static-web-server/static-web-server/compare/v2.36.0...v2.36.1). + ## v2.36.0 - 2025-02-10 This new `v2.36.0` release brings several security and bug fixes. A bugfix for the trailing slash redirect, new feature to log from the `X-Real-IP` header as well as other improvements. @@ -26,6 +51,8 @@ __Refactorings__ - [8fa9cda](https://github.com/static-web-server/static-web-server/commit/8fa9cda) Improve fallback page path checking and logging. PR [#522](https://github.com/static-web-server/static-web-server/pull/522). - [0053d74](https://github.com/static-web-server/static-web-server/commit/0053d74) CI: Improve post release updates workflow. PR [#525](https://github.com/static-web-server/static-web-server/pull/525). +For more details see the [v2.36.0 milestone](https://github.com/static-web-server/static-web-server/milestone/27?closed=1) and the full changelog [v2.35.0...v2.36.0](https://github.com/static-web-server/static-web-server/compare/v2.35.0...v2.36.0). + ## v2.35.0 - 2025-01-10 This new `v2.35.0` release brings several security and bug fixes. A bugfix for the directory listing, new development Docker images as well as other improvements. diff --git a/Cargo.lock b/Cargo.lock index 8c086219..2bf2ec9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,15 +108,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "async-compression" -version = "0.4.18" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +checksum = "c0cf008e5e1a9e9e22a7d3c9a4992e21a350290069e36d8fb72304ed17e8f2d2" dependencies = [ "brotli", "flate2", @@ -169,16 +169,16 @@ checksum = "92758ad6077e4c76a6cadbce5005f666df70d4f13b19976b1a8062eef880040f" dependencies = [ "base64 0.22.1", "blowfish", - "getrandom 0.3.1", + "getrandom 0.3.2", "subtle", "zeroize", ] [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -250,9 +250,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "camino" @@ -309,9 +309,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.12" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc", @@ -326,14 +326,14 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "windows-targets", + "windows-link", ] [[package]] @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.28" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" +checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" dependencies = [ "clap_builder", "clap_derive", @@ -373,9 +373,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" dependencies = [ "anstream", "anstyle", @@ -385,9 +385,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.44" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375f9d8255adeeedd51053574fd8d4ba875ea5fa558e86617b07f09f1680c8b6" +checksum = "c06f5378ea264ad4f82bbc826628b5aad714a75abf6ece087e923010eb937fb6" dependencies = [ "clap", ] @@ -414,9 +414,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.28" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck", "proc-macro2", @@ -448,9 +448,9 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "compact_str" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" dependencies = [ "castaway", "cfg-if", @@ -550,9 +550,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", ] @@ -580,9 +580,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" @@ -611,9 +611,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -709,14 +709,14 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -746,9 +746,9 @@ checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "globset" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" dependencies = [ "aho-corasick", "bstr", @@ -853,9 +853,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1051,9 +1051,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1062,18 +1062,18 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] [[package]] name = "is_debug" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ea828c9d6638a5bd3d8b14e37502b4d56cae910ccf8a5b7f51c7a0eb1d0508" +checksum = "1fe266d2e243c931d8190177f20bf7f24eed45e96f39e87dc49a27b32d12d407" [[package]] name = "is_terminal_polyfill" @@ -1083,9 +1083,9 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" @@ -1114,9 +1114,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libgit2-sys" @@ -1132,9 +1132,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.21" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9b68e50e6e0b26f672573834882eb57759f6db9b3be2ea3c35c91188bb4eaa" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" dependencies = [ "cc", "libc", @@ -1144,9 +1144,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "listenfd" @@ -1177,9 +1177,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "maud" @@ -1242,9 +1242,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] @@ -1305,9 +1305,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" [[package]] name = "overload" @@ -1346,18 +1346,18 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -1378,9 +1378,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "powerfmt" @@ -1390,9 +1390,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -1443,18 +1443,24 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ "bitflags", ] @@ -1490,15 +1496,14 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -1517,9 +1522,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "0.38.44" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" dependencies = [ "bitflags", "errno", @@ -1530,9 +1535,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.22" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ "log", "once_cell", @@ -1560,9 +1565,9 @@ checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" dependencies = [ "ring", "rustls-pki-types", @@ -1571,15 +1576,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -1598,27 +1603,27 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -1627,18 +1632,18 @@ dependencies = [ [[package]] name = "serde_ignored" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e319a36d1b52126a0d608f24e93b2d81297091818cd70625fcf50a15d84ddf" +checksum = "566da67d80e92e009728b3731ff0e5360cb181432b8ca73ea30bb1d170700d76" dependencies = [ "serde", ] [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -1648,9 +1653,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", @@ -1776,9 +1781,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" @@ -1790,12 +1795,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1804,7 +1803,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static-web-server" -version = "2.36.0" +version = "2.36.1" dependencies = [ "aho-corasick", "anyhow", @@ -1824,6 +1823,7 @@ dependencies = [ "hyper", "lazy_static", "listenfd", + "litemap", "maud", "mime_guess", "mini-moka", @@ -1848,6 +1848,8 @@ dependencies = [ "tracing", "tracing-subscriber", "windows-service", + "zerofrom", + "zerofrom-derive", ] [[package]] @@ -1870,9 +1872,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.98" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -1898,13 +1900,12 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.16.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.2", "once_cell", "rustix", "windows-sys 0.59.0", @@ -1962,9 +1963,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -1979,15 +1980,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -2005,9 +2006,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes", @@ -2033,9 +2034,9 @@ dependencies = [ [[package]] name = "tokio-metrics" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eace09241d62c98b7eeb1107d4c5c64ca3bd7da92e8c218c153ab3a78f9be112" +checksum = "cb2bb07a8451c4c6fa8b3497ad198510d8b8dffa5df5cfb97a64102a58b113c8" dependencies = [ "futures-util", "pin-project-lite", @@ -2045,9 +2046,9 @@ dependencies = [ [[package]] name = "tokio-metrics-collector" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8092b7a97ed5dac2f44892db190eca8f476ede0fa585bc87664de4151cd0b64" +checksum = "32a78b1d1a001e75e5f29669ac7b9288f44ad1af7afcbd6ea77add41214db716" dependencies = [ "lazy_static", "parking_lot", @@ -2058,9 +2059,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", "tokio", @@ -2079,9 +2080,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -2113,9 +2114,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.23" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "serde", @@ -2190,9 +2191,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "tz-rs" @@ -2231,9 +2232,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-xid" @@ -2284,9 +2285,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.13.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" [[package]] name = "valuable" @@ -2333,9 +2334,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -2400,9 +2401,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -2444,6 +2445,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + [[package]] name = "windows-service" version = "0.7.0" @@ -2539,18 +2546,18 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags", ] @@ -2642,27 +2649,27 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index d48a39c6..c746ec53 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "static-web-server" -version = "2.36.0" +version = "2.36.1" edition = "2021" rust-version = "1.76.0" authors = ["Jose Quintana "] @@ -40,7 +40,7 @@ doc = false # All features enabled by default default = ["compression", "http2", "directory-listing", "basic-auth", "fallback-page"] # Include all features (used when building SWS binaries) -all = ["default", "experimental"] +all = ["default"] # HTTP2 http2 = ["tokio-rustls", "rustls-pemfile"] # Compression @@ -68,7 +68,7 @@ bytes = "1.10" chrono = { version = "0.4", default-features = false, features = ["std", "clock"], optional = true } clap = { version = "4.5", features = ["derive", "env"] } clap_allgen = "0.2.1" -compact_str = { version = "0.8.1", optional = true } +compact_str = { version = "0.9.0", optional = true } form_urlencoded = "1.2" futures-util = { version = "0.3", default-features = false } globset = { version = "0.4", features = ["serde1"] } @@ -97,14 +97,19 @@ toml = "0.8" tracing = { version = "0.1", default-features = false, features = ["std"] } tracing-subscriber = { version = "0.3", default-features = false, features = ["smallvec", "registry", "parking_lot", "fmt", "ansi", "tracing-log"] } +# NOTE: pinning dependencies temporarily (MSRV 1.76.0) because 0.1.6+ requires rustc 1.81 or newer +zerofrom = "=0.1.5" +zerofrom-derive = "=0.1.5" +litemap = "=0.7.4" + [target.'cfg(all(target_env = "musl", target_pointer_width = "64"))'.dependencies.tikv-jemallocator] version = "0.6" [target.'cfg(unix)'.dependencies] signal-hook = { version = "0.3", features = ["extended-siginfo"] } signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"], default-features = false } -tokio-metrics-collector = { version = "0.2", optional = true } -prometheus = { version = "0.13", optional = true } +tokio-metrics-collector = { version = "0.3", optional = true } +prometheus = { version = "0.13.4", default-features = false, optional = true } [target.'cfg(windows)'.dependencies] windows-service = "0.7" @@ -128,7 +133,8 @@ strip = true [package.metadata.docs.rs] all-features = true -rustdoc-args = ["--cfg", "docsrs"] +rustdoc-args = ["--cfg", "docsrs", "--cfg", "tokio_unstable"] +rustc-args = ["--cfg", "tokio_unstable"] # Cross: workaround for https://github.com/cross-rs/cross/issues/1345 [package.metadata.cross.target.x86_64-unknown-netbsd] diff --git a/docs/content/download-and-install.md b/docs/content/download-and-install.md index a954fd45..24f7f9e5 100644 --- a/docs/content/download-and-install.md +++ b/docs/content/download-and-install.md @@ -1,13 +1,13 @@ # Download and Install -Latest **v2.35.0** release `2025-01-10` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.35.0), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-SHA256SUM)) +Latest **v2.36.0** release `2025-02-10` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.36.0), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-SHA256SUM)) @@ -31,7 +31,7 @@ curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh Alternatively, you can install a specific version of SWS to a custom location by setting environment variables. ```sh -export SWS_INSTALL_VERSION="2.35.0" # full list at https://github.com/static-web-server/static-web-server/tags +export SWS_INSTALL_VERSION="2.36.0" # full list at https://github.com/static-web-server/static-web-server/tags export SWS_INSTALL_DIR="~/.local/bin" curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh ``` @@ -111,69 +111,69 @@ Pre-compiled binaries grouped by CPU architectures. ### x86_64 -- [static-web-server-v2.35.0-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-apple-darwin.tar.gz)
-**SHA256SUM:** `bebed68f1bf2c044a5bf6ffa30afae34694ca2009c6df2ff9968f5a0221ecb0e` -- [static-web-server-v2.35.0-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-pc-windows-gnu.zip)
-**SHA256SUM:** `5161067b9f417eda2e1c184b1f78808e27ca759c0ed327630c1b42d5323a90d5` -- [static-web-server-v2.35.0-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-pc-windows-msvc.zip)
-**SHA256SUM:** `e3b8811f380534ccee2cc68b563dad90e3699fe0ef2721c8142ac7a51a1f18e3` -- [static-web-server-v2.35.0-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-unknown-freebsd.tar.gz)
-**SHA256SUM:** `81059421d64e9d0b6d5864321d827751e7641b8a9a015bbbfca734e04e588080` -- [static-web-server-v2.35.0-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `f4c65b17c1f5ba02e1954861f8a164520f52fb3dadd16eea4edf51b738a8e9bd` -- [static-web-server-v2.35.0-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `8b4e3a453ff206366571e9e0bbc337bc56a58a890dd74fc8cb58434010935b4c` -- [static-web-server-v2.35.0-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-unknown-netbsd.tar.gz)
-**SHA256SUM:** `95a3401d3295ce31c2b3214b9c19a9abe756ae7fd5119e144a0093ccd10dc1be` -- [static-web-server-v2.35.0-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-x86_64-unknown-illumos.tar.gz)
-**SHA256SUM:** `456ca76fea76a949540513fda76d4cd0a6c17366de8eece3046fa6e1902f8df0` +- [static-web-server-v2.36.0-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-apple-darwin.tar.gz)
+**SHA256SUM:** `83f5f35197ef9b35475019eba5cd44004f72cecccc61957f2045b26881790c9b` +- [static-web-server-v2.36.0-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-pc-windows-gnu.zip)
+**SHA256SUM:** `73992f047066aa39d6d28421429b05bbd877c428420a029e8cca5251fc4b1af7` +- [static-web-server-v2.36.0-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-pc-windows-msvc.zip)
+**SHA256SUM:** `2a0071fd3978bd5fbb09a154e0c1d09672cacd6f9356ebeb25e76bb4d7ee1af9` +- [static-web-server-v2.36.0-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-unknown-freebsd.tar.gz)
+**SHA256SUM:** `862741bb4490a2770325b5b08c475c92bf23c7a297c856ed2df2f9ec631d31e6` +- [static-web-server-v2.36.0-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `170d3b99e5f08c61e38caa8335e91fca0c0156c6f3fba1c00b3a2763e16dc7d4` +- [static-web-server-v2.36.0-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `2c047e9e58a6c62a31a2a86f15e45543db1bac6c3e0781b656e39e321d94a618` +- [static-web-server-v2.36.0-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-unknown-netbsd.tar.gz)
+**SHA256SUM:** `6d16bd2fea21186e03e641e043acd49fea76d0993a2fee65c9f7153ecf8bccbf` +- [static-web-server-v2.36.0-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-x86_64-unknown-illumos.tar.gz)
+**SHA256SUM:** `f45facda3d4164e3f6cd3be9b9b38633d5f36e30ecb3a8100c061e4af9ff26e3` ### ARM64 -- [static-web-server-v2.35.0-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-aarch64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `92e34f7ceaef3d5eef0601e8b2b5fb6bb95fb7a004bf5147495cb3dfc6e8934d` -- [static-web-server-v2.35.0-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-aarch64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `2aa25aba0bef4d6a3b3bbe16e315cf7caf323895b970ce3ae723cf33a3277022` -- [static-web-server-v2.35.0-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-aarch64-apple-darwin.tar.gz)
-**SHA256SUM:** `4a4a9536c9b420ac2db6ac6018416785aeae4bc9b6e884edeb295493ce313deb` -- [static-web-server-v2.35.0-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-aarch64-linux-android.tar.gz)
-**SHA256SUM:** `a5c02ecf4f6e47bea1f6d91d6f67e7bc1e5b1dc805d147990712b60119f96fb6` -- [static-web-server-v2.35.0-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-aarch64-pc-windows-msvc.zip)
-**SHA256SUM:** `84ee0402a1cd6eff503733d21ca9998dcfe84f0980cd1830e2476a70cea6a271` +- [static-web-server-v2.36.0-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-aarch64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `166fcac258a7d6bd644d427da005bde2212c57031c88a34526f25b859c3ef2a8` +- [static-web-server-v2.36.0-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-aarch64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `c61e8ecad98309c8a82f101f6a2b43932bcc0fdddaa06231968bd17e56e9f488` +- [static-web-server-v2.36.0-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-aarch64-apple-darwin.tar.gz)
+**SHA256SUM:** `4cb4170bb221edaea86fcdc67152aeb125764054b54da0f1afeec3cd7e737b5e` +- [static-web-server-v2.36.0-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-aarch64-linux-android.tar.gz)
+**SHA256SUM:** `f77a638c606ea830fcd14685f27778deda1ffdc6a6e97058e51f9e77acb66833` +- [static-web-server-v2.36.0-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-aarch64-pc-windows-msvc.zip)
+**SHA256SUM:** `db8440d04ab0a2e8a229197da5c61344bb4760b7f1add33ba21443e323b8b8f1` ### x86 -- [static-web-server-v2.35.0-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-i686-pc-windows-msvc.zip)
-**SHA256SUM:** `80309dcdfd900933747b03dbbb85aed285a379d60a62d9cb80ac91638269b323` -- [static-web-server-v2.35.0-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-i686-unknown-freebsd.tar.gz)
-**SHA256SUM:** `b232e7c6295b74b98aef4b2f3575248403e3b71b287ba710b2042fcad991e14b` -- [static-web-server-v2.35.0-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-i686-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `928a07a91dba97375f278d2169abb2f1485b49f48977c8473fb67a77f8aa06af` -- [static-web-server-v2.35.0-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-i686-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `78317385b0de4ed44eb6a1d4854bb311668845fd3a782774e5667541dc53e11f` +- [static-web-server-v2.36.0-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-i686-pc-windows-msvc.zip)
+**SHA256SUM:** `5cdd9933ebf7c1621744412a83263ecc5cd0fd6a15d75f3aeb12698e72bd7553` +- [static-web-server-v2.36.0-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-i686-unknown-freebsd.tar.gz)
+**SHA256SUM:** `f84d9548f82a044fc4d7a07e341e79afb7c8b8bf5ad01ed4ce584c21493b569a` +- [static-web-server-v2.36.0-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-i686-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `9dd732810c6ab9132d17683fac8927811f656c1b45917adfadfa7e96fdc5e89e` +- [static-web-server-v2.36.0-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-i686-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `7b5fe36b8ca2affc4c535ca3d2649ba5960b23be5f769005907c376dac504ae0` ### ARM -- [static-web-server-v2.35.0-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-arm-unknown-linux-gnueabihf.tar.gz)
-**SHA256SUM:** `899254ab51d1a50962410d25fce8770dc72370bb5b89acb8b7ee6f33a6028d26` -- [static-web-server-v2.35.0-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-arm-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `945e33358074d13412e9ea0c332e6b00baa127f99db88273f1de36aa19176e2b` -- [static-web-server-v2.35.0-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-armv7-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `067638c309b3a25b0df069dde66f7034cb70e39e145bbb79cf58350075b870ec` +- [static-web-server-v2.36.0-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-arm-unknown-linux-gnueabihf.tar.gz)
+**SHA256SUM:** `9ad5935882f4fdea5cd990ba4341662141e6ab22ed86f5df1700be43a3944d6d` +- [static-web-server-v2.36.0-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-arm-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `260f17e12c7a23dbd191db596421e76caa1532d29dde0f6861c56b25e2c9f8da` +- [static-web-server-v2.36.0-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-armv7-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `1066219a8dd30bfc9760b2ba4eeb381effeddc435feaa060f4d3d7f7785c9e5d` ### PowerPC -- [static-web-server-v2.35.0-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-powerpc64le-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `618f5c29c96cba22cf045637658c78257486e640c57d14c9b656e5ba868a01a7` +- [static-web-server-v2.36.0-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-powerpc64le-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `0e0064c7317c549cec0efff824aa0f0f1900e0375777eac7a1ff64633200b542` ### S390X -- [static-web-server-v2.35.0-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.35.0/static-web-server-v2.35.0-s390x-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `bff30e26cc618281c8b990863408036104eb19dbc5143a9666b9b9b4ff1a849f` +- [static-web-server-v2.36.0-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.36.0/static-web-server-v2.36.0-s390x-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `6e49ff4e2c1eed474212e68927ab26856d92a94ec8adfdceb25abf3dcbc32c67` ## Source files -- [static-web-server-2.35.0.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.35.0.tar.gz)
-**SHA256SUM:** `adf260f0aa3ccc18955f9f68ce11356c8d0e3fbb0d9b9446b137430427dafb3b` -- [static-web-server-2.35.0.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.35.0.zip)
-**SHA256SUM:** `964b4eb3830d3f161a02f334955006da884de433badb801f11280e095d3b3df8` +- [static-web-server-2.36.0.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.36.0.tar.gz)
+**SHA256SUM:** `bb99fd25835050e9572ea4589f66b94a64d1724712a2f4881ab35f29d1d8f2a9` +- [static-web-server-2.36.0.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.36.0.zip)
+**SHA256SUM:** `c03d487ab8b925e482a43fd147106819b2f977ff19fe074ca61f91f2115ccdd4` diff --git a/scripts/installer.sh b/scripts/installer.sh index baad1972..ce26409a 100755 --- a/scripts/installer.sh +++ b/scripts/installer.sh @@ -23,7 +23,7 @@ fi set -u # SWS latest version -version=${SWS_INSTALL_VERSION:-"2.35.0"} +version=${SWS_INSTALL_VERSION:-"2.36.0"} # Default directory where SWS will be installed local_bin=${SWS_INSTALL_DIR:-"/usr/local/bin"} diff --git a/src/compression.rs b/src/compression.rs index babfe449..f51885fd 100644 --- a/src/compression.rs +++ b/src/compression.rs @@ -104,10 +104,16 @@ pub(crate) fn post_process( } // Compression content encoding varies so use a `Vary` header - resp.headers_mut().insert( - hyper::header::VARY, + let value = resp.headers().get(hyper::header::VARY).map_or( HeaderValue::from_name(hyper::header::ACCEPT_ENCODING), + |h| { + let mut s = h.to_str().unwrap_or_default().to_owned(); + s.push(','); + s.push_str(hyper::header::ACCEPT_ENCODING.as_str()); + HeaderValue::from_str(s.as_str()).unwrap() + }, ); + resp.headers_mut().insert(hyper::header::VARY, value); // Auto compression based on the `Accept-Encoding` header match auto(req.method(), req.headers(), opts.compression_level, resp) { diff --git a/src/compression_static.rs b/src/compression_static.rs index 7a64a916..b1ec5150 100644 --- a/src/compression_static.rs +++ b/src/compression_static.rs @@ -45,10 +45,16 @@ pub(crate) fn post_process( } // Compression content encoding varies so use a `Vary` header - resp.headers_mut().insert( - hyper::header::VARY, + let value = resp.headers().get(hyper::header::VARY).map_or( HeaderValue::from_name(hyper::header::ACCEPT_ENCODING), + |h| { + let mut s = h.to_str().unwrap_or_default().to_owned(); + s.push(','); + s.push_str(hyper::header::ACCEPT_ENCODING.as_str()); + HeaderValue::from_str(s.as_str()).unwrap() + }, ); + resp.headers_mut().insert(hyper::header::VARY, value); Ok(resp) } diff --git a/src/cors.rs b/src/cors.rs index 3cb5953d..6fd9a21e 100644 --- a/src/cors.rs +++ b/src/cors.rs @@ -429,6 +429,10 @@ pub(crate) fn post_process( for (k, v) in headers.iter() { resp.headers_mut().insert(k, v.to_owned()); } + resp.headers_mut().insert( + hyper::header::VARY, + HeaderValue::from_name(hyper::header::ORIGIN), + ); resp.headers_mut().remove(http::header::ALLOW); } } diff --git a/src/testing.rs b/src/testing.rs index d92c45ce..c05da86e 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -29,8 +29,11 @@ pub mod fixtures { Settings::get_unparsed(false).unwrap() } - /// Create a `RequestHandler` from a custom TOML config file (fixture). - pub fn fixture_req_handler(general: General, advanced: Option) -> RequestHandler { + /// Create a `RequestHandlerOpts` from the given options (fixture). + pub fn fixture_req_handler_opts( + general: General, + advanced: Option, + ) -> RequestHandlerOpts { #[cfg(not(any( feature = "compression", feature = "compression-gzip", @@ -64,7 +67,7 @@ pub mod fixtures { ))] let compression_static = general.compression_static; - let req_handler_opts = RequestHandlerOpts { + RequestHandlerOpts { root_dir: general.root, compression, compression_static, @@ -110,8 +113,11 @@ pub mod fixtures { #[cfg(feature = "experimental")] memory_cache: None, advanced_opts: advanced, - }; + } + } + /// Create a `RequestHandler` from a custom TOML config file (fixture). + pub fn fixture_req_handler(req_handler_opts: RequestHandlerOpts) -> RequestHandler { RequestHandler { opts: Arc::from(req_handler_opts), } diff --git a/tests/compression.rs b/tests/compression.rs index 2ca82293..35ea122a 100644 --- a/tests/compression.rs +++ b/tests/compression.rs @@ -18,7 +18,9 @@ pub mod tests { use static_web_server::{ settings::cli::General, - testing::fixtures::{fixture_req_handler, fixture_settings, REMOTE_ADDR}, + testing::fixtures::{ + fixture_req_handler, fixture_req_handler_opts, fixture_settings, REMOTE_ADDR, + }, }; #[tokio::test] @@ -29,7 +31,8 @@ pub mod tests { compression_static: true, ..opts.general }; - let req_handler = fixture_req_handler(general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -63,10 +66,20 @@ pub mod tests { res.headers().get("server"), Some(&HeaderValue::from_static("Static Web Server")) ); + + let vary_values = res + .headers() + .get("vary") + .unwrap() + .to_str() + .unwrap() + .rsplit(',') + .map(|f| f.trim()) + .collect::>(); + const EXPECTED: [&str; 1] = ["accept-encoding"]; + assert!(EXPECTED.iter().all(|s| vary_values.contains(s))); } - Err(err) => { - panic!("unexpected error: {err}") - } + Err(err) => panic!("unexpected error: {err}"), }; } } diff --git a/tests/compression_static.rs b/tests/compression_static.rs index 63492961..bb670415 100644 --- a/tests/compression_static.rs +++ b/tests/compression_static.rs @@ -13,329 +13,251 @@ #[cfg(test)] mod tests { use bytes::Bytes; - use headers::HeaderMap; - use http::Method; + use hyper::Request; + use std::net::SocketAddr; use std::path::PathBuf; #[cfg(feature = "directory-listing")] use static_web_server::directory_listing::DirListFmt; - use static_web_server::static_files::{self, HandleOpts}; - - fn public_dir() -> PathBuf { - PathBuf::from("docker/public/") - } + use static_web_server::{ + settings::cli::General, + testing::fixtures::{ + fixture_req_handler, fixture_req_handler_opts, fixture_settings, REMOTE_ADDR, + }, + }; #[tokio::test] async fn compression_static_file_exists() { - let mut headers = HeaderMap::new(); - headers.insert( - http::header::ACCEPT_ENCODING, - "gzip, deflate, br".parse().unwrap(), - ); - - let index_gz_path = PathBuf::from("tests/fixtures/public/index.html.gz"); - let index_gz_path_public = public_dir().join("index.html.gz"); - std::fs::copy(&index_gz_path, &index_gz_path_public) - .expect("unexpected error copying fixture file"); + let archive_path = PathBuf::from("tests/fixtures/public/index.html.gz"); + let archive_buf = + std::fs::read(&archive_path).expect("unexpected error when reading archive file"); + let archive_buf = Bytes::from(archive_buf); - let result = static_files::handle(&HandleOpts { - method: &Method::GET, - headers: &headers, - base_path: &public_dir(), - uri_path: "index.html", - uri_query: None, - #[cfg(feature = "experimental")] - memory_cache: None, - #[cfg(feature = "directory-listing")] - dir_listing: false, - #[cfg(feature = "directory-listing")] - dir_listing_order: 6, - #[cfg(feature = "directory-listing")] - dir_listing_format: &DirListFmt::Html, - redirect_trailing_slash: true, - #[cfg(any( - feature = "compression", - feature = "compression-deflate", - feature = "compression-gzip", - feature = "compression-brotli", - feature = "compression-zstd" - ))] + let opts = fixture_settings("toml/handler_fixtures.toml"); + let general = General { compression_static: true, - ignore_hidden_files: false, - disable_symlinks: false, - index_files: &[], - }) - .await - .expect("unexpected error response on `handle` function"); - let mut res = result.resp; - - let index_gz_buf = - std::fs::read(&index_gz_path).expect("unexpected error when reading index.html.gz"); - let index_gz_buf = Bytes::from(index_gz_buf); - - std::fs::remove_file(index_gz_path_public).unwrap(); - - let headers = res.headers(); - - assert_eq!(res.status(), 200); - assert!(!headers.contains_key("content-length")); - assert_eq!(headers["content-encoding"], "gzip"); - assert_eq!(headers["accept-ranges"], "bytes"); - assert!(!headers["last-modified"].is_empty()); - assert_eq!( - &headers["content-type"], "text/html", - "content-type is not html" + ..opts.general + }; + let req_handler_opts = fixture_req_handler_opts(general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); + + let mut req = Request::default(); + *req.method_mut() = hyper::Method::GET; + *req.uri_mut() = "http://localhost/index.html".parse().unwrap(); + req.headers_mut().insert( + http::header::ACCEPT_ENCODING, + "gzip, deflate, br".parse().unwrap(), ); - let body = hyper::body::to_bytes(res.body_mut()) - .await - .expect("unexpected bytes error during `body` conversion"); - - assert_eq!( - body, index_gz_buf, - "body and index_gz_buf are not equal in length" - ); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + match req_handler.handle(&mut req, remote_addr).await { + Ok(mut res) => { + let headers = res.headers(); + + assert_eq!(res.status(), 200); + assert!(!headers.contains_key("content-length")); + assert_eq!(headers["content-encoding"], "gzip"); + assert_eq!(headers["accept-ranges"], "bytes"); + assert!(!headers["last-modified"].is_empty()); + assert_eq!( + &headers["content-type"], "text/html", + "content-type is not html" + ); + assert_eq!(headers["vary"], "accept-encoding"); + + let body = hyper::body::to_bytes(res.body_mut()) + .await + .expect("unexpected bytes error during `body` conversion"); + + assert_eq!( + body, archive_buf, + "body and archive_buf are not equal in length" + ); + } + Err(err) => panic!("unexpected error: {err}"), + }; } #[tokio::test] async fn compression_static_suboptimal_file_exists() { - let mut headers = HeaderMap::new(); - headers.insert( - http::header::ACCEPT_ENCODING, - "gzip, deflate, br, zstd".parse().unwrap(), - ); - - let index_br_path = PathBuf::from("tests/fixtures/public/404.html.br"); - let index_br_path_public = public_dir().join("404.html.br"); - std::fs::copy(&index_br_path, &index_br_path_public) - .expect("unexpected error copying fixture file"); + let archive_path = PathBuf::from("tests/fixtures/public/404.html.br"); + let archive_buf = + std::fs::read(&archive_path).expect("unexpected error when reading archive file"); + let archive_buf = Bytes::from(archive_buf); - let result = static_files::handle(&HandleOpts { - method: &Method::GET, - headers: &headers, - base_path: &public_dir(), - uri_path: "404.html", - uri_query: None, - #[cfg(feature = "experimental")] - memory_cache: None, - #[cfg(feature = "directory-listing")] - dir_listing: false, - #[cfg(feature = "directory-listing")] - dir_listing_order: 6, - #[cfg(feature = "directory-listing")] - dir_listing_format: &DirListFmt::Html, - redirect_trailing_slash: true, - #[cfg(any( - feature = "compression", - feature = "compression-deflate", - feature = "compression-gzip", - feature = "compression-brotli", - feature = "compression-zstd" - ))] + let opts = fixture_settings("toml/handler_fixtures.toml"); + let general = General { compression_static: true, - ignore_hidden_files: false, - disable_symlinks: false, - index_files: &[], - }) - .await - .expect("unexpected error response on `handle` function"); - let mut res = result.resp; - - let index_br_buf = - std::fs::read(&index_br_path).expect("unexpected error when reading index.html.br"); - let index_br_buf = Bytes::from(index_br_buf); - - std::fs::remove_file(index_br_path_public).unwrap(); - - let headers = res.headers(); - - assert_eq!(res.status(), 200); - assert!(!headers.contains_key("content-length")); - assert_eq!(headers["content-encoding"], "br"); - assert_eq!(headers["accept-ranges"], "bytes"); - assert!(!headers["last-modified"].is_empty()); - assert_eq!( - &headers["content-type"], "text/html", - "content-type is not html" + ..opts.general + }; + let req_handler_opts = fixture_req_handler_opts(general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); + + let mut req = Request::default(); + *req.method_mut() = hyper::Method::GET; + *req.uri_mut() = "http://localhost/404.html".parse().unwrap(); + req.headers_mut().insert( + http::header::ACCEPT_ENCODING, + "gzip, deflate, br, zstd".parse().unwrap(), ); - let body = hyper::body::to_bytes(res.body_mut()) - .await - .expect("unexpected bytes error during `body` conversion"); - - assert_eq!( - body, index_br_buf, - "body and index_br_buf are not equal in length" - ); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + match req_handler.handle(&mut req, remote_addr).await { + Ok(mut res) => { + let headers = res.headers(); + + assert_eq!(res.status(), 200); + assert!(!headers.contains_key("content-length")); + assert_eq!(headers["content-encoding"], "br"); + assert_eq!(headers["accept-ranges"], "bytes"); + assert!(!headers["last-modified"].is_empty()); + assert_eq!( + &headers["content-type"], "text/html", + "content-type is not html" + ); + assert_eq!(headers["vary"], "accept-encoding"); + + let body = hyper::body::to_bytes(res.body_mut()) + .await + .expect("unexpected bytes error during `body` conversion"); + + assert_eq!( + body, archive_buf, + "body and archive_buf are not equal in length" + ); + } + Err(err) => panic!("unexpected error: {err}"), + } } #[tokio::test] async fn compression_static_file_does_not_exist() { - let mut headers = HeaderMap::new(); - headers.insert( - http::header::ACCEPT_ENCODING, - "gzip, deflate, br".parse().unwrap(), - ); - - let index_path_public = public_dir().join("assets/index.html"); - - let result = static_files::handle(&HandleOpts { - method: &Method::GET, - headers: &headers, - base_path: &public_dir().join("assets/"), - uri_path: "index.html", - uri_query: None, - #[cfg(feature = "experimental")] - memory_cache: None, - #[cfg(feature = "directory-listing")] - dir_listing: false, - #[cfg(feature = "directory-listing")] - dir_listing_order: 6, - #[cfg(feature = "directory-listing")] - dir_listing_format: &DirListFmt::Html, - redirect_trailing_slash: true, - #[cfg(any( - feature = "compression", - feature = "compression-deflate", - feature = "compression-gzip", - feature = "compression-brotli", - feature = "compression-zstd" - ))] + let opts = fixture_settings("toml/handler_fixtures.toml"); + let general = General { + compression: false, compression_static: true, - ignore_hidden_files: false, - disable_symlinks: false, - index_files: &[], - }) - .await - .expect("unexpected error response on `handle` function"); - let mut res = result.resp; - - let index_buf = - std::fs::read(&index_path_public).expect("unexpected error when reading index.html"); - let index_buf = Bytes::from(index_buf); - - let headers = res.headers(); - - assert_eq!(res.status(), 200); - assert!(headers.contains_key("content-length")); - assert_eq!(headers["accept-ranges"], "bytes"); - assert!(!headers["last-modified"].is_empty()); - assert_eq!( - &headers["content-type"], "text/html", - "content-type is not html" - ); - - let body = hyper::body::to_bytes(res.body_mut()) - .await - .expect("unexpected bytes error during `body` conversion"); - - assert_eq!( - body, index_buf, - "body and index_gz_buf are not equal in length" - ); + ..opts.general + }; + let req_handler_opts = fixture_req_handler_opts(general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); + + let mut req = Request::default(); + *req.method_mut() = hyper::Method::GET; + *req.uri_mut() = "http://localhost/index.htm".parse().unwrap(); + req.headers_mut() + .insert(http::header::ACCEPT_ENCODING, "br".parse().unwrap()); + + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + match req_handler.handle(&mut req, remote_addr).await { + Ok(res) => { + let headers = res.headers(); + + assert_eq!(res.status(), 200); + assert!(headers.contains_key("content-length")); + assert_eq!(headers["accept-ranges"], "bytes"); + assert!(!headers.contains_key("content-encoding")); + assert!(!headers["last-modified"].is_empty()); + assert_eq!( + &headers["content-type"], "text/html", + "content-type is not html" + ); + assert_eq!(headers["vary"], "accept-encoding"); + } + Err(err) => panic!("unexpected error: {err}"), + } } #[cfg(feature = "directory-listing")] #[tokio::test] - async fn compression_static_base_path_as_dot() { - let mut headers = HeaderMap::new(); - headers.insert( - http::header::ACCEPT_ENCODING, - "gzip, deflate, br".parse().unwrap(), - ); - - let base_path = PathBuf::from("."); - - static_files::handle(&HandleOpts { - method: &Method::GET, - headers: &headers, - base_path: &base_path, - uri_path: "/", - uri_query: None, - #[cfg(feature = "experimental")] - memory_cache: None, - dir_listing: true, - dir_listing_order: 6, - dir_listing_format: &DirListFmt::Html, - redirect_trailing_slash: true, + async fn compression_static_index_file() { + let opts = fixture_settings("toml/handler_fixtures.toml"); + let general = General { + compression: false, compression_static: true, + directory_listing: true, + directory_listing_format: DirListFmt::Html, ignore_hidden_files: false, disable_symlinks: false, - index_files: &[], - }) - .await - .expect("unexpected error response on `handle` function"); + ..opts.general + }; + let req_handler_opts = fixture_req_handler_opts(general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); + + let mut req = Request::default(); + *req.method_mut() = hyper::Method::GET; + *req.uri_mut() = "http://localhost".parse().unwrap(); + req.headers_mut() + .insert(http::header::ACCEPT_ENCODING, "zstd, gzip".parse().unwrap()); + + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + match req_handler.handle(&mut req, remote_addr).await { + Ok(res) => { + let headers = res.headers(); + + assert_eq!(res.status(), 200); + assert_eq!(headers["accept-ranges"], "bytes"); + assert_eq!(headers["content-encoding"], "gzip"); + assert!(!headers["last-modified"].is_empty()); + assert_eq!( + &headers["content-type"], "text/html", + "content-type is not html" + ); + assert_eq!(headers["vary"], "accept-encoding"); + } + Err(err) => panic!("unexpected error: {err}"), + } } #[tokio::test] async fn compression_static_zstd_file_exists() { - let mut headers = HeaderMap::new(); - headers.insert( + let archive_path = PathBuf::from("tests/fixtures/public/main.js.zst"); + let archive_buf = + std::fs::read(&archive_path).expect("unexpected error when reading archive file"); + let archive_buf = Bytes::from(archive_buf); + + let opts = fixture_settings("toml/handler_fixtures.toml"); + let general = General { + compression: false, + compression_static: true, + ..opts.general + }; + let req_handler_opts = fixture_req_handler_opts(general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); + + let mut req = Request::default(); + *req.method_mut() = hyper::Method::GET; + *req.uri_mut() = "http://localhost/main.js".parse().unwrap(); + req.headers_mut().insert( http::header::ACCEPT_ENCODING, "gzip, deflate, br, zstd".parse().unwrap(), ); - let mainjs_zst_path = PathBuf::from("tests/fixtures/public/main.js.zst"); - let mainjs_zst_path_public = public_dir().join("main.js.zst"); - std::fs::copy(&mainjs_zst_path, &mainjs_zst_path_public) - .expect("unexpected error copying fixture file"); - - let result = static_files::handle(&HandleOpts { - method: &Method::GET, - headers: &headers, - base_path: &public_dir(), - uri_path: "main.js", - uri_query: None, - #[cfg(feature = "experimental")] - memory_cache: None, - #[cfg(feature = "directory-listing")] - dir_listing: false, - #[cfg(feature = "directory-listing")] - dir_listing_order: 6, - #[cfg(feature = "directory-listing")] - dir_listing_format: &DirListFmt::Html, - redirect_trailing_slash: true, - #[cfg(any( - feature = "compression", - feature = "compression-deflate", - feature = "compression-gzip", - feature = "compression-brotli", - feature = "compression-zstd" - ))] - compression_static: true, - ignore_hidden_files: false, - disable_symlinks: false, - index_files: &[], - }) - .await - .expect("unexpected error response on `handle` function"); - let mut res = result.resp; - - let mainjs_zst_buf = - std::fs::read(&mainjs_zst_path).expect("unexpected error when reading index.html.gz"); - let mainjs_zst_buf = Bytes::from(mainjs_zst_buf); - - std::fs::remove_file(mainjs_zst_path_public).unwrap(); - - let headers = res.headers(); - - assert_eq!(res.status(), 200); - assert!(!headers.contains_key("content-length")); - assert_eq!(headers["content-encoding"], "zstd"); - assert_eq!(headers["accept-ranges"], "bytes"); - assert!(!headers["last-modified"].is_empty()); - assert_eq!( - &headers["content-type"], "text/javascript", - "content-type is not javascript" - ); - - let body = hyper::body::to_bytes(res.body_mut()) - .await - .expect("unexpected bytes error during `body` conversion"); - - assert_eq!( - body, mainjs_zst_buf, - "body and mainjs_zst_buf are not equal in length" - ); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + match req_handler.handle(&mut req, remote_addr).await { + Ok(mut res) => { + let headers = res.headers(); + + assert_eq!(res.status(), 200); + assert!(!headers.contains_key("content-length")); + assert_eq!(headers["content-encoding"], "zstd"); + assert_eq!(headers["accept-ranges"], "bytes"); + assert!(!headers["last-modified"].is_empty()); + assert_eq!( + &headers["content-type"], "text/javascript", + "content-type is not javascript" + ); + assert_eq!(headers["vary"], "accept-encoding"); + + let body = hyper::body::to_bytes(res.body_mut()) + .await + .expect("unexpected bytes error during `body` conversion"); + + assert_eq!( + body, archive_buf, + "body and archive_buf are not equal in length" + ); + } + Err(err) => panic!("unexpected error: {err}"), + } } } diff --git a/tests/cors.rs b/tests/cors.rs index 1a976916..8f987108 100644 --- a/tests/cors.rs +++ b/tests/cors.rs @@ -5,9 +5,15 @@ #[cfg(test)] mod tests { - use headers::HeaderMap; - use http::Method; + use headers::{HeaderMap, HeaderValue}; + use hyper::{Method, Request}; + use std::net::SocketAddr; + use static_web_server::cors; + use static_web_server::http_ext::MethodExt; + use static_web_server::testing::fixtures::{ + fixture_req_handler, fixture_req_handler_opts, fixture_settings, REMOTE_ADDR, + }; #[test] fn allow_methods() { @@ -23,7 +29,21 @@ mod tests { headers.insert("origin", "https://localhost".parse().unwrap()); headers.insert("access-control-request-method", "GET".parse().unwrap()); for method in methods { - assert!(cors.check_request(method, &headers).is_ok()); + let res = cors.check_request(method, &headers); + assert!(res.is_ok()); + + let (res_headers, _) = res.unwrap(); + let allow_methods = res_headers + .get("access-control-allow-methods") + .unwrap() + .to_str() + .unwrap() + .rsplit(',') + .map(|f| f.trim()) + .collect::>(); + + const EXPECTED: [&str; 3] = ["GET", "OPTIONS", "HEAD"]; + EXPECTED.iter().all(|s| allow_methods.contains(s)); } } @@ -164,4 +184,90 @@ mod tests { } } } + + #[tokio::test] + async fn handler_allowed_methods() { + let mut settings = fixture_settings("toml/handler.toml"); + let origin = "http://localhost".to_owned(); + settings.general.cors_allow_origins = origin.clone(); + + let mut req_handler_opts = fixture_req_handler_opts(settings.general, settings.advanced); + req_handler_opts.cors = cors::new("*", "", ""); + let req_handler = fixture_req_handler(req_handler_opts); + + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + + let methods = [ + Method::CONNECT, + Method::DELETE, + Method::GET, + Method::HEAD, + Method::PATCH, + Method::POST, + Method::PUT, + Method::TRACE, + ]; + for method in methods { + let mut req = Request::default(); + let mut headers = HeaderMap::new(); + headers.insert("origin", HeaderValue::from_str(origin.as_str()).unwrap()); + headers.insert( + "access-control-request-method", + "GET, HEAD, OPTIONS".parse().unwrap(), + ); + *req.method_mut() = method.clone(); + *req.headers_mut() = headers; + *req.uri_mut() = "http://localhost/assets/index.html".parse().unwrap(); + + match req_handler.handle(&mut req, remote_addr).await { + Ok(resp) => { + if method.is_allowed() { + assert_eq!(resp.status(), 200); + assert_eq!( + resp.headers().get("content-type"), + Some(&HeaderValue::from_static("text/html")) + ); + assert_eq!( + resp.headers().get("server"), + Some(&HeaderValue::from_static("Static Web Server")) + ); + + let allow_methods = resp + .headers() + .get("access-control-allow-methods") + .unwrap() + .to_str() + .unwrap() + .rsplit(',') + .map(|f| f.trim()) + .collect::>(); + const METHODS: [&str; 3] = ["GET", "OPTIONS", "HEAD"]; + assert!(METHODS.iter().all(|s| allow_methods.contains(s))); + + let vary_values = resp + .headers() + .get("vary") + .unwrap() + .to_str() + .unwrap() + .rsplit(',') + .map(|f| f.trim()) + .collect::>(); + + #[cfg(not(feature = "compression"))] + const EXPECTED: [&str; 1] = ["origin"]; + #[cfg(feature = "compression")] + const EXPECTED: [&str; 2] = ["origin", "accept-encoding"]; + + assert!(EXPECTED.iter().all(|s| vary_values.contains(s))); + } else { + assert_eq!(resp.status(), 405); + } + } + Err(err) => { + panic!("unexpected error: {err}") + } + }; + } + } } diff --git a/tests/handler.rs b/tests/handler.rs index e181a37c..eb6b295b 100644 --- a/tests/handler.rs +++ b/tests/handler.rs @@ -11,13 +11,14 @@ pub mod tests { use static_web_server::http_ext::MethodExt; use static_web_server::testing::fixtures::{ - fixture_req_handler, fixture_settings, REMOTE_ADDR, + fixture_req_handler, fixture_req_handler_opts, fixture_settings, REMOTE_ADDR, }; #[tokio::test] async fn custom_headers_apply_for_dir() { let opts = fixture_settings("toml/handler.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -38,10 +39,12 @@ pub mod tests { feature = "compression-brotli", feature = "compression-zstd" ))] + #[cfg(feature = "compression")] assert_eq!( res.headers().get("vary"), Some(&HeaderValue::from_static("accept-encoding")) ); + assert_eq!( res.headers().get("server"), Some(&HeaderValue::from_static("Static Web Server")) @@ -56,7 +59,8 @@ pub mod tests { #[tokio::test] async fn custom_headers_apply_for_file() { let opts = fixture_settings("toml/handler.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -77,10 +81,12 @@ pub mod tests { feature = "compression-brotli", feature = "compression-zstd" ))] + #[cfg(feature = "compression")] assert_eq!( res.headers().get("vary"), Some(&HeaderValue::from_static("accept-encoding")) ); + assert_eq!( res.headers().get("cache-control"), Some(&HeaderValue::from_static("public, max-age=86400")) @@ -98,8 +104,9 @@ pub mod tests { #[tokio::test] async fn check_allowed_methods() { - let settings = fixture_settings("toml/handler.toml"); - let req_handler = fixture_req_handler(settings.general, settings.advanced); + let opts = fixture_settings("toml/handler.toml"); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let methods = [ @@ -118,19 +125,26 @@ pub mod tests { *req.uri_mut() = "http://localhost/assets/index.html".parse().unwrap(); match req_handler.handle(&mut req, remote_addr).await { - Ok(resp) => { + Ok(res) => { if method.is_allowed() { - assert_eq!(resp.status(), 200); + assert_eq!(res.status(), 200); assert_eq!( - resp.headers().get("content-type"), + res.headers().get("content-type"), Some(&HeaderValue::from_static("text/html")) ); + + #[cfg(feature = "compression")] + assert_eq!( + res.headers().get("vary"), + Some(&HeaderValue::from_static("accept-encoding")) + ); + assert_eq!( - resp.headers().get("server"), + res.headers().get("server"), Some(&HeaderValue::from_static("Static Web Server")) ); } else { - assert_eq!(resp.status(), 405); + assert_eq!(res.status(), 405); } } Err(err) => { diff --git a/tests/redirects.rs b/tests/redirects.rs index 44690e54..b6547936 100644 --- a/tests/redirects.rs +++ b/tests/redirects.rs @@ -9,18 +9,19 @@ pub mod tests { use std::net::SocketAddr; use static_web_server::testing::fixtures::{ - fixture_req_handler, fixture_settings, REMOTE_ADDR, + fixture_req_handler, fixture_req_handler_opts, fixture_settings, REMOTE_ADDR, }; #[tokio::test] async fn redirects_skipped() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 200); @@ -35,7 +36,8 @@ pub mod tests { #[tokio::test] async fn redirects_host() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -55,12 +57,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_1() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/assets/main.css".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 301); @@ -78,12 +81,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_2() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/style.css".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 301); @@ -101,12 +105,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_3() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/rust-lang.rs".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 302); @@ -124,12 +129,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_4() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/assets/main.js".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 302); @@ -147,12 +153,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_5() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/old/images/avatar.jpeg".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 302); @@ -170,12 +177,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_6() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/old/fonts/title.ttf".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 302); @@ -193,12 +201,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_generic_1() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/generic-page.html".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 301); @@ -216,12 +225,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_generic_2() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/2024/11/".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 301); @@ -239,12 +249,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_generic_2_literal_separator() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/archive/2024/11/".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 404); @@ -258,12 +269,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_ranges_1() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/2/a/random/".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 301); @@ -281,12 +293,13 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_ranges_2() { let opts = fixture_settings("toml/redirects.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); - let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let mut req = Request::default(); *req.uri_mut() = "http://localhost/crop-x/image.png".parse().unwrap(); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); match req_handler.handle(&mut req, remote_addr).await { Ok(res) => { assert_eq!(res.status(), 301); diff --git a/tests/rewrites.rs b/tests/rewrites.rs index ce5b3400..e72bd1e3 100644 --- a/tests/rewrites.rs +++ b/tests/rewrites.rs @@ -9,13 +9,14 @@ pub mod tests { use std::net::SocketAddr; use static_web_server::testing::fixtures::{ - fixture_req_handler, fixture_settings, REMOTE_ADDR, + fixture_req_handler, fixture_req_handler_opts, fixture_settings, REMOTE_ADDR, }; #[tokio::test] async fn rewrites_skipped() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -35,7 +36,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_1() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -61,7 +63,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_2() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -87,7 +90,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_3() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -113,7 +117,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_4() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -139,7 +144,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_5() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -159,7 +165,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_6() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -182,7 +189,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_generic_1() { let opts = fixture_settings("toml/rewrites.toml"); - let req_handler = fixture_req_handler(opts.general, opts.advanced); + let req_handler_opts = fixture_req_handler_opts(opts.general, opts.advanced); + let req_handler = fixture_req_handler(req_handler_opts); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default();