From 7758525014dd43739f9901b5f70c6c99f3cb9944 Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Tue, 21 May 2024 01:18:10 +0200 Subject: [PATCH 01/12] docs: v2.31.1 [skip ci] --- docs/content/download-and-install.md | 104 +++++++++++++-------------- scripts/installer.sh | 2 +- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/docs/content/download-and-install.md b/docs/content/download-and-install.md index 410930ae..921eb945 100644 --- a/docs/content/download-and-install.md +++ b/docs/content/download-and-install.md @@ -1,12 +1,12 @@ # Download and Install -Latest **v2.31.0** release `2024-05-19` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.31.0), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-SHA256SUM)) +Latest **v2.31.1** release `2024-05-21` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.31.1), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-SHA256SUM)) @@ -98,69 +98,69 @@ Pre-compiled binaries grouped by CPU architectures. ### x86_64 -- [static-web-server-v2.31.0-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-apple-darwin.tar.gz)
-**SHA256SUM:** `91d6a35a4774d2b5d2c199bf37481961b89c320d95e43214118015f2eff80926` -- [static-web-server-v2.31.0-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-pc-windows-gnu.zip)
-**SHA256SUM:** `ca4bea0592ca976257674fcbc2577dcc98e1be0f643508d96bef392e2ab6dcb0` -- [static-web-server-v2.31.0-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-pc-windows-msvc.zip)
-**SHA256SUM:** `2c9d2f94f8924283a662d0acab199593a3324794333c57841dc43481a8542e59` -- [static-web-server-v2.31.0-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-unknown-freebsd.tar.gz)
-**SHA256SUM:** `827f4b2684cf4d1277eab21d5429597e60cf29456d786e5e3fbe18b785b3712c` -- [static-web-server-v2.31.0-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `c0da859bdcc9dab3f0b95dca78af7f29cd1404ed136c118f379ef398cce25936` -- [static-web-server-v2.31.0-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `c54a6abb744ff7c51f467e8e0d0084e648487b7e4e0383c9f28bb816c6b4d515` -- [static-web-server-v2.31.0-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-unknown-netbsd.tar.gz)
-**SHA256SUM:** `4cdc0bf317255fc27c7a314fd17de506f05435e7340827a77ec5d98a958d48fc` -- [static-web-server-v2.31.0-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-x86_64-unknown-illumos.tar.gz)
-**SHA256SUM:** `be5ac431111a81d303e12763703eed7e58502f1919bde306ef242fef8c70eb88` +- [static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz)
+**SHA256SUM:** `02de9d929d69bc46d14fd4bcc8bff7f158fdbf714d49d3826dc09d9216e870b2` +- [static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip)
+**SHA256SUM:** `2a246d41e584f42c68e0d71eb14564620028e0be664916adf00e7df3957f206d` +- [static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip)
+**SHA256SUM:** `e2fb31126829209baaa9ac70c142325990455d3939fe0e5aaf62e18be1164337` +- [static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz)
+**SHA256SUM:** `cb6f8919f816591e5002673885e4a3d0daa12ddd8e82b5f668b8eeae10401eb3` +- [static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `8ddc30d11e35ea59ac97e8e89729c8846d95a581f6c28090decb7459d10ccc3f` +- [static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `55cfc8ded7cdaa2f43831e42ffe7b723536090cfebf5c86a55101b02a8d75894` +- [static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz)
+**SHA256SUM:** `df47da8e237427bb26cd8a81312ca12e3571ecd2b419589c97e5094b8e376624` +- [static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz)
+**SHA256SUM:** `655e7bfb9b4e1fe39989ef6f9923d7d8d2d534a82b63a4e51e7e9fe1fb1ccb0f` ### ARM64 -- [static-web-server-v2.31.0-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-aarch64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `7a0247e1d27739923cdaa07a6b946dbc5e50762cc9a2d14a474a7579a1aaf038` -- [static-web-server-v2.31.0-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-aarch64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `608ed51478d7298d459e512d77781720ce573dfaebef539213209964a995bed4` -- [static-web-server-v2.31.0-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-aarch64-apple-darwin.tar.gz)
-**SHA256SUM:** `de9ae1cf34949b6d70116008602b8e98efe1ebb561544a6caead8e3019c8c230` -- [static-web-server-v2.31.0-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-aarch64-linux-android.tar.gz)
-**SHA256SUM:** `307b1c6ad3a2909af0c8aca74cf58780637c1a6936d057218526d91a08fea6f0` -- [static-web-server-v2.31.0-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-aarch64-pc-windows-msvc.zip)
-**SHA256SUM:** `5b7e5957980d47658e751c625722d2d1cd9f9af19059afae9868e31f6f303943` +- [static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `534b8091cc206618d4fb3f6cd0a669e2bbc3d8fab46db096f91b70f373c224f1` +- [static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `c76fea34b8406297d64062a5e295280dcb871de3f3e9c43a49113a1b5ca5318e` +- [static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz)
+**SHA256SUM:** `c0997e43211fc4879afd90485a75c15a902ca86cb536ed6300ee6e27199b1df0` +- [static-web-server-v2.31.1-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-linux-android.tar.gz)
+**SHA256SUM:** `77117ef0553189e79dd90ebd0fe7da123841db105fd058d1553ef85ac2dc55f5` +- [static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip)
+**SHA256SUM:** `57af06a0f219d264c43fe2695e3d1b45c041cfde99758d8678dde375313315a5` ### x86 -- [static-web-server-v2.31.0-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-i686-pc-windows-msvc.zip)
-**SHA256SUM:** `4ba5e0beabe4ddd228cbb7d1d2a0b9ef1a8b9a72b546b69b3ac72f47e2e89172` -- [static-web-server-v2.31.0-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-i686-unknown-freebsd.tar.gz)
-**SHA256SUM:** `3b1454cb6063c75b7b1edfae65626193899d544282d6d8917153c3be750b8853` -- [static-web-server-v2.31.0-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-i686-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `b7197173efe5c22a62363bdb696de4be7d2a794957bba072dccc2a8885f4f633` -- [static-web-server-v2.31.0-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-i686-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `dfb798c09c7638bdbbc36f1ac96336ea68a3b941793d847353852ec9cd5996d4` +- [static-web-server-v2.31.1-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-pc-windows-msvc.zip)
+**SHA256SUM:** `53e14a56d6c685d68faa51c1515d2ea843209b4aadfacc47e9e099cfba8c88eb` +- [static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz)
+**SHA256SUM:** `4b8911fe1dd95685a7ea641f4921333229304e75c60df081ddec6cb3a6525d1b` +- [static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `92f16a46996dff4b53dcad8dafe93528f270f711f6daac928c4475a0b6cbe104` +- [static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `4cb102120c4a64105b4c8bd927e429270b035de95fc980113606760c8fd5f7a6` ### ARM -- [static-web-server-v2.31.0-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-arm-unknown-linux-gnueabihf.tar.gz)
-**SHA256SUM:** `5a00004ed31bf03b2e3b0c03725e686e3f0ff537a6b3b80f1f7105150bcb2475` -- [static-web-server-v2.31.0-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-arm-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `5fea54f999dabdba4ac4353f7f4d0170b73bc59917868289935eaf33acd9f46a` -- [static-web-server-v2.31.0-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-armv7-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `8c12f1078bbfbae92bfa3c89c3db9257a499d1ce8b6564e77c23f1eab9679969` +- [static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz)
+**SHA256SUM:** `eb1bcf695f9512dfef5ec14d906e9efad1bb86937ad071a0da0bc8d692648948` +- [static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `60c4349e4fe91dde2439f345cfa868e50714027b152339ebcf16154aebabf21c` +- [static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `0aaeae8a6e4244b34540c6fdc2be6ab3120ce54e7f8cac21ba0117c18b78adbc` ### PowerPC -- [static-web-server-v2.31.0-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-powerpc64le-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `df125721f8d8d77ffc545e439656421c577c87cd2d87e1012f4154f7bc32d66e` +- [static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `85f400c5bf4a8604d76eafaa16540508f8ec9da8bd39f7136080c5d9b8d0d85e` ### S390X -- [static-web-server-v2.31.0-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.0/static-web-server-v2.31.0-s390x-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `55bbdfa58810c2229568350b8ec3f6465262cacf6a16765fe04141ebd95df530` +- [static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `ae96c62b12f55c05bf3c500a96bb5fa57146273a4f67f5556c0cbd0ece71ca00` ## Source files -- [static-web-server-2.31.0.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.0.tar.gz)
-**SHA256SUM:** `5bc6c63018057583887a9fd2b55320c4c0b767829b145387bc1c382733bbe073` -- [static-web-server-2.31.0.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.0.zip)
-**SHA256SUM:** `6173c525b3a8e1d8ba858861d89037f0c28ab1e7cc72e74b44f493e276e3bb52` +- [static-web-server-2.31.1.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.tar.gz)
+**SHA256SUM:** `63cae6bd2bce4d36907805ea54a1e40e9af93a9fb72accbce6445589a083febc` +- [static-web-server-2.31.1.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.zip)
+**SHA256SUM:** `2189129d1c00a96973f32b583010ccd9df063fcee8d869fa277480e248b52906` diff --git a/scripts/installer.sh b/scripts/installer.sh index 85482ac1..11cf1e18 100755 --- a/scripts/installer.sh +++ b/scripts/installer.sh @@ -23,7 +23,7 @@ fi set -u # SWS latest version -version="2.31.0" +version="2.31.1" # Default directory where SWS will be installed local_bin="/usr/local/bin" From b2911891cd6ef0ca7e28815179ecef39ab8c4a62 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 22 May 2024 14:33:01 +0800 Subject: [PATCH 02/12] feat: custom install version and directory options for binary installer (#449) * update installer.sh to support overriding default variables * add instructions on envs --- docs/content/download-and-install.md | 14 ++++++++++++++ scripts/installer.sh | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/content/download-and-install.md b/docs/content/download-and-install.md index 921eb945..62190f1b 100644 --- a/docs/content/download-and-install.md +++ b/docs/content/download-and-install.md @@ -27,6 +27,20 @@ curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh `static-web-server` should be installed under the `/usr/local/bin` directory. +You can install a specific version of SWS to a custom location by setting environment variables: + +```sh +export SWS_INSTALL_DIR="~/.local/bin" +export SWS_INSTALL_VERSION="2.31.0" # full list at https://github.com/static-web-server/static-web-server/tags +curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh +``` + +Make sure you set the environment variables for the piped process (`sh` in our case), not the piping process(`curl`). If you don't want to `export` the variable, use: + +```sh +curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | SWS_INSTALL_DIR="~/.local/bin" sh +``` + ### Arch Linux Via [Yay](https://github.com/Jguer/yay) or your favorite AUR Helper. diff --git a/scripts/installer.sh b/scripts/installer.sh index 11cf1e18..d7f4d598 100755 --- a/scripts/installer.sh +++ b/scripts/installer.sh @@ -23,10 +23,10 @@ fi set -u # SWS latest version -version="2.31.1" +version=${SWS_INSTALL_VERSION:-"2.31.1"} # Default directory where SWS will be installed -local_bin="/usr/local/bin" +local_bin=${SWS_INSTALL_DIR:-"/usr/local/bin"} main() { need_cmd uname From a88839718077f19055a6b9ee0e5aaf9884c9622b Mon Sep 17 00:00:00 2001 From: Jose Quintana <1700322+joseluisq@users.noreply.github.com> Date: Thu, 23 May 2024 00:19:39 +0200 Subject: [PATCH 03/12] docs: improve `download-and-install.md` page (#450) --- docs/content/assets/style.css | 4 + .../content/download-and-install.generated.md | 183 ++++++++++++++++++ docs/content/download-and-install.md | 114 +++++------ docs/content/download-and-install.tmpl.md | 166 ---------------- docs/mkdocs.yml | 3 +- scripts/ci/post_release_updates.sh | 43 ++-- 6 files changed, 270 insertions(+), 243 deletions(-) create mode 100644 docs/content/download-and-install.generated.md delete mode 100644 docs/content/download-and-install.tmpl.md diff --git a/docs/content/assets/style.css b/docs/content/assets/style.css index 23c5a7c2..ea6fc065 100644 --- a/docs/content/assets/style.css +++ b/docs/content/assets/style.css @@ -1,3 +1,7 @@ +.md-main__inner { + margin-top: 0; +} + .md-button.md-button-sm { min-width: 7.5rem; text-align: center; diff --git a/docs/content/download-and-install.generated.md b/docs/content/download-and-install.generated.md new file mode 100644 index 00000000..a5ccf3c2 --- /dev/null +++ b/docs/content/download-and-install.generated.md @@ -0,0 +1,183 @@ + +# Download and Install + +Latest **v2.31.1** release `2024-05-22` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.31.1), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-SHA256SUM)) + + + +See also [the release history](https://github.com/static-web-server/static-web-server/releases) on GitHub. + +!!! info "Docker" + If you are working with Docker containers then check out [the Docker feature page](https://static-web-server.net/features/docker/). + +## Installation methods + +### Binary installer (Linux/BSDs) + +Use the binary installer if your package manager is not supported. + +```sh +curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh +``` + +`static-web-server` will be installed by default under the `/usr/local/bin` directory. + +Alternatively, you can install a specific version of SWS to a custom location by setting environment variables. + +```sh +export SWS_INSTALL_VERSION="2.31.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 +``` + +Make sure you set the environment variables for the piped process (`sh` in our case), not the piping process (`curl`). + +If you don't want to `export` environment variables then use: + +```sh +curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | SWS_INSTALL_DIR="~/.local/bin" sh +``` + +### Arch Linux + +Via [Yay](https://github.com/Jguer/yay) or your favorite AUR Helper. + +```sh +yay -S static-web-server-bin +``` + +### Exherbo Linux + +Add the `rust` repository and install [the package](https://gitlab.exherbo.org/exherbo/rust/-/tree/master/packages/www-servers/static-web-server) through `cave`: + +``` +cave sync +cave resolve -x repository/rust +cave resolve -x static-web-server +``` + +### NixOS + +Via [Nix](https://github.com/NixOS/nix) (Linux/MacOS) + +```sh +nix-shell -p static-web-server +# or +nix-env -iA nixpkgs.static-web-server +``` + +- [SWS Nix package](https://search.nixos.org/packages?show=static-web-server&from=0&size=50&sort=relevance&type=packages&query=static-web-server) maintained by [@figsoda](https://github.com/figsoda) +- [SWS Nix module](https://nixos.wiki/wiki/Static_Web_Server) maintained by [@mac-chaffee](https://github.com/mac-chaffee) + +### MacOS + +Via [Homebrew](https://brew.sh/) (also Linux) + +```sh +brew tap static-web-server/static-web-server + +# Just the binary +brew install static-web-server-bin + +# Or build from source +brew install static-web-server +``` + +### Windows + +Via [Scoop](https://scoop.sh/) + +```powershell +scoop install static-web-server +``` + +### WebAssembly + +Via [Wasmer](https://wasmer.io/wasmer/static-web-server/) + +```sh +wasmer run wasmer/static-web-server --net --enable-threads --mapdir /public:/my/host/dir -- --port 8787 +``` + +### TrueNAS SCALE + +If you use [TrueNAS SCALE](https://www.truenas.com/truenas-scale/) then visit [TrueCharts Community Website](https://truecharts.org/charts/stable/static-web-server/) and its [Introduction to SCALE](https://truecharts.org/manual/SCALE/guides/scale-intro) page to install SWS application in your instance. + +## Binaries + +Pre-compiled binaries grouped by CPU architectures. + +### x86_64 + +- [static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz)
+**SHA256SUM:** `02de9d929d69bc46d14fd4bcc8bff7f158fdbf714d49d3826dc09d9216e870b2` +- [static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip)
+**SHA256SUM:** `2a246d41e584f42c68e0d71eb14564620028e0be664916adf00e7df3957f206d` +- [static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip)
+**SHA256SUM:** `e2fb31126829209baaa9ac70c142325990455d3939fe0e5aaf62e18be1164337` +- [static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz)
+**SHA256SUM:** `cb6f8919f816591e5002673885e4a3d0daa12ddd8e82b5f668b8eeae10401eb3` +- [static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `8ddc30d11e35ea59ac97e8e89729c8846d95a581f6c28090decb7459d10ccc3f` +- [static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `55cfc8ded7cdaa2f43831e42ffe7b723536090cfebf5c86a55101b02a8d75894` +- [static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz)
+**SHA256SUM:** `df47da8e237427bb26cd8a81312ca12e3571ecd2b419589c97e5094b8e376624` +- [static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz)
+**SHA256SUM:** `655e7bfb9b4e1fe39989ef6f9923d7d8d2d534a82b63a4e51e7e9fe1fb1ccb0f` + +### ARM64 + +- [static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `534b8091cc206618d4fb3f6cd0a669e2bbc3d8fab46db096f91b70f373c224f1` +- [static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `c76fea34b8406297d64062a5e295280dcb871de3f3e9c43a49113a1b5ca5318e` +- [static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz)
+**SHA256SUM:** `c0997e43211fc4879afd90485a75c15a902ca86cb536ed6300ee6e27199b1df0` +- [static-web-server-v2.31.1-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-linux-android.tar.gz)
+**SHA256SUM:** `77117ef0553189e79dd90ebd0fe7da123841db105fd058d1553ef85ac2dc55f5` +- [static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip)
+**SHA256SUM:** `57af06a0f219d264c43fe2695e3d1b45c041cfde99758d8678dde375313315a5` + +### x86 + +- [static-web-server-v2.31.1-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-pc-windows-msvc.zip)
+**SHA256SUM:** `53e14a56d6c685d68faa51c1515d2ea843209b4aadfacc47e9e099cfba8c88eb` +- [static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz)
+**SHA256SUM:** `4b8911fe1dd95685a7ea641f4921333229304e75c60df081ddec6cb3a6525d1b` +- [static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `92f16a46996dff4b53dcad8dafe93528f270f711f6daac928c4475a0b6cbe104` +- [static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `4cb102120c4a64105b4c8bd927e429270b035de95fc980113606760c8fd5f7a6` + +### ARM + +- [static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz)
+**SHA256SUM:** `eb1bcf695f9512dfef5ec14d906e9efad1bb86937ad071a0da0bc8d692648948` +- [static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `60c4349e4fe91dde2439f345cfa868e50714027b152339ebcf16154aebabf21c` +- [static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `0aaeae8a6e4244b34540c6fdc2be6ab3120ce54e7f8cac21ba0117c18b78adbc` + +### PowerPC + +- [static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `85f400c5bf4a8604d76eafaa16540508f8ec9da8bd39f7136080c5d9b8d0d85e` + +### S390X + +- [static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `ae96c62b12f55c05bf3c500a96bb5fa57146273a4f67f5556c0cbd0ece71ca00` + +## Source files + +- [static-web-server-2.31.1.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.tar.gz)
+**SHA256SUM:** `63cae6bd2bce4d36907805ea54a1e40e9af93a9fb72accbce6445589a083febc` +- [static-web-server-2.31.1.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.zip)
+**SHA256SUM:** `2189129d1c00a96973f32b583010ccd9df063fcee8d869fa277480e248b52906` diff --git a/docs/content/download-and-install.md b/docs/content/download-and-install.md index 62190f1b..1d117fa8 100644 --- a/docs/content/download-and-install.md +++ b/docs/content/download-and-install.md @@ -1,12 +1,12 @@ # Download and Install -Latest **v2.31.1** release `2024-05-21` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.31.1), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-SHA256SUM)) +Latest **{{RELEASE_VERSION}}** release `{{RELEASE_DATE}}` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/{{RELEASE_VERSION}}), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-SHA256SUM)) @@ -25,17 +25,19 @@ Use the binary installer if your package manager is not supported. curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh ``` -`static-web-server` should be installed under the `/usr/local/bin` directory. +`static-web-server` will be installed by default under the `/usr/local/bin` directory. -You can install a specific version of SWS to a custom location by setting environment variables: +Alternatively, you can install a specific version of SWS to a custom location by setting environment variables. ```sh -export SWS_INSTALL_DIR="~/.local/bin" export SWS_INSTALL_VERSION="2.31.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 ``` -Make sure you set the environment variables for the piped process (`sh` in our case), not the piping process(`curl`). If you don't want to `export` the variable, use: +Make sure you set the environment variables for the piped process (`sh` in our case), not the piping process (`curl`). + +If you don't want to `export` environment variables then use: ```sh curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | SWS_INSTALL_DIR="~/.local/bin" sh @@ -112,69 +114,69 @@ Pre-compiled binaries grouped by CPU architectures. ### x86_64 -- [static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz)
-**SHA256SUM:** `02de9d929d69bc46d14fd4bcc8bff7f158fdbf714d49d3826dc09d9216e870b2` -- [static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip)
-**SHA256SUM:** `2a246d41e584f42c68e0d71eb14564620028e0be664916adf00e7df3957f206d` -- [static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip)
-**SHA256SUM:** `e2fb31126829209baaa9ac70c142325990455d3939fe0e5aaf62e18be1164337` -- [static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz)
-**SHA256SUM:** `cb6f8919f816591e5002673885e4a3d0daa12ddd8e82b5f668b8eeae10401eb3` -- [static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `8ddc30d11e35ea59ac97e8e89729c8846d95a581f6c28090decb7459d10ccc3f` -- [static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `55cfc8ded7cdaa2f43831e42ffe7b723536090cfebf5c86a55101b02a8d75894` -- [static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz)
-**SHA256SUM:** `df47da8e237427bb26cd8a81312ca12e3571ecd2b419589c97e5094b8e376624` -- [static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz)
-**SHA256SUM:** `655e7bfb9b4e1fe39989ef6f9923d7d8d2d534a82b63a4e51e7e9fe1fb1ccb0f` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz)
+**SHA256SUM:** `{{x86_64-apple-darwin.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip)
+**SHA256SUM:** `{{x86_64-pc-windows-gnu.zip}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip)
+**SHA256SUM:** `{{x86_64-pc-windows-msvc.zip}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-freebsd.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-linux-gnu.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-linux-musl.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-netbsd.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-illumos.tar.gz}}` ### ARM64 -- [static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `534b8091cc206618d4fb3f6cd0a669e2bbc3d8fab46db096f91b70f373c224f1` -- [static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `c76fea34b8406297d64062a5e295280dcb871de3f3e9c43a49113a1b5ca5318e` -- [static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz)
-**SHA256SUM:** `c0997e43211fc4879afd90485a75c15a902ca86cb536ed6300ee6e27199b1df0` -- [static-web-server-v2.31.1-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-linux-android.tar.gz)
-**SHA256SUM:** `77117ef0553189e79dd90ebd0fe7da123841db105fd058d1553ef85ac2dc55f5` -- [static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip)
-**SHA256SUM:** `57af06a0f219d264c43fe2695e3d1b45c041cfde99758d8678dde375313315a5` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{aarch64-unknown-linux-gnu.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `{{aarch64-unknown-linux-musl.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz)
+**SHA256SUM:** `{{aarch64-apple-darwin.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz)
+**SHA256SUM:** `{{aarch64-linux-android.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip)
+**SHA256SUM:** `{{aarch64-pc-windows-msvc.zip}}` ### x86 -- [static-web-server-v2.31.1-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-pc-windows-msvc.zip)
-**SHA256SUM:** `53e14a56d6c685d68faa51c1515d2ea843209b4aadfacc47e9e099cfba8c88eb` -- [static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz)
-**SHA256SUM:** `4b8911fe1dd95685a7ea641f4921333229304e75c60df081ddec6cb3a6525d1b` -- [static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `92f16a46996dff4b53dcad8dafe93528f270f711f6daac928c4475a0b6cbe104` -- [static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `4cb102120c4a64105b4c8bd927e429270b035de95fc980113606760c8fd5f7a6` +- [static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip)
+**SHA256SUM:** `{{i686-pc-windows-msvc.zip}}` +- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz)
+**SHA256SUM:** `{{i686-unknown-freebsd.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{i686-unknown-linux-gnu.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `{{i686-unknown-linux-musl.tar.gz}}` ### ARM -- [static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz)
-**SHA256SUM:** `eb1bcf695f9512dfef5ec14d906e9efad1bb86937ad071a0da0bc8d692648948` -- [static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `60c4349e4fe91dde2439f345cfa868e50714027b152339ebcf16154aebabf21c` -- [static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `0aaeae8a6e4244b34540c6fdc2be6ab3120ce54e7f8cac21ba0117c18b78adbc` +- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz)
+**SHA256SUM:** `{{arm-unknown-linux-gnueabihf.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `{{arm-unknown-linux-musleabihf.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `{{armv7-unknown-linux-musleabihf.tar.gz}}` ### PowerPC -- [static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `85f400c5bf4a8604d76eafaa16540508f8ec9da8bd39f7136080c5d9b8d0d85e` +- [static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{powerpc64le-unknown-linux-gnu.tar.gz}}` ### S390X -- [static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `ae96c62b12f55c05bf3c500a96bb5fa57146273a4f67f5556c0cbd0ece71ca00` +- [static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{s390x-unknown-linux-gnu.tar.gz}}` ## Source files -- [static-web-server-2.31.1.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.tar.gz)
-**SHA256SUM:** `63cae6bd2bce4d36907805ea54a1e40e9af93a9fb72accbce6445589a083febc` -- [static-web-server-2.31.1.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.zip)
-**SHA256SUM:** `2189129d1c00a96973f32b583010ccd9df063fcee8d869fa277480e248b52906` +- [static-web-server-{{RELEASE_VERSION_NUM}}.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.tar.gz)
+**SHA256SUM:** `{{SRC_TAR}}` +- [static-web-server-{{RELEASE_VERSION_NUM}}.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.zip)
+**SHA256SUM:** `{{SRC_ZIP}}` diff --git a/docs/content/download-and-install.tmpl.md b/docs/content/download-and-install.tmpl.md deleted file mode 100644 index f9d5de37..00000000 --- a/docs/content/download-and-install.tmpl.md +++ /dev/null @@ -1,166 +0,0 @@ -# Download and Install - -Latest **{{RELEASE_VERSION}}** release `{{RELEASE_DATE}}` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/{{RELEASE_VERSION}}), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-SHA256SUM)) - - - -See also [the release history](https://github.com/static-web-server/static-web-server/releases) on GitHub. - -!!! info "Docker" - If you are working with Docker containers then check out [the Docker feature page](https://static-web-server.net/features/docker/). - -## Installation methods - -### Binary installer (Linux/BSDs) - -Use the binary installer if your package manager is not supported. - -```sh -curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh -``` - -`static-web-server` should be installed under the `/usr/local/bin` directory. - -### Arch Linux - -Via [Yay](https://github.com/Jguer/yay) or your favorite AUR Helper. - -```sh -yay -S static-web-server-bin -``` - -### Exherbo Linux - -Add the `rust` repository and install [the package](https://gitlab.exherbo.org/exherbo/rust/-/tree/master/packages/www-servers/static-web-server) through `cave`: - -``` -cave sync -cave resolve -x repository/rust -cave resolve -x static-web-server -``` - -### NixOS - -Via [Nix](https://github.com/NixOS/nix) (Linux/MacOS) - -```sh -nix-shell -p static-web-server -# or -nix-env -iA nixpkgs.static-web-server -``` - -- [SWS Nix package](https://search.nixos.org/packages?show=static-web-server&from=0&size=50&sort=relevance&type=packages&query=static-web-server) maintained by [@figsoda](https://github.com/figsoda) -- [SWS Nix module](https://nixos.wiki/wiki/Static_Web_Server) maintained by [@mac-chaffee](https://github.com/mac-chaffee) - -### MacOS - -Via [Homebrew](https://brew.sh/) (also Linux) - -```sh -brew tap static-web-server/static-web-server - -# Just the binary -brew install static-web-server-bin - -# Or build from source -brew install static-web-server -``` - -### Windows - -Via [Scoop](https://scoop.sh/) - -```powershell -scoop install static-web-server -``` - -### WebAssembly - -Via [Wasmer](https://wasmer.io/wasmer/static-web-server/) - -```sh -wasmer run wasmer/static-web-server --net --enable-threads --mapdir /public:/my/host/dir -- --port 8787 -``` - -### TrueNAS SCALE - -If you use [TrueNAS SCALE](https://www.truenas.com/truenas-scale/) then visit [TrueCharts Community Website](https://truecharts.org/charts/stable/static-web-server/) and its [Introduction to SCALE](https://truecharts.org/manual/SCALE/guides/scale-intro) page to install SWS application in your instance. - -## Binaries - -Pre-compiled binaries grouped by CPU architectures. - -### x86_64 - -- [static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz)
-**SHA256SUM:** `{{x86_64-apple-darwin.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip)
-**SHA256SUM:** `{{x86_64-pc-windows-gnu.zip}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip)
-**SHA256SUM:** `{{x86_64-pc-windows-msvc.zip}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-freebsd.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-linux-gnu.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-linux-musl.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-netbsd.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-illumos.tar.gz}}` - -### ARM64 - -- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{aarch64-unknown-linux-gnu.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `{{aarch64-unknown-linux-musl.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz)
-**SHA256SUM:** `{{aarch64-apple-darwin.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz)
-**SHA256SUM:** `{{aarch64-linux-android.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip)
-**SHA256SUM:** `{{aarch64-pc-windows-msvc.zip}}` - -### x86 - -- [static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip)
-**SHA256SUM:** `{{i686-pc-windows-msvc.zip}}` -- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz)
-**SHA256SUM:** `{{i686-unknown-freebsd.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{i686-unknown-linux-gnu.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `{{i686-unknown-linux-musl.tar.gz}}` - -### ARM - -- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz)
-**SHA256SUM:** `{{arm-unknown-linux-gnueabihf.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `{{arm-unknown-linux-musleabihf.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `{{armv7-unknown-linux-musleabihf.tar.gz}}` - -### PowerPC - -- [static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{powerpc64le-unknown-linux-gnu.tar.gz}}` - -### S390X - -- [static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{s390x-unknown-linux-gnu.tar.gz}}` - -## Source files - -- [static-web-server-{{RELEASE_VERSION_NUM}}.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.tar.gz)
-**SHA256SUM:** `{{SRC_TAR}}` -- [static-web-server-{{RELEASE_VERSION_NUM}}.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.zip)
-**SHA256SUM:** `{{SRC_ZIP}}` diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index c5adbcab..e22c0583 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -29,7 +29,6 @@ theme: - content.action.edit - content.action.view - content.tabs.link - - header.autohide # - navigation.expand - navigation.indexes # - navigation.instant @@ -130,7 +129,7 @@ plugins: nav: - 'Overview': 'index.md' - 'Getting Started': 'getting-started.md' - - 'Download and Install': 'download-and-install.md' + - 'Download and Install': 'download-and-install.generated.md' - 'Configuration': - 'Command Line Arguments': 'configuration/command-line-arguments.md' - 'Environment Variables': 'configuration/environment-variables.md' diff --git a/scripts/ci/post_release_updates.sh b/scripts/ci/post_release_updates.sh index ed5c2e0d..70df8797 100755 --- a/scripts/ci/post_release_updates.sh +++ b/scripts/ci/post_release_updates.sh @@ -39,13 +39,17 @@ echo "Calculating and verifying checksum file..." sha256sum static-web-server-* > $checksum_file_name sha256sum -c $checksum_file_name -echo "Uploading checksum file to $SERVER_VERSION GitHub release..." -release_id=$(cat $release_json | jq -r ".id") -curl -LX POST \ - --data-binary @$checksum_file_name \ - --header "Authorization: token $GITHUB_TOKEN" \ - --header "Content-Type: application/octet-stream" \ - https://uploads.github.com/repos/static-web-server/static-web-server/releases/$release_id/assets?name=$checksum_file_name +upload_checksum=${UPLOAD_CHECKSUM:-""} + +if [[ -n "$upload_checksum" ]] && [[ "$upload_checksum" = "true" ]]; then + echo "Uploading checksum file to $SERVER_VERSION GitHub release..." + release_id=$(cat $release_json | jq -r ".id") + curl -LX POST \ + --data-binary @$checksum_file_name \ + --header "Authorization: token $GITHUB_TOKEN" \ + --header "Content-Type: application/octet-stream" \ + https://uploads.github.com/repos/static-web-server/static-web-server/releases/$release_id/assets?name=$checksum_file_name +fi echo "Checksum file uploaded successfully!" echo @@ -57,13 +61,12 @@ release_date=$(date +%Y-%m-%d) filename_version="static-web-server-$SERVER_VERSION" filename_version_num="static-web-server-$server_version_num" -sed_fname="" -if [[ $(uname -s) = "Darwin" ]]; then - sed_fname=" ''" -fi +page_download_install_generated=docs/content/download-and-install.generated.md +sed_bk=".bk" # Replace placeholder occurrences -sed "s/{{RELEASE_DATE}}/$release_date/g" docs/content/download-and-install.tmpl.md > docs/content/download-and-install.md +echo "" > $page_download_install_generated +sed "s/{{RELEASE_DATE}}/$release_date/g" docs/content/download-and-install.md >> $page_download_install_generated while read -r line; do checksum=$(echo $line | awk -F ' ' '{print $1}') @@ -71,24 +74,26 @@ while read -r line; do placeholder_checksum=$(echo $filename | sed "s/^$filename_version-//") if [[ "$placeholder_checksum" = "$filename_version_num.tar.gz" ]]; then - sed -i$sed_fname -e "s/{{SRC_TAR}}/$checksum/" docs/content/download-and-install.md + sed -i$sed_bk -e "s/{{SRC_TAR}}/$checksum/" $page_download_install_generated continue fi if [[ "$placeholder_checksum" = "$filename_version_num.zip" ]]; then - sed -i$sed_fname -e "s/{{SRC_ZIP}}/$checksum/" docs/content/download-and-install.md + sed -i$sed_bk -e "s/{{SRC_ZIP}}/$checksum/" $page_download_install_generated continue fi - sed -i$sed_fname -e "s/{{$placeholder_checksum}}/$checksum/" docs/content/download-and-install.md + sed -i$sed_bk -e "s/{{$placeholder_checksum}}/$checksum/" $page_download_install_generated done < <(cat "$release_dir/$checksum_file_name") -sed -i$sed_fname -e "s/{{RELEASE_VERSION}}/$SERVER_VERSION/g" docs/content/download-and-install.md -sed -i$sed_fname -e "s/{{RELEASE_VERSION_NUM}}/$server_version_num/g" docs/content/download-and-install.md -echo "Download and install page updated!" +sed -i$sed_bk -e "s/{{RELEASE_VERSION}}/$SERVER_VERSION/g" $page_download_install_generated +sed -i$sed_bk -e "s/{{RELEASE_VERSION_NUM}}/$server_version_num/g" $page_download_install_generated +rm -rf docs/content/*.bk +echo "Download and install page generated!" # Update current installer script version -sed -i$sed_fname -e "s/version=\".*\"/version=\"$server_version_num\"/g" $cwd/scripts/installer.sh +sed -i$sed_bk -e "s/version=\".*\"/version=\"$server_version_num\"/g" $cwd/scripts/installer.sh +rm -rf $cwd/scripts/*.bk echo "Installer script $server_version_num version updated!" echo From 91f8ec067547ae5783c2c7ab33228168c4d69e3a Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Thu, 23 May 2024 00:42:42 +0200 Subject: [PATCH 04/12] docs: improve download-and-install.md page (second part) --- Makefile | 1 - .../content/download-and-install.generated.md | 183 ------------------ docs/content/download-and-install.md | 105 +++++----- docs/content/download-and-install.template.md | 182 +++++++++++++++++ docs/mkdocs.yml | 4 +- scripts/ci/post_release_updates.sh | 4 +- 6 files changed, 239 insertions(+), 240 deletions(-) delete mode 100644 docs/content/download-and-install.generated.md create mode 100644 docs/content/download-and-install.template.md diff --git a/Makefile b/Makefile index c2862be6..442a78ff 100644 --- a/Makefile +++ b/Makefile @@ -285,7 +285,6 @@ docs-deploy: static-web-server-docs mkdocs build @git checkout gh-pages @git clean -fdx - @cp -rf docs/CNAME /tmp/docs/ @rm -rf docs/ @mkdir -p docs/ @cp -rf /tmp/docs/. docs/ diff --git a/docs/content/download-and-install.generated.md b/docs/content/download-and-install.generated.md deleted file mode 100644 index a5ccf3c2..00000000 --- a/docs/content/download-and-install.generated.md +++ /dev/null @@ -1,183 +0,0 @@ - -# Download and Install - -Latest **v2.31.1** release `2024-05-22` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.31.1), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-SHA256SUM)) - - - -See also [the release history](https://github.com/static-web-server/static-web-server/releases) on GitHub. - -!!! info "Docker" - If you are working with Docker containers then check out [the Docker feature page](https://static-web-server.net/features/docker/). - -## Installation methods - -### Binary installer (Linux/BSDs) - -Use the binary installer if your package manager is not supported. - -```sh -curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh -``` - -`static-web-server` will be installed by default under the `/usr/local/bin` directory. - -Alternatively, you can install a specific version of SWS to a custom location by setting environment variables. - -```sh -export SWS_INSTALL_VERSION="2.31.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 -``` - -Make sure you set the environment variables for the piped process (`sh` in our case), not the piping process (`curl`). - -If you don't want to `export` environment variables then use: - -```sh -curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | SWS_INSTALL_DIR="~/.local/bin" sh -``` - -### Arch Linux - -Via [Yay](https://github.com/Jguer/yay) or your favorite AUR Helper. - -```sh -yay -S static-web-server-bin -``` - -### Exherbo Linux - -Add the `rust` repository and install [the package](https://gitlab.exherbo.org/exherbo/rust/-/tree/master/packages/www-servers/static-web-server) through `cave`: - -``` -cave sync -cave resolve -x repository/rust -cave resolve -x static-web-server -``` - -### NixOS - -Via [Nix](https://github.com/NixOS/nix) (Linux/MacOS) - -```sh -nix-shell -p static-web-server -# or -nix-env -iA nixpkgs.static-web-server -``` - -- [SWS Nix package](https://search.nixos.org/packages?show=static-web-server&from=0&size=50&sort=relevance&type=packages&query=static-web-server) maintained by [@figsoda](https://github.com/figsoda) -- [SWS Nix module](https://nixos.wiki/wiki/Static_Web_Server) maintained by [@mac-chaffee](https://github.com/mac-chaffee) - -### MacOS - -Via [Homebrew](https://brew.sh/) (also Linux) - -```sh -brew tap static-web-server/static-web-server - -# Just the binary -brew install static-web-server-bin - -# Or build from source -brew install static-web-server -``` - -### Windows - -Via [Scoop](https://scoop.sh/) - -```powershell -scoop install static-web-server -``` - -### WebAssembly - -Via [Wasmer](https://wasmer.io/wasmer/static-web-server/) - -```sh -wasmer run wasmer/static-web-server --net --enable-threads --mapdir /public:/my/host/dir -- --port 8787 -``` - -### TrueNAS SCALE - -If you use [TrueNAS SCALE](https://www.truenas.com/truenas-scale/) then visit [TrueCharts Community Website](https://truecharts.org/charts/stable/static-web-server/) and its [Introduction to SCALE](https://truecharts.org/manual/SCALE/guides/scale-intro) page to install SWS application in your instance. - -## Binaries - -Pre-compiled binaries grouped by CPU architectures. - -### x86_64 - -- [static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz)
-**SHA256SUM:** `02de9d929d69bc46d14fd4bcc8bff7f158fdbf714d49d3826dc09d9216e870b2` -- [static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip)
-**SHA256SUM:** `2a246d41e584f42c68e0d71eb14564620028e0be664916adf00e7df3957f206d` -- [static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip)
-**SHA256SUM:** `e2fb31126829209baaa9ac70c142325990455d3939fe0e5aaf62e18be1164337` -- [static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz)
-**SHA256SUM:** `cb6f8919f816591e5002673885e4a3d0daa12ddd8e82b5f668b8eeae10401eb3` -- [static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `8ddc30d11e35ea59ac97e8e89729c8846d95a581f6c28090decb7459d10ccc3f` -- [static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `55cfc8ded7cdaa2f43831e42ffe7b723536090cfebf5c86a55101b02a8d75894` -- [static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz)
-**SHA256SUM:** `df47da8e237427bb26cd8a81312ca12e3571ecd2b419589c97e5094b8e376624` -- [static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz)
-**SHA256SUM:** `655e7bfb9b4e1fe39989ef6f9923d7d8d2d534a82b63a4e51e7e9fe1fb1ccb0f` - -### ARM64 - -- [static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `534b8091cc206618d4fb3f6cd0a669e2bbc3d8fab46db096f91b70f373c224f1` -- [static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `c76fea34b8406297d64062a5e295280dcb871de3f3e9c43a49113a1b5ca5318e` -- [static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz)
-**SHA256SUM:** `c0997e43211fc4879afd90485a75c15a902ca86cb536ed6300ee6e27199b1df0` -- [static-web-server-v2.31.1-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-linux-android.tar.gz)
-**SHA256SUM:** `77117ef0553189e79dd90ebd0fe7da123841db105fd058d1553ef85ac2dc55f5` -- [static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip)
-**SHA256SUM:** `57af06a0f219d264c43fe2695e3d1b45c041cfde99758d8678dde375313315a5` - -### x86 - -- [static-web-server-v2.31.1-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-pc-windows-msvc.zip)
-**SHA256SUM:** `53e14a56d6c685d68faa51c1515d2ea843209b4aadfacc47e9e099cfba8c88eb` -- [static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz)
-**SHA256SUM:** `4b8911fe1dd95685a7ea641f4921333229304e75c60df081ddec6cb3a6525d1b` -- [static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `92f16a46996dff4b53dcad8dafe93528f270f711f6daac928c4475a0b6cbe104` -- [static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `4cb102120c4a64105b4c8bd927e429270b035de95fc980113606760c8fd5f7a6` - -### ARM - -- [static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz)
-**SHA256SUM:** `eb1bcf695f9512dfef5ec14d906e9efad1bb86937ad071a0da0bc8d692648948` -- [static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `60c4349e4fe91dde2439f345cfa868e50714027b152339ebcf16154aebabf21c` -- [static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `0aaeae8a6e4244b34540c6fdc2be6ab3120ce54e7f8cac21ba0117c18b78adbc` - -### PowerPC - -- [static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `85f400c5bf4a8604d76eafaa16540508f8ec9da8bd39f7136080c5d9b8d0d85e` - -### S390X - -- [static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `ae96c62b12f55c05bf3c500a96bb5fa57146273a4f67f5556c0cbd0ece71ca00` - -## Source files - -- [static-web-server-2.31.1.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.tar.gz)
-**SHA256SUM:** `63cae6bd2bce4d36907805ea54a1e40e9af93a9fb72accbce6445589a083febc` -- [static-web-server-2.31.1.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.zip)
-**SHA256SUM:** `2189129d1c00a96973f32b583010ccd9df063fcee8d869fa277480e248b52906` diff --git a/docs/content/download-and-install.md b/docs/content/download-and-install.md index 1d117fa8..42ccd0e2 100644 --- a/docs/content/download-and-install.md +++ b/docs/content/download-and-install.md @@ -1,12 +1,13 @@ + # Download and Install -Latest **{{RELEASE_VERSION}}** release `{{RELEASE_DATE}}` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/{{RELEASE_VERSION}}), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-SHA256SUM)) +Latest **v2.31.1** release `2024-05-23` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/v2.31.1), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-SHA256SUM)) @@ -114,69 +115,69 @@ Pre-compiled binaries grouped by CPU architectures. ### x86_64 -- [static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz)
-**SHA256SUM:** `{{x86_64-apple-darwin.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip)
-**SHA256SUM:** `{{x86_64-pc-windows-gnu.zip}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip)
-**SHA256SUM:** `{{x86_64-pc-windows-msvc.zip}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-freebsd.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-linux-gnu.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-linux-musl.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-netbsd.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz)
-**SHA256SUM:** `{{x86_64-unknown-illumos.tar.gz}}` +- [static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-apple-darwin.tar.gz)
+**SHA256SUM:** `02de9d929d69bc46d14fd4bcc8bff7f158fdbf714d49d3826dc09d9216e870b2` +- [static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-gnu.zip)
+**SHA256SUM:** `2a246d41e584f42c68e0d71eb14564620028e0be664916adf00e7df3957f206d` +- [static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-pc-windows-msvc.zip)
+**SHA256SUM:** `e2fb31126829209baaa9ac70c142325990455d3939fe0e5aaf62e18be1164337` +- [static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-freebsd.tar.gz)
+**SHA256SUM:** `cb6f8919f816591e5002673885e4a3d0daa12ddd8e82b5f668b8eeae10401eb3` +- [static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `8ddc30d11e35ea59ac97e8e89729c8846d95a581f6c28090decb7459d10ccc3f` +- [static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `55cfc8ded7cdaa2f43831e42ffe7b723536090cfebf5c86a55101b02a8d75894` +- [static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-netbsd.tar.gz)
+**SHA256SUM:** `df47da8e237427bb26cd8a81312ca12e3571ecd2b419589c97e5094b8e376624` +- [static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-x86_64-unknown-illumos.tar.gz)
+**SHA256SUM:** `655e7bfb9b4e1fe39989ef6f9923d7d8d2d534a82b63a4e51e7e9fe1fb1ccb0f` ### ARM64 -- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{aarch64-unknown-linux-gnu.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `{{aarch64-unknown-linux-musl.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz)
-**SHA256SUM:** `{{aarch64-apple-darwin.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz)
-**SHA256SUM:** `{{aarch64-linux-android.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip)
-**SHA256SUM:** `{{aarch64-pc-windows-msvc.zip}}` +- [static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `534b8091cc206618d4fb3f6cd0a669e2bbc3d8fab46db096f91b70f373c224f1` +- [static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `c76fea34b8406297d64062a5e295280dcb871de3f3e9c43a49113a1b5ca5318e` +- [static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-apple-darwin.tar.gz)
+**SHA256SUM:** `c0997e43211fc4879afd90485a75c15a902ca86cb536ed6300ee6e27199b1df0` +- [static-web-server-v2.31.1-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-linux-android.tar.gz)
+**SHA256SUM:** `77117ef0553189e79dd90ebd0fe7da123841db105fd058d1553ef85ac2dc55f5` +- [static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-aarch64-pc-windows-msvc.zip)
+**SHA256SUM:** `57af06a0f219d264c43fe2695e3d1b45c041cfde99758d8678dde375313315a5` ### x86 -- [static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip)
-**SHA256SUM:** `{{i686-pc-windows-msvc.zip}}` -- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz)
-**SHA256SUM:** `{{i686-unknown-freebsd.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{i686-unknown-linux-gnu.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz)
-**SHA256SUM:** `{{i686-unknown-linux-musl.tar.gz}}` +- [static-web-server-v2.31.1-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-pc-windows-msvc.zip)
+**SHA256SUM:** `53e14a56d6c685d68faa51c1515d2ea843209b4aadfacc47e9e099cfba8c88eb` +- [static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-freebsd.tar.gz)
+**SHA256SUM:** `4b8911fe1dd95685a7ea641f4921333229304e75c60df081ddec6cb3a6525d1b` +- [static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `92f16a46996dff4b53dcad8dafe93528f270f711f6daac928c4475a0b6cbe104` +- [static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-i686-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `4cb102120c4a64105b4c8bd927e429270b035de95fc980113606760c8fd5f7a6` ### ARM -- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz)
-**SHA256SUM:** `{{arm-unknown-linux-gnueabihf.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `{{arm-unknown-linux-musleabihf.tar.gz}}` -- [static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz)
-**SHA256SUM:** `{{armv7-unknown-linux-musleabihf.tar.gz}}` +- [static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-gnueabihf.tar.gz)
+**SHA256SUM:** `eb1bcf695f9512dfef5ec14d906e9efad1bb86937ad071a0da0bc8d692648948` +- [static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-arm-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `60c4349e4fe91dde2439f345cfa868e50714027b152339ebcf16154aebabf21c` +- [static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-armv7-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `0aaeae8a6e4244b34540c6fdc2be6ab3120ce54e7f8cac21ba0117c18b78adbc` ### PowerPC -- [static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{powerpc64le-unknown-linux-gnu.tar.gz}}` +- [static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-powerpc64le-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `85f400c5bf4a8604d76eafaa16540508f8ec9da8bd39f7136080c5d9b8d0d85e` ### S390X -- [static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz)
-**SHA256SUM:** `{{s390x-unknown-linux-gnu.tar.gz}}` +- [static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/v2.31.1/static-web-server-v2.31.1-s390x-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `ae96c62b12f55c05bf3c500a96bb5fa57146273a4f67f5556c0cbd0ece71ca00` ## Source files -- [static-web-server-{{RELEASE_VERSION_NUM}}.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.tar.gz)
-**SHA256SUM:** `{{SRC_TAR}}` -- [static-web-server-{{RELEASE_VERSION_NUM}}.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.zip)
-**SHA256SUM:** `{{SRC_ZIP}}` +- [static-web-server-2.31.1.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.tar.gz)
+**SHA256SUM:** `63cae6bd2bce4d36907805ea54a1e40e9af93a9fb72accbce6445589a083febc` +- [static-web-server-2.31.1.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/v2.31.1.zip)
+**SHA256SUM:** `2189129d1c00a96973f32b583010ccd9df063fcee8d869fa277480e248b52906` diff --git a/docs/content/download-and-install.template.md b/docs/content/download-and-install.template.md new file mode 100644 index 00000000..1d117fa8 --- /dev/null +++ b/docs/content/download-and-install.template.md @@ -0,0 +1,182 @@ +# Download and Install + +Latest **{{RELEASE_VERSION}}** release `{{RELEASE_DATE}}` ([changelog](https://github.com/static-web-server/static-web-server/releases/tag/{{RELEASE_VERSION}}), [sha256sum](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-SHA256SUM)) + + + +See also [the release history](https://github.com/static-web-server/static-web-server/releases) on GitHub. + +!!! info "Docker" + If you are working with Docker containers then check out [the Docker feature page](https://static-web-server.net/features/docker/). + +## Installation methods + +### Binary installer (Linux/BSDs) + +Use the binary installer if your package manager is not supported. + +```sh +curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | sh +``` + +`static-web-server` will be installed by default under the `/usr/local/bin` directory. + +Alternatively, you can install a specific version of SWS to a custom location by setting environment variables. + +```sh +export SWS_INSTALL_VERSION="2.31.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 +``` + +Make sure you set the environment variables for the piped process (`sh` in our case), not the piping process (`curl`). + +If you don't want to `export` environment variables then use: + +```sh +curl --proto '=https' --tlsv1.2 -sSfL https://get.static-web-server.net | SWS_INSTALL_DIR="~/.local/bin" sh +``` + +### Arch Linux + +Via [Yay](https://github.com/Jguer/yay) or your favorite AUR Helper. + +```sh +yay -S static-web-server-bin +``` + +### Exherbo Linux + +Add the `rust` repository and install [the package](https://gitlab.exherbo.org/exherbo/rust/-/tree/master/packages/www-servers/static-web-server) through `cave`: + +``` +cave sync +cave resolve -x repository/rust +cave resolve -x static-web-server +``` + +### NixOS + +Via [Nix](https://github.com/NixOS/nix) (Linux/MacOS) + +```sh +nix-shell -p static-web-server +# or +nix-env -iA nixpkgs.static-web-server +``` + +- [SWS Nix package](https://search.nixos.org/packages?show=static-web-server&from=0&size=50&sort=relevance&type=packages&query=static-web-server) maintained by [@figsoda](https://github.com/figsoda) +- [SWS Nix module](https://nixos.wiki/wiki/Static_Web_Server) maintained by [@mac-chaffee](https://github.com/mac-chaffee) + +### MacOS + +Via [Homebrew](https://brew.sh/) (also Linux) + +```sh +brew tap static-web-server/static-web-server + +# Just the binary +brew install static-web-server-bin + +# Or build from source +brew install static-web-server +``` + +### Windows + +Via [Scoop](https://scoop.sh/) + +```powershell +scoop install static-web-server +``` + +### WebAssembly + +Via [Wasmer](https://wasmer.io/wasmer/static-web-server/) + +```sh +wasmer run wasmer/static-web-server --net --enable-threads --mapdir /public:/my/host/dir -- --port 8787 +``` + +### TrueNAS SCALE + +If you use [TrueNAS SCALE](https://www.truenas.com/truenas-scale/) then visit [TrueCharts Community Website](https://truecharts.org/charts/stable/static-web-server/) and its [Introduction to SCALE](https://truecharts.org/manual/SCALE/guides/scale-intro) page to install SWS application in your instance. + +## Binaries + +Pre-compiled binaries grouped by CPU architectures. + +### x86_64 + +- [static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-apple-darwin.tar.gz)
+**SHA256SUM:** `{{x86_64-apple-darwin.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-gnu.zip)
+**SHA256SUM:** `{{x86_64-pc-windows-gnu.zip}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-pc-windows-msvc.zip)
+**SHA256SUM:** `{{x86_64-pc-windows-msvc.zip}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-freebsd.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-freebsd.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-linux-gnu.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-linux-musl.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-netbsd.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-netbsd.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-x86_64-unknown-illumos.tar.gz)
+**SHA256SUM:** `{{x86_64-unknown-illumos.tar.gz}}` + +### ARM64 + +- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{aarch64-unknown-linux-gnu.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `{{aarch64-unknown-linux-musl.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-apple-darwin.tar.gz)
+**SHA256SUM:** `{{aarch64-apple-darwin.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-linux-android.tar.gz)
+**SHA256SUM:** `{{aarch64-linux-android.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-aarch64-pc-windows-msvc.zip)
+**SHA256SUM:** `{{aarch64-pc-windows-msvc.zip}}` + +### x86 + +- [static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-pc-windows-msvc.zip)
+**SHA256SUM:** `{{i686-pc-windows-msvc.zip}}` +- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-freebsd.tar.gz)
+**SHA256SUM:** `{{i686-unknown-freebsd.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{i686-unknown-linux-gnu.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-i686-unknown-linux-musl.tar.gz)
+**SHA256SUM:** `{{i686-unknown-linux-musl.tar.gz}}` + +### ARM + +- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-gnueabihf.tar.gz)
+**SHA256SUM:** `{{arm-unknown-linux-gnueabihf.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-arm-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `{{arm-unknown-linux-musleabihf.tar.gz}}` +- [static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-armv7-unknown-linux-musleabihf.tar.gz)
+**SHA256SUM:** `{{armv7-unknown-linux-musleabihf.tar.gz}}` + +### PowerPC + +- [static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-powerpc64le-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{powerpc64le-unknown-linux-gnu.tar.gz}}` + +### S390X + +- [static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz](https://github.com/static-web-server/static-web-server/releases/download/{{RELEASE_VERSION}}/static-web-server-{{RELEASE_VERSION}}-s390x-unknown-linux-gnu.tar.gz)
+**SHA256SUM:** `{{s390x-unknown-linux-gnu.tar.gz}}` + +## Source files + +- [static-web-server-{{RELEASE_VERSION_NUM}}.tar.gz](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.tar.gz)
+**SHA256SUM:** `{{SRC_TAR}}` +- [static-web-server-{{RELEASE_VERSION_NUM}}.zip](https://github.com/static-web-server/static-web-server/archive/refs/tags/{{RELEASE_VERSION}}.zip)
+**SHA256SUM:** `{{SRC_ZIP}}` diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index e22c0583..e8b9d2d0 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -16,7 +16,7 @@ extra_css: - 'assets/style.css' # Copyright -copyright: Copyright © 2019-2023 Jose Quintana +copyright: Copyright © 2019-2024 Jose Quintana # Theme theme: @@ -129,7 +129,7 @@ plugins: nav: - 'Overview': 'index.md' - 'Getting Started': 'getting-started.md' - - 'Download and Install': 'download-and-install.generated.md' + - 'Download and Install': 'download-and-install.md' - 'Configuration': - 'Command Line Arguments': 'configuration/command-line-arguments.md' - 'Environment Variables': 'configuration/environment-variables.md' diff --git a/scripts/ci/post_release_updates.sh b/scripts/ci/post_release_updates.sh index 70df8797..2433a2d9 100755 --- a/scripts/ci/post_release_updates.sh +++ b/scripts/ci/post_release_updates.sh @@ -61,12 +61,12 @@ release_date=$(date +%Y-%m-%d) filename_version="static-web-server-$SERVER_VERSION" filename_version_num="static-web-server-$server_version_num" -page_download_install_generated=docs/content/download-and-install.generated.md +page_download_install_generated=docs/content/download-and-install.md sed_bk=".bk" # Replace placeholder occurrences echo "" > $page_download_install_generated -sed "s/{{RELEASE_DATE}}/$release_date/g" docs/content/download-and-install.md >> $page_download_install_generated +sed "s/{{RELEASE_DATE}}/$release_date/g" docs/content/download-and-install.template.md >> $page_download_install_generated while read -r line; do checksum=$(echo $line | awk -F ' ' '{print $1}') From 6031a1b51d62649e248dd6d0d0e59658b330c705 Mon Sep 17 00:00:00 2001 From: Jose Quintana <1700322+joseluisq@users.noreply.github.com> Date: Wed, 29 May 2024 06:53:07 +0200 Subject: [PATCH 05/12] fix: incorrect `Content-Encoding` for pre-compressed zstd file requests (#452) --- src/compression_static.rs | 10 ++--- src/fs/meta.rs | 3 +- src/static_files.rs | 23 +++++++--- tests/compression_static.rs | 70 ++++++++++++++++++++++++++++++ tests/dir_listing.rs | 2 +- tests/fixtures/public/main.js.zst | Bin 0 -> 162 bytes 6 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 tests/fixtures/public/main.js.zst diff --git a/src/compression_static.rs b/src/compression_static.rs index 88c6799a..6dd47a04 100644 --- a/src/compression_static.rs +++ b/src/compression_static.rs @@ -19,13 +19,13 @@ use crate::headers_ext::ContentCoding; use crate::Error; /// It defines the pre-compressed file variant metadata of a particular file path. -pub struct CompressedFileVariant<'a> { +pub struct CompressedFileVariant { /// Current file path. pub file_path: PathBuf, /// The metadata of the current file. pub metadata: Metadata, - /// The file extension. - pub extension: &'a str, + /// The content encoding based on the file extension. + pub encoding: ContentCoding, } /// Initializes static compression. @@ -57,7 +57,7 @@ pub(crate) fn post_process( pub async fn precompressed_variant<'a>( file_path: &Path, headers: &'a HeaderMap, -) -> Option> { +) -> Option { tracing::trace!( "preparing pre-compressed file variant path of {}", file_path.display() @@ -119,7 +119,7 @@ pub async fn precompressed_variant<'a>( return Some(CompressedFileVariant { file_path, metadata, - extension: if comp_ext == "gz" { "gzip" } else { comp_ext }, + encoding, }); } diff --git a/src/fs/meta.rs b/src/fs/meta.rs index 44a1eb09..8a1a782c 100644 --- a/src/fs/meta.rs +++ b/src/fs/meta.rs @@ -10,6 +10,7 @@ use http::StatusCode; use std::fs::Metadata; use std::path::{Path, PathBuf}; +use crate::headers_ext::ContentCoding; use crate::Result; /// It defines a composed file metadata structure containing the current file @@ -24,7 +25,7 @@ pub(crate) struct FileMetadata<'a> { // If either `file_path` or `precompressed_variant` is a directory. pub is_dir: bool, // The precompressed file variant for the current `file_path`. - pub precompressed_variant: Option<(PathBuf, &'a str)>, + pub precompressed_variant: Option<(PathBuf, ContentCoding)>, } /// Try to find the file system metadata for the given file path or return a `Not Found` error. diff --git a/src/static_files.rs b/src/static_files.rs index f5e32434..6dccc373 100644 --- a/src/static_files.rs +++ b/src/static_files.rs @@ -182,13 +182,22 @@ pub async fn handle<'a>(opts: &HandleOpts<'a>) -> Result val, + Err(err) => { + tracing::error!( + "unable to parse header value from content encoding: {:?}", + err + ); + return Err(StatusCode::INTERNAL_SERVER_ERROR); + } + }; + resp.headers_mut().insert(CONTENT_ENCODING, encoding); return Ok(StaticFileResponse { resp, @@ -245,7 +254,7 @@ async fn get_composed_file_metadata<'a>( file_path, metadata: p.metadata, is_dir: false, - precompressed_variant: Some((p.file_path, p.extension)), + precompressed_variant: Some((p.file_path, p.encoding)), }); } } @@ -293,7 +302,7 @@ async fn get_composed_file_metadata<'a>( file_path, metadata: p.metadata, is_dir: false, - precompressed_variant: Some((p.file_path, p.extension)), + precompressed_variant: Some((p.file_path, p.encoding)), }); } } @@ -324,7 +333,7 @@ async fn get_composed_file_metadata<'a>( file_path, metadata: p.metadata, is_dir: false, - precompressed_variant: Some((p.file_path, p.extension)), + precompressed_variant: Some((p.file_path, p.encoding)), }); } } @@ -362,7 +371,7 @@ async fn get_composed_file_metadata<'a>( file_path, metadata: p.metadata, is_dir: false, - precompressed_variant: Some((p.file_path, p.extension)), + precompressed_variant: Some((p.file_path, p.encoding)), }); } } diff --git a/tests/compression_static.rs b/tests/compression_static.rs index e044c06d..fff1c7c6 100644 --- a/tests/compression_static.rs +++ b/tests/compression_static.rs @@ -258,4 +258,74 @@ mod tests { .await .expect("unexpected error response on `handle` function"); } + + #[tokio::test] + async fn compression_static_zstd_file_exists() { + let mut headers = HeaderMap::new(); + headers.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 = "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-deflate", + feature = "compression-brotli", + feature = "compression-zstd" + ))] + compression_static: true, + ignore_hidden_files: 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"], "application/javascript", + "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, mainjs_zst_buf, + "body and mainjs_zst_buf are not equal in length" + ); + } } diff --git a/tests/dir_listing.rs b/tests/dir_listing.rs index 01edfd9b..fe97d5e8 100644 --- a/tests/dir_listing.rs +++ b/tests/dir_listing.rs @@ -266,7 +266,7 @@ mod tests { if method == Method::GET { let entries: Vec = serde_json::from_str(body_str).unwrap(); - assert_eq!(entries.len(), 4); + assert_eq!(entries.len(), 5); let first_entry = entries.first().unwrap(); assert_eq!(first_entry.name, "spécial-directöry.net"); diff --git a/tests/fixtures/public/main.js.zst b/tests/fixtures/public/main.js.zst new file mode 100644 index 0000000000000000000000000000000000000000..bd865e879eaa15be766ad74a2e79fb6dc7c3b7c9 GIT binary patch literal 162 zcmV;T0A2qmwJ-eySgiyABFGyZU^UhOi1O0?Z9m&6lqCopS@#Q(7_~ZgDb4^W}69tnCKMFi4CK&guy0+_P;Jmo2>x-9>;ZTewA(ZqhDnT zQO0*Mbud=PVq Date: Wed, 5 Jun 2024 01:21:08 +0200 Subject: [PATCH 06/12] chore: update dependencies 05.06.2024 --- Cargo.lock | 80 +++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58639100..40cfeb90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -88,9 +88,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -113,9 +113,9 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "async-compression" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c90a406b4495d129f00461241616194cb8a032c8d1c53c657f0961d5f8e0498" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" dependencies = [ "brotli", "flate2", @@ -135,9 +135,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -211,9 +211,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6221fe77a248b9117d431ad93761222e1cf8ff282d9d1d5d9f53d6299a1cf76" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -517,9 +517,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "git2" @@ -655,9 +655,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -791,9 +791,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "libc", @@ -938,9 +938,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] @@ -959,9 +959,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1055,9 +1055,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] @@ -1206,18 +1206,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", @@ -1419,9 +1419,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.65" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", @@ -1528,9 +1528,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -1546,9 +1546,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", @@ -1617,9 +1617,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.13" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" dependencies = [ "serde", "serde_spanned", @@ -1638,9 +1638,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.13" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" dependencies = [ "indexmap", "serde", @@ -2083,18 +2083,18 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" +checksum = "56c52728401e1dc672a56e81e593e912aa54c78f40246869f78359a2bf24d29d" dependencies = [ "memchr", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zstd" From 3410365ed084c8f150dd4077bb5a377b1152a66d Mon Sep 17 00:00:00 2001 From: Jose Quintana <1700322+joseluisq@users.noreply.github.com> Date: Fri, 7 Jun 2024 00:47:34 +0200 Subject: [PATCH 07/12] fix: duplicate `Vary` response headers for `compression` and `compression-static` features (#453) it prevents duplicate `vary` headers in responses when enabling `compression` and `compression-static`. * fix: duplicate `vary` response headers for compression feature * fix: failed tests for experimental features --- src/compression.rs | 15 +++----- src/compression_static.rs | 2 +- src/handler.rs | 5 +-- src/testing.rs | 55 ++++++++++++++++-------------- tests/compression.rs | 64 +++++++++++++++++++++++++++++++++++ tests/compression_static.rs | 2 +- tests/experimental_metrics.rs | 7 ++-- tests/handler.rs | 22 ++++++++++-- tests/redirects.rs | 31 +++++++++++------ tests/rewrites.rs | 28 ++++++++++----- 10 files changed, 168 insertions(+), 63 deletions(-) create mode 100644 tests/compression.rs diff --git a/src/compression.rs b/src/compression.rs index 2840bcd9..69147783 100644 --- a/src/compression.rs +++ b/src/compression.rs @@ -98,13 +98,8 @@ pub(crate) fn post_process( return Ok(resp); } - let is_precompressed = resp.headers().get(CONTENT_ENCODING).is_some(); - if is_precompressed { - return Ok(resp); - } - // Compression content encoding varies so use a `Vary` header - resp.headers_mut().append( + resp.headers_mut().insert( hyper::header::VARY, HeaderValue::from_name(hyper::header::ACCEPT_ENCODING), ); @@ -216,7 +211,7 @@ pub fn gzip( ))); let header = create_encoding_header(head.headers.remove(CONTENT_ENCODING), ContentCoding::GZIP); head.headers.remove(CONTENT_LENGTH); - head.headers.append(CONTENT_ENCODING, header); + head.headers.insert(CONTENT_ENCODING, header); Response::from_parts(head, body) } @@ -246,7 +241,7 @@ pub fn deflate( ContentCoding::DEFLATE, ); head.headers.remove(CONTENT_LENGTH); - head.headers.append(CONTENT_ENCODING, header); + head.headers.insert(CONTENT_ENCODING, header); Response::from_parts(head, body) } @@ -274,7 +269,7 @@ pub fn brotli( let header = create_encoding_header(head.headers.remove(CONTENT_ENCODING), ContentCoding::BROTLI); head.headers.remove(CONTENT_LENGTH); - head.headers.append(CONTENT_ENCODING, header); + head.headers.insert(CONTENT_ENCODING, header); Response::from_parts(head, body) } @@ -301,7 +296,7 @@ pub fn zstd( ))); let header = create_encoding_header(head.headers.remove(CONTENT_ENCODING), ContentCoding::ZSTD); head.headers.remove(CONTENT_LENGTH); - head.headers.append(CONTENT_ENCODING, header); + head.headers.insert(CONTENT_ENCODING, header); Response::from_parts(head, body) } diff --git a/src/compression_static.rs b/src/compression_static.rs index 6dd47a04..032cd823 100644 --- a/src/compression_static.rs +++ b/src/compression_static.rs @@ -45,7 +45,7 @@ pub(crate) fn post_process( } // Compression content encoding varies so use a `Vary` header - resp.headers_mut().append( + resp.headers_mut().insert( hyper::header::VARY, HeaderValue::from_name(hyper::header::ACCEPT_ENCODING), ); diff --git a/src/handler.rs b/src/handler.rs index 88ffa556..c823ee06 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -324,11 +324,12 @@ mod tests { use std::net::SocketAddr; use crate::http_ext::MethodExt; - use crate::testing::fixtures::{fixture_req_handler, REMOTE_ADDR}; + use crate::testing::fixtures::{fixture_req_handler, fixture_settings, REMOTE_ADDR}; #[tokio::test] async fn check_allowed_methods() { - let req_handler = fixture_req_handler("toml/handler.toml"); + let settings = fixture_settings("toml/handler.toml"); + let req_handler = fixture_req_handler(settings.general, settings.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let methods = [ diff --git a/src/testing.rs b/src/testing.rs index c0fbaf76..1be6e3f9 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -13,19 +13,24 @@ pub mod fixtures { use crate::{ handler::{RequestHandler, RequestHandlerOpts}, + settings::cli::General, + settings::Advanced, Settings, }; /// Testing Remote address pub const REMOTE_ADDR: &str = "127.0.0.1:1234"; - /// Create a `RequestHandler` from a custom TOML config file (fixture). - pub fn fixture_req_handler(fixture_toml: &str) -> RequestHandler { + /// Load the fixture TOML settings and return it. + pub fn fixture_settings(fixture_toml: &str) -> Settings { // Replace default config file and load the fixture TOML settings let f = PathBuf::from("tests/fixtures").join(fixture_toml); std::env::set_var("SERVER_CONFIG_FILE", f); - let opts = Settings::get(false).unwrap(); + Settings::get(false).unwrap() + } + /// Create a `RequestHandler` from a custom TOML config file (fixture). + pub fn fixture_req_handler(general: General, advanced: Option) -> RequestHandler { #[cfg(not(any( feature = "compression", feature = "compression-gzip", @@ -49,7 +54,7 @@ pub mod fixtures { feature = "compression-zstd", feature = "compression-deflate" ))] - let compression = opts.general.compression; + let compression = general.compression; #[cfg(any( feature = "compression", feature = "compression-gzip", @@ -57,10 +62,10 @@ pub mod fixtures { feature = "compression-zstd", feature = "compression-deflate" ))] - let compression_static = opts.general.compression_static; + let compression_static = general.compression_static; let req_handler_opts = RequestHandlerOpts { - root_dir: opts.general.root, + root_dir: general.root, compression, compression_static, #[cfg(any( @@ -70,35 +75,35 @@ pub mod fixtures { feature = "compression-zstd", feature = "compression-deflate" ))] - compression_level: opts.general.compression_level, + compression_level: general.compression_level, #[cfg(feature = "directory-listing")] - dir_listing: opts.general.directory_listing, + dir_listing: general.directory_listing, #[cfg(feature = "directory-listing")] - dir_listing_order: opts.general.directory_listing_order, + dir_listing_order: general.directory_listing_order, #[cfg(feature = "directory-listing")] - dir_listing_format: opts.general.directory_listing_format, + dir_listing_format: general.directory_listing_format, // TODO: add support or `cors` when required cors: None, - security_headers: opts.general.security_headers, - cache_control_headers: opts.general.cache_control_headers, - page404: opts.general.page404, - page50x: opts.general.page50x, + security_headers: general.security_headers, + cache_control_headers: general.cache_control_headers, + page404: general.page404, + page50x: general.page50x, // TODO: add support or `page_fallback` when required #[cfg(feature = "fallback-page")] page_fallback: vec![], #[cfg(feature = "basic-auth")] - basic_auth: opts.general.basic_auth, - log_remote_address: opts.general.log_remote_address, - redirect_trailing_slash: opts.general.redirect_trailing_slash, - ignore_hidden_files: opts.general.ignore_hidden_files, - index_files: vec![opts.general.index_files], - health: opts.general.health, + basic_auth: general.basic_auth, + log_remote_address: general.log_remote_address, + redirect_trailing_slash: general.redirect_trailing_slash, + ignore_hidden_files: general.ignore_hidden_files, + index_files: vec![general.index_files], + health: general.health, #[cfg(all(unix, feature = "experimental"))] - experimental_metrics: opts.general.experimental_metrics, - maintenance_mode: opts.general.maintenance_mode, - maintenance_mode_status: opts.general.maintenance_mode_status, - maintenance_mode_file: opts.general.maintenance_mode_file, - advanced_opts: opts.advanced, + experimental_metrics: general.experimental_metrics, + maintenance_mode: general.maintenance_mode, + maintenance_mode_status: general.maintenance_mode_status, + maintenance_mode_file: general.maintenance_mode_file, + advanced_opts: advanced, }; RequestHandler { diff --git a/tests/compression.rs b/tests/compression.rs new file mode 100644 index 00000000..79d593cd --- /dev/null +++ b/tests/compression.rs @@ -0,0 +1,64 @@ +#![forbid(unsafe_code)] +#![deny(warnings)] +#![deny(rust_2018_idioms)] +#![deny(dead_code)] + +pub mod tests { + use headers::HeaderValue; + use hyper::Request; + use std::net::SocketAddr; + + use static_web_server::{ + settings::cli::General, + testing::fixtures::{fixture_req_handler, fixture_settings, REMOTE_ADDR}, + }; + + #[tokio::test] + async fn compression_file() { + let opts = fixture_settings("toml/handler.toml"); + let general = General { + compression: true, + compression_static: true, + ..opts.general + }; + let req_handler = fixture_req_handler(general, opts.advanced); + let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); + + 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(), + ); + + match req_handler.handle(&mut req, remote_addr).await { + Ok(res) => { + assert_eq!(res.status(), 200); + assert_eq!( + res.headers().get("content-type"), + Some(&HeaderValue::from_static("text/html")) + ); + assert_eq!( + res.headers().get("vary"), + Some(&HeaderValue::from_static("accept-encoding")) + ); + assert_eq!( + res.headers().get("content-encoding"), + Some(&HeaderValue::from_static("gzip")) + ); + assert_eq!( + res.headers().get("cache-control"), + Some(&HeaderValue::from_static("public, max-age=86400")) + ); + assert_eq!( + res.headers().get("server"), + Some(&HeaderValue::from_static("Static Web Server")) + ); + } + Err(err) => { + panic!("unexpected error: {err}") + } + }; + } +} diff --git a/tests/compression_static.rs b/tests/compression_static.rs index fff1c7c6..e046cd6b 100644 --- a/tests/compression_static.rs +++ b/tests/compression_static.rs @@ -316,7 +316,7 @@ mod tests { assert!(!headers["last-modified"].is_empty()); assert_eq!( &headers["content-type"], "application/javascript", - "content-type is not html" + "content-type is not javascript" ); let body = hyper::body::to_bytes(res.body_mut()) diff --git a/tests/experimental_metrics.rs b/tests/experimental_metrics.rs index fed395cc..16bde81a 100644 --- a/tests/experimental_metrics.rs +++ b/tests/experimental_metrics.rs @@ -8,11 +8,14 @@ pub mod tests { use hyper::Request; use std::net::SocketAddr; - use static_web_server::testing::fixtures::{fixture_req_handler, REMOTE_ADDR}; + use static_web_server::testing::fixtures::{ + fixture_req_handler, fixture_settings, REMOTE_ADDR, + }; #[tokio::test] async fn experimental_metrics_enabled() { - let req_handler = fixture_req_handler("toml/experimental_metrics.toml"); + let opts = fixture_settings("toml/experimental_metrics.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); diff --git a/tests/handler.rs b/tests/handler.rs index dda7e9d1..669b4431 100644 --- a/tests/handler.rs +++ b/tests/handler.rs @@ -8,11 +8,14 @@ pub mod tests { use hyper::Request; use std::net::SocketAddr; - use static_web_server::testing::fixtures::{fixture_req_handler, REMOTE_ADDR}; + use static_web_server::testing::fixtures::{ + fixture_req_handler, fixture_settings, REMOTE_ADDR, + }; #[tokio::test] async fn custom_headers_apply_for_dir() { - let req_handler = fixture_req_handler("toml/handler.toml"); + let opts = fixture_settings("toml/handler.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -26,6 +29,10 @@ pub mod tests { res.headers().get("content-type"), Some(&HeaderValue::from_static("text/html")) ); + 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")) @@ -39,7 +46,8 @@ pub mod tests { #[tokio::test] async fn custom_headers_apply_for_file() { - let req_handler = fixture_req_handler("toml/handler.toml"); + let opts = fixture_settings("toml/handler.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -53,6 +61,14 @@ pub mod tests { res.headers().get("content-type"), Some(&HeaderValue::from_static("text/html")) ); + 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")) + ); assert_eq!( res.headers().get("server"), Some(&HeaderValue::from_static("Static Web Server")) diff --git a/tests/redirects.rs b/tests/redirects.rs index aae5f590..c499ab9f 100644 --- a/tests/redirects.rs +++ b/tests/redirects.rs @@ -7,11 +7,14 @@ pub mod tests { use hyper::Request; use std::net::SocketAddr; - use static_web_server::testing::fixtures::{fixture_req_handler, REMOTE_ADDR}; + use static_web_server::testing::fixtures::{ + fixture_req_handler, fixture_settings, REMOTE_ADDR, + }; #[tokio::test] async fn redirects_skipped() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -30,7 +33,8 @@ pub mod tests { #[tokio::test] async fn redirects_host() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -49,7 +53,8 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_1() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -71,7 +76,8 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_2() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -93,7 +99,8 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_3() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -115,7 +122,8 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_4() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -137,7 +145,8 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_5() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -159,7 +168,8 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_6() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); @@ -181,7 +191,8 @@ pub mod tests { #[tokio::test] async fn redirects_glob_groups_generic_1() { - let req_handler = fixture_req_handler("toml/redirects.toml"); + 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 mut req = Request::default(); diff --git a/tests/rewrites.rs b/tests/rewrites.rs index fe04ffb4..d237e7ca 100644 --- a/tests/rewrites.rs +++ b/tests/rewrites.rs @@ -7,11 +7,14 @@ pub mod tests { use hyper::Request; use std::net::SocketAddr; - use static_web_server::testing::fixtures::{fixture_req_handler, REMOTE_ADDR}; + use static_web_server::testing::fixtures::{ + fixture_req_handler, fixture_settings, REMOTE_ADDR, + }; #[tokio::test] async fn rewrites_skipped() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -30,7 +33,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_1() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -55,7 +59,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_2() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -80,7 +85,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_3() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -105,7 +111,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_4() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -130,7 +137,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_5() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -149,7 +157,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_6() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); @@ -171,7 +180,8 @@ pub mod tests { #[tokio::test] async fn rewrites_glob_groups_generic_1() { - let req_handler = fixture_req_handler("toml/rewrites.toml"); + let opts = fixture_settings("toml/rewrites.toml"); + let req_handler = fixture_req_handler(opts.general, opts.advanced); let remote_addr = Some(REMOTE_ADDR.parse::().unwrap()); let mut req = Request::default(); From cd5fa1bbc38288984c6cebce7cf26f436fe05125 Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Mon, 10 Jun 2024 22:08:34 +0200 Subject: [PATCH 08/12] chore: update dependencies 10.06.2024 --- Cargo.lock | 331 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 278 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 40cfeb90..170399a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,9 +249,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" dependencies = [ "jobserver", "libc", @@ -288,9 +288,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" dependencies = [ "clap_builder", "clap_derive", @@ -298,9 +298,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" dependencies = [ "anstream", "anstyle", @@ -310,9 +310,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck", "proc-macro2", @@ -322,9 +322,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "colorchoice" @@ -411,6 +411,17 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -643,9 +654,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "9f3935c160d00ac752e09787e6e6bfc26494c2183cc922f1bc678a60d4733bc2" [[package]] name = "httpdate" @@ -700,14 +711,134 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "idna" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", + "smallvec", + "utf8_iter", ] [[package]] @@ -812,6 +943,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -1103,9 +1240,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -1115,9 +1252,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1126,9 +1263,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "ring" @@ -1360,6 +1497,12 @@ 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static-web-server" version = "2.31.1" @@ -1428,6 +1571,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thiserror" version = "1.0.61" @@ -1512,20 +1666,15 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.38.0" @@ -1751,27 +1900,12 @@ dependencies = [ "version_check", ] -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-xid" version = "0.2.4" @@ -1786,20 +1920,32 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -2083,19 +2229,98 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.11" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c52728401e1dc672a56e81e593e912aa54c78f40246869f78359a2bf24d29d" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zstd" version = "0.13.1" From eeb88dab51705610660988576e065f723339fe6b Mon Sep 17 00:00:00 2001 From: Jose Quintana <1700322+joseluisq@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:46:50 +0200 Subject: [PATCH 09/12] feat: disable symlinks option via `--disable-symlinks` (#454) * feat: disable symlinks option --disable-symlinks[=] Prevent following files or directories if any path name component is a symbolic link [env: SERVER_DISABLE_SYMLINKS=] [default: false] [possible values: true, false] * chore: add tests * docs: feature page [skip ci] --- .../configuration/command-line-arguments.md | 261 +++--------------- .../configuration/environment-variables.md | 23 +- docs/content/features/disable-symlinks.md | 15 + docs/mkdocs.yml | 1 + src/directory_listing.rs | 73 ++--- src/handler.rs | 5 + src/server.rs | 5 + src/settings/cli.rs | 12 + src/settings/file.rs | 3 + src/settings/mod.rs | 5 + src/static_files.rs | 15 + src/testing.rs | 1 + tests/compression_static.rs | 5 + tests/dir_listing.rs | 12 +- tests/fixtures/public/symlink | 1 + tests/static_files.rs | 129 ++++++++- 16 files changed, 294 insertions(+), 272 deletions(-) create mode 100644 docs/content/features/disable-symlinks.md create mode 120000 tests/fixtures/public/symlink diff --git a/docs/content/configuration/command-line-arguments.md b/docs/content/configuration/command-line-arguments.md index b9d3766e..1ab76d82 100644 --- a/docs/content/configuration/command-line-arguments.md +++ b/docs/content/configuration/command-line-arguments.md @@ -16,262 +16,89 @@ Usage: static-web-server [OPTIONS] Options: -a, --host - Host address (E.g 127.0.0.1 or ::1) - - [env: SERVER_HOST=] - [default: ::] - + Host address (E.g 127.0.0.1 or ::1) [env: SERVER_HOST=] [default: ::] -p, --port - Host port - - [env: SERVER_PORT=] - [default: 80] - + Host port [env: SERVER_PORT=] [default: 80] -f, --fd - Instead of binding to a TCP port, accept incoming connections to an already-bound TCP socket listener on the specified file descriptor number (usually zero). Requires that the parent process (e.g. inetd, launchd, or systemd) binds an address and port on behalf of static-web-server, before arranging for the resulting file descriptor to be inherited by static-web-server. Cannot be used in conjunction with the port and host arguments. The included systemd unit file utilises this feature to increase security by allowing the static-web-server to be sandboxed more completely - - [env: SERVER_LISTEN_FD=] - + Instead of binding to a TCP port, accept incoming connections to an already-bound TCP socket listener on the specified file descriptor number (usually zero). Requires that the parent process (e.g. inetd, launchd, or systemd) binds an address and port on behalf of static-web-server, before arranging for the resulting file descriptor to be inherited by static-web-server. Cannot be used in conjunction with the port and host arguments. The included systemd unit file utilises this feature to increase security by allowing the static-web-server to be sandboxed more completely [env: SERVER_LISTEN_FD=] -n, --threads-multiplier - Number of worker threads multiplier that'll be multiplied by the number of system CPUs using the formula: `worker threads = number of CPUs * n` where `n` is the value that changes here. When multiplier value is 0 or 1 then one thread per core is used. Number of worker threads result should be a number between 1 and 32,768 though it is advised to keep this value on the smaller side - - [env: SERVER_THREADS_MULTIPLIER=] - [default: 1] - + Number of worker threads multiplier that'll be multiplied by the number of system CPUs using the formula: `worker threads = number of CPUs * n` where `n` is the value that changes here. When multiplier value is 0 or 1 then one thread per core is used. Number of worker threads result should be a number between 1 and 32,768 though it is advised to keep this value on the smaller side [env: SERVER_THREADS_MULTIPLIER=] [default: 1] -b, --max-blocking-threads - Maximum number of blocking threads - - [env: SERVER_MAX_BLOCKING_THREADS=] - [default: 512] - + Maximum number of blocking threads [env: SERVER_MAX_BLOCKING_THREADS=] [default: 512] -d, --root - Root directory path of static files - - [env: SERVER_ROOT=] - [default: ./public] - + Root directory path of static files [env: SERVER_ROOT=] [default: ./public] --page50x - HTML file path for 50x errors. If the path is not specified or simply doesn't exist then the server will use a generic HTML error message. If a relative path is used then it will be resolved under the root directory - - [env: SERVER_ERROR_PAGE_50X=] - [default: ./50x.html] - + HTML file path for 50x errors. If the path is not specified or simply doesn't exist then the server will use a generic HTML error message. If a relative path is used then it will be resolved under the root directory [env: SERVER_ERROR_PAGE_50X=] [default: ./50x.html] --page404 - HTML file path for 404 errors. If the path is not specified or simply doesn't exist then the server will use a generic HTML error message. If a relative path is used then it will be resolved under the root directory - - [env: SERVER_ERROR_PAGE_404=] - [default: ./404.html] - + HTML file path for 404 errors. If the path is not specified or simply doesn't exist then the server will use a generic HTML error message. If a relative path is used then it will be resolved under the root directory [env: SERVER_ERROR_PAGE_404=] [default: ./404.html] --page-fallback - HTML file path that is used for GET requests when the requested path doesn't exist. The fallback page is served with a 200 status code, useful when using client routers. If the path is not specified or simply doesn't exist then this feature will not be active - - [env: SERVER_FALLBACK_PAGE=] - [default: ] - + HTML file path that is used for GET requests when the requested path doesn't exist. The fallback page is served with a 200 status code, useful when using client routers. If the path is not specified or simply doesn't exist then this feature will not be active [env: SERVER_FALLBACK_PAGE=] [default: ] -g, --log-level - Specify a logging level in lower case. Values: error, warn, info, debug or trace - - [env: SERVER_LOG_LEVEL=] - [default: error] - + Specify a logging level in lower case. Values: error, warn, info, debug or trace [env: SERVER_LOG_LEVEL=] [default: error] -c, --cors-allow-origins - Specify an optional CORS list of allowed origin hosts separated by commas. Host ports or protocols aren't being checked. Use an asterisk (*) to allow any host - - [env: SERVER_CORS_ALLOW_ORIGINS=] - [default: ] - + Specify an optional CORS list of allowed origin hosts separated by commas. Host ports or protocols aren't being checked. Use an asterisk (*) to allow any host [env: SERVER_CORS_ALLOW_ORIGINS=] [default: ] -j, --cors-allow-headers - Specify an optional CORS list of allowed headers separated by commas. Default "origin, content-type". It requires `--cors-allow-origins` to be used along with - - [env: SERVER_CORS_ALLOW_HEADERS=] - [default: "origin, content-type, authorization"] - + Specify an optional CORS list of allowed headers separated by commas. Default "origin, content-type". It requires `--cors-allow-origins` to be used along with [env: SERVER_CORS_ALLOW_HEADERS=] [default: "origin, content-type, authorization"] --cors-expose-headers - Specify an optional CORS list of exposed headers separated by commas. Default "origin, content-type". It requires `--cors-expose-origins` to be used along with - - [env: SERVER_CORS_EXPOSE_HEADERS=] - [default: "origin, content-type"] - + Specify an optional CORS list of exposed headers separated by commas. Default "origin, content-type". It requires `--cors-expose-origins` to be used along with [env: SERVER_CORS_EXPOSE_HEADERS=] [default: "origin, content-type"] -t, --http2[=] - Enable HTTP/2 with TLS support - - [env: SERVER_HTTP2_TLS=] - [default: false] - [possible values: true, false] - + Enable HTTP/2 with TLS support [env: SERVER_HTTP2_TLS=] [default: false] [possible values: true, false] --http2-tls-cert - Specify the file path to read the certificate - - [env: SERVER_HTTP2_TLS_CERT=] - + Specify the file path to read the certificate [env: SERVER_HTTP2_TLS_CERT=] --http2-tls-key - Specify the file path to read the private key - - [env: SERVER_HTTP2_TLS_KEY=] - + Specify the file path to read the private key [env: SERVER_HTTP2_TLS_KEY=] --https-redirect[=] - Redirect all requests with scheme "http" to "https" for the current server instance. It depends on "http2" to be enabled - - [env: SERVER_HTTPS_REDIRECT=] - [default: false] - [possible values: true, false] - + Redirect all requests with scheme "http" to "https" for the current server instance. It depends on "http2" to be enabled [env: SERVER_HTTPS_REDIRECT=] [default: false] [possible values: true, false] --https-redirect-host - Canonical host name or IP of the HTTPS (HTTPS/2) server. It depends on "https_redirect" to be enabled - - [env: SERVER_HTTPS_REDIRECT_HOST=] - [default: localhost] - + Canonical host name or IP of the HTTPS (HTTPS/2) server. It depends on "https_redirect" to be enabled [env: SERVER_HTTPS_REDIRECT_HOST=] [default: localhost] --https-redirect-from-port - HTTP host port where the redirect server will listen for requests to redirect them to HTTPS. It depends on "https_redirect" to be enabled - - [env: SERVER_HTTPS_REDIRECT_FROM_PORT=] - [default: 80] - + HTTP host port where the redirect server will listen for requests to redirect them to HTTPS. It depends on "https_redirect" to be enabled [env: SERVER_HTTPS_REDIRECT_FROM_PORT=] [default: 80] --https-redirect-from-hosts - List of host names or IPs allowed to redirect from. HTTP requests must contain the HTTP 'Host' header and match against this list. It depends on "https_redirect" to be enabled - - [env: SERVER_HTTPS_REDIRECT_FROM_HOSTS=] - [default: localhost] - + List of host names or IPs allowed to redirect from. HTTP requests must contain the HTTP 'Host' header and match against this list. It depends on "https_redirect" to be enabled [env: SERVER_HTTPS_REDIRECT_FROM_HOSTS=] [default: localhost] --index-files - List of files that will be used as an index for requests ending with the slash character (‘/’). Files are checked in the specified order - - [env: SERVER_INDEX_FILES=] - [default: index.html] - + List of files that will be used as an index for requests ending with the slash character (‘/’). Files are checked in the specified order [env: SERVER_INDEX_FILES=] [default: index.html] -x, --compression[=] - Gzip, Deflate, Brotli or Zstd compression on demand determined by the Accept-Encoding header and applied to text-based web file types only - - [env: SERVER_COMPRESSION=] - [default: true] - [possible values: true, false] - + Gzip, Deflate, Brotli or Zstd compression on demand determined by the Accept-Encoding header and applied to text-based web file types only [env: SERVER_COMPRESSION=] [default: true] [possible values: true, false] --compression-level - Compression level to apply for Gzip, Deflate, Brotli or Zstd compression - - [env: SERVER_COMPRESSION_LEVEL=] - [default: default] - - Possible values: - - fastest: Fastest execution at the expense of larger file sizes - - best: Smallest file size but potentially slow - - default: Algorithm-specific default compression level setting - + Compression level to apply for Gzip, Deflate, Brotli or Zstd compression [env: SERVER_COMPRESSION_LEVEL=] [default: default] [possible values: fastest, best, default] --compression-static[=] - Look up the pre-compressed file variant (`.gz`, `.br` or `.zst`) on disk of a requested file and serves it directly if available. The compression type is determined by the `Accept-Encoding` header - - [env: SERVER_COMPRESSION_STATIC=] - [default: false] - [possible values: true, false] - + Look up the pre-compressed file variant (`.gz`, `.br` or `.zst`) on disk of a requested file and serves it directly if available. The compression type is determined by the `Accept-Encoding` header [env: SERVER_COMPRESSION_STATIC=] [default: false] [possible values: true, false] -z, --directory-listing[=] - Enable directory listing for all requests ending with the slash character (‘/’) - - [env: SERVER_DIRECTORY_LISTING=] - [default: false] - [possible values: true, false] - + Enable directory listing for all requests ending with the slash character (‘/’) [env: SERVER_DIRECTORY_LISTING=] [default: false] [possible values: true, false] --directory-listing-order - Specify a default code number to order directory listing entries per `Name`, `Last modified` or `Size` attributes (columns). Code numbers supported: 0 (Name asc), 1 (Name desc), 2 (Last modified asc), 3 (Last modified desc), 4 (Size asc), 5 (Size desc). Default 6 (unordered) - - [env: SERVER_DIRECTORY_LISTING_ORDER=] - [default: 6] - + Specify a default code number to order directory listing entries per `Name`, `Last modified` or `Size` attributes (columns). Code numbers supported: 0 (Name asc), 1 (Name desc), 2 (Last modified asc), 3 (Last modified desc), 4 (Size asc), 5 (Size desc). Default 6 (unordered) [env: SERVER_DIRECTORY_LISTING_ORDER=] [default: 6] --directory-listing-format - Specify a content format for directory listing entries. Formats supported: "html" or "json". Default "html" - - [env: SERVER_DIRECTORY_LISTING_FORMAT=] - [default: html] - - Possible values: - - html: HTML format to display (default) - - json: JSON format to display - + Specify a content format for directory listing entries. Formats supported: "html" or "json". Default "html" [env: SERVER_DIRECTORY_LISTING_FORMAT=] [default: html] [possible values: html, json] --security-headers[=] - Enable security headers by default when HTTP/2 feature is activated. Headers included: "Strict-Transport-Security: max-age=63072000; includeSubDomains; preload" (2 years max-age), "X-Frame-Options: DENY" and "Content-Security-Policy: frame-ancestors 'self'" - - [env: SERVER_SECURITY_HEADERS=] - [default: false] - [possible values: true, false] - + Enable security headers by default when HTTP/2 feature is activated. Headers included: "Strict-Transport-Security: max-age=63072000; includeSubDomains; preload" (2 years max-age), "X-Frame-Options: DENY" and "Content-Security-Policy: frame-ancestors 'self'" [env: SERVER_SECURITY_HEADERS=] [default: false] [possible values: true, false] -e, --cache-control-headers[=] - Enable cache control headers for incoming requests based on a set of file types. The file type list can be found on `src/control_headers.rs` file - - [env: SERVER_CACHE_CONTROL_HEADERS=] - [default: true] - [possible values: true, false] - + Enable cache control headers for incoming requests based on a set of file types. The file type list can be found on `src/control_headers.rs` file [env: SERVER_CACHE_CONTROL_HEADERS=] [default: true] [possible values: true, false] --basic-auth - It provides The "Basic" HTTP Authentication scheme using credentials as "user-id:password" pairs. Password must be encoded using the "BCrypt" password-hashing function - - [env: SERVER_BASIC_AUTH=] - [default: ] - + It provides The "Basic" HTTP Authentication scheme using credentials as "user-id:password" pairs. Password must be encoded using the "BCrypt" password-hashing function [env: SERVER_BASIC_AUTH=] [default: ] -q, --grace-period - Defines a grace period in seconds after a `SIGTERM` signal is caught which will delay the server before to shut it down gracefully. The maximum value is 255 seconds - - [env: SERVER_GRACE_PERIOD=] - [default: 0] - + Defines a grace period in seconds after a `SIGTERM` signal is caught which will delay the server before to shut it down gracefully. The maximum value is 255 seconds [env: SERVER_GRACE_PERIOD=] [default: 0] -w, --config-file - Server TOML configuration file path - - [env: SERVER_CONFIG_FILE=] - [default: ./config.toml] - + Server TOML configuration file path [env: SERVER_CONFIG_FILE=] [default: ./config.toml] --log-remote-address[=] - Log incoming requests information along with its remote address if available using the `info` log level - - [env: SERVER_LOG_REMOTE_ADDRESS=] - [default: false] - [possible values: true, false] - + Log incoming requests information along with its remote address if available using the `info` log level [env: SERVER_LOG_REMOTE_ADDRESS=] [default: false] [possible values: true, false] --redirect-trailing-slash[=] - Check for a trailing slash in the requested directory URI and redirect permanently (308) to the same path with a trailing slash suffix if it is missing - - [env: SERVER_REDIRECT_TRAILING_SLASH=] - [default: true] - [possible values: true, false] - + Check for a trailing slash in the requested directory URI and redirect permanently (308) to the same path with a trailing slash suffix if it is missing [env: SERVER_REDIRECT_TRAILING_SLASH=] [default: true] [possible values: true, false] --ignore-hidden-files[=] - Ignore hidden files/directories (dotfiles), preventing them to be served and being included in auto HTML index pages (directory listing) - - [env: SERVER_IGNORE_HIDDEN_FILES=] - [default: false] - [possible values: true, false] - + Ignore hidden files/directories (dotfiles), preventing them to be served and being included in auto HTML index pages (directory listing) [env: SERVER_IGNORE_HIDDEN_FILES=] [default: false] [possible values: true, false] + --disable-symlinks[=] + Prevent following files or directories if any path name component is a symbolic link [env: SERVER_DISABLE_SYMLINKS=] [default: false] [possible values: true, false] --health[=] - Add a /health endpoint that doesn't generate any log entry and returns a 200 status code. This is especially useful with Kubernetes liveness and readiness probes - - [env: SERVER_HEALTH=] - [default: false] - [possible values: true, false] - + Add a /health endpoint that doesn't generate any log entry and returns a 200 status code. This is especially useful with Kubernetes liveness and readiness probes [env: SERVER_HEALTH=] [default: false] [possible values: true, false] --maintenance-mode[=] - Enable the server's maintenance mode functionality - - [env: SERVER_MAINTENANCE_MODE=] - [default: false] - [possible values: true, false] - + Enable the server's maintenance mode functionality [env: SERVER_MAINTENANCE_MODE=] [default: false] [possible values: true, false] --maintenance-mode-status - Provide a custom HTTP status code when entering into maintenance mode. Default 503 - - [env: SERVER_MAINTENANCE_MODE_STATUS=] - [default: 503] - + Provide a custom HTTP status code when entering into maintenance mode. Default 503 [env: SERVER_MAINTENANCE_MODE_STATUS=] [default: 503] --maintenance-mode-file - Provide a custom maintenance mode HTML file. If not provided then a generic message will be displayed - - [env: SERVER_MAINTENANCE_MODE_FILE=] - [default: ] - - -h, --help - Print help (see a summary with '-h') - + Provide a custom maintenance mode HTML file. If not provided then a generic message will be displayed [env: SERVER_MAINTENANCE_MODE_FILE=] [default: ] -V, --version - Print version + Print version info and exit + -h, --help + Print help (see more with '--help') ``` ## Windows diff --git a/docs/content/configuration/environment-variables.md b/docs/content/configuration/environment-variables.md index 1fdda308..046bbf49 100644 --- a/docs/content/configuration/environment-variables.md +++ b/docs/content/configuration/environment-variables.md @@ -7,13 +7,13 @@ The server can be configured via the following environment variables. - [Command-line arguments](./command-line-arguments.md) take precedence over their equivalent environment variables. ### SERVER_HOST -The address of the host (E.g 127.0.0.1). Default `[::]`. +The address of the host (e.g. 127.0.0.1). Default `[::]`. ### SERVER_PORT The port of the host. Default `80`. ### SERVER_LISTEN_FD -Optional file descriptor number (e.g. `0`) to inherit an already-opened TCP listener on (instead of using `SERVER_HOST` and/or `SERVER_PORT`). Default empty (disabled). +Optional file descriptor number (e.g. `0`) to inherit an already-opened TCP listener (instead of using `SERVER_HOST` and/or `SERVER_PORT`). Default empty (disabled). ### SERVER_ROOT Relative or absolute root directory path of static files. Default `./public`. @@ -25,10 +25,10 @@ The Server configuration file path is in TOML format. See [The TOML Configuratio Defines a grace period in seconds after a `SIGTERM` signal is caught which will delay the server before shutting it down gracefully. The maximum value is `255` seconds. The default value is `0` (no delay). ### SERVER_LOG_LEVEL -Specify a logging level in lower case. Possible values are `error`, `warn`, `info`, `debug` or `trace`. Default `error`. +Specify a logging level in lowercase. Possible values are `error`, `warn`, `info`, `debug` or `trace`. Default `error`. ### SERVER_LOG_REMOTE_ADDRESS -Log incoming requests information along with its Remote Address (IP) if available using the `info` log level. Default `false`. +Log incoming request information along with its Remote Address (IP) if available using the `info` log level. Default `false`. ### SERVER_ERROR_PAGE_404 HTML file path for 404 errors. If the path is not specified or simply doesn't exist then the server will use a generic HTML error message. @@ -39,10 +39,10 @@ HTML file path for 50x errors. If the path is not specified or simply doesn't ex If a relative path is used then it will be resolved under the root directory. Default `./50x.html` ### SERVER_FALLBACK_PAGE -HTML file path that is used for `GET` requests when the requested path doesn't exist. The fallback page is served with a `200` status code, useful when using client routers (E.g `React Router`). If the path is not specified or simply doesn't exist then this feature will not be active. +HTML file path that is used for `GET` requests when the requested path doesn't exist. The fallback page is served with a `200` status code, useful when using client routers (e.g. `React Router``). If the path is not specified or simply doesn't exist then this feature will not be active. ### SERVER_THREADS_MULTIPLIER -The number of worker threads multiplier that'll be multiplied by the number of system CPUs using the formula: `worker threads = number of CPUs * n` where `n` is the value that changes here. When the multiplier value is 0 or 1 then the `number of CPUs` is used. The number of worker threads result should be a number between 1 and 32,768 though it is advised to keep this value on the smaller side. Default one thread per core. +The number of worker threads multiplier will be multiplied by the number of system CPUs using the formula: `worker threads = number of CPUs * n` where `n` is the value that changes here. When the multiplier value is 0 or 1 then the `number of CPUs` is used. The number of worker threads result should be a number between 1 and 32,768 though it is advised to keep this value on the smaller side. Default one thread per core. ### SERVER_MAX_BLOCKING_THREADS Maximum number of blocking threads. @@ -84,7 +84,7 @@ Specify an optional CORS list of exposed HTTP headers separated by commas. It re Supported values are `fastest` (fast compression but larger resulting files), `best` (smallest file size but potentially slow) and `default` (algorithm-specific balanced compression level). Default is `default`. ### SERVER_COMPRESSION_STATIC -Look up the pre-compressed file variant (`.gz`, `.br` or `.zst`) on disk of a requested file and serves it directly if available. Default `false` (disabled). The compression type is determined by the `Accept-Encoding` header. +Look up the pre-compressed file variant (`.gz`, `.br` or `.zst`) on the disk of a requested file and serve it directly if available. Default `false` (disabled). The compression type is determined by the `Accept-Encoding` header. ### SERVER_DIRECTORY_LISTING Enable directory listing for all requests ending with the slash character (‘/’). Default `false` (disabled). @@ -96,10 +96,10 @@ Specify a default code number to order directory listing entries per `Name`, `La Specify a content format for the directory listing entries. Formats supported: `html` or `json`. Default `html`. ### SERVER_SECURITY_HEADERS -Enable security headers by default when HTTP/2 feature is activated. Headers included: `Strict-Transport-Security: max-age=63072000; includeSubDomains; preload` (2 years max-age), `X-Frame-Options: DENY` and `Content-Security-Policy: frame-ancestors 'self'`. Default `false` (disabled). +Enable security headers by default when the HTTP/2 feature is activated. Headers included: `Strict-Transport-Security: max-age=63072000; includeSubDomains; preload` (2 years max-age), `X-Frame-Options: DENY` and `Content-Security-Policy: frame-ancestors 'self'`. Default `false` (disabled). ### SERVER_CACHE_CONTROL_HEADERS -Enable cache control headers for incoming requests based on a set of file types. The file type list can be found on [`src/control_headers.rs`](https://github.com/static-web-server/static-web-server/blob/master//src/control_headers.rs) file. Default `true` (enabled). +Enable cache control headers for incoming requests based on a set of file types. The file type list can be found in [`src/control_headers.rs`](https://github.com/static-web-server/static-web-server/blob/master//src/control_headers.rs) file. Default `true` (enabled). ### SERVER_BASIC_AUTH It provides [The "Basic" HTTP Authentication Scheme](https://datatracker.ietf.org/doc/html/rfc7617) using credentials as `user-id:password` pairs, encoded using `Base64`. Password must be encoded using the [BCrypt](https://en.wikipedia.org/wiki/Bcrypt) password-hashing function. Default empty (disabled). @@ -108,7 +108,10 @@ It provides [The "Basic" HTTP Authentication Scheme](https://datatracker.ietf.or Check for a trailing slash in the requested directory URI and redirect permanent (308) to the same path with a trailing slash suffix if it is missing. Default `true` (enabled). ### SERVER_IGNORE_HIDDEN_FILES -Ignore hidden files/directories (dotfiles), preventing them to be served and being included in auto HTML index pages (directory listing). +Ignore hidden files/directories (dotfiles), preventing them from being served and being included in auto HTML index pages (directory listing). + +### SERVER_DISABLE_SYMLINKS +Prevent following files or directories if any path name component is a symbolic link. ### SERVER_HEALTH Activate the health endpoint. diff --git a/docs/content/features/disable-symlinks.md b/docs/content/features/disable-symlinks.md new file mode 100644 index 00000000..4d63085d --- /dev/null +++ b/docs/content/features/disable-symlinks.md @@ -0,0 +1,15 @@ +# Disable Symlinks + +**`SWS`** does follow symlinks by default. However, it's possible to disable all symlinks (deny access) by preventing to following files or directories if any path name component is a symbolic link. This applies to direct requests (URL) or those using the directory listing. +As a result, SWS will respond with a `403 Forbidden` status. + +This feature is disabled by default and can be controlled by the boolean `--disable-symlinks` option or the equivalent [SERVER_DISABLE_SYMLINKS](./../configuration/environment-variables.md#server_disable_symlinks) env. + +Here is an example of how to ignore hidden files: + +```sh +static-web-server \ + -p=8787 -d=./public -g=trace \ + --directory-listing \ + --disable-symlinks +``` diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index e8b9d2d0..5d4decda 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -160,6 +160,7 @@ nav: - 'Windows Service': 'features/windows-service.md' - 'Trailing Slash Redirect': 'features/trailing-slash-redirect.md' - 'Ignore Files': 'features/ignore-files.md' + - 'Disable Symlinks': 'features/disable-symlinks.md' - 'Health endpoint': 'features/health-endpoint.md' - 'Virtual Hosting': 'features/virtual-hosting.md' - 'Multiple Index Files': 'features/multiple-index-files.md' diff --git a/src/directory_listing.rs b/src/directory_listing.rs index 89d0d5c6..5c6d7b7b 100644 --- a/src/directory_listing.rs +++ b/src/directory_listing.rs @@ -56,6 +56,8 @@ pub struct DirListOpts<'a> { pub dir_listing_format: &'a DirListFmt, /// Ignore hidden files (dotfiles). pub ignore_hidden_files: bool, + /// Prevent following symlinks for files and directories. + pub disable_symlinks: bool, } /// Initializes directory listings. @@ -89,16 +91,17 @@ pub fn auto_index( match std::fs::read_dir(parent) { Ok(dir_reader) => Either::Left(async move { - let is_head = opts.method.is_head(); - match read_dir_entries( + let dir_opts = DirEntryOpts { dir_reader, - opts.current_path, - opts.uri_query, - is_head, - opts.dir_listing_order, - opts.dir_listing_format, - opts.ignore_hidden_files, - ) { + base_path: opts.current_path, + uri_query: opts.uri_query, + is_head: opts.method.is_head(), + order_code: opts.dir_listing_order, + content_format: opts.dir_listing_format, + ignore_hidden_files: opts.ignore_hidden_files, + disable_symlinks: opts.disable_symlinks, + }; + match read_dir_entries(dir_opts) { Ok(resp) => Ok(resp), Err(err) => { tracing::error!("error after try to read directory entries: {:?}", err); @@ -175,22 +178,26 @@ struct SortingAttr<'a> { size: &'a str, } -/// It reads a list of directory entries and create an index page content. -/// Otherwise it returns a status error. -fn read_dir_entries( +/// Defines read directory entries. +struct DirEntryOpts<'a> { dir_reader: std::fs::ReadDir, - base_path: &str, - uri_query: Option<&str>, + base_path: &'a str, + uri_query: Option<&'a str>, is_head: bool, - mut order_code: u8, - content_format: &DirListFmt, + order_code: u8, + content_format: &'a DirListFmt, ignore_hidden_files: bool, -) -> Result> { + disable_symlinks: bool, +} + +/// It reads a list of directory entries and create an index page content. +/// Otherwise it returns a status error. +fn read_dir_entries(mut opt: DirEntryOpts<'_>) -> Result> { let mut dirs_count: usize = 0; let mut files_count: usize = 0; let mut file_entries: Vec = vec![]; - for dir_entry in dir_reader { + for dir_entry in opt.dir_reader { let dir_entry = dir_entry.with_context(|| "unable to read directory entry")?; let meta = match dir_entry.metadata() { Ok(m) => m, @@ -206,7 +213,7 @@ fn read_dir_entries( let name = dir_entry.file_name(); // Check and ignore the current hidden file/directory (dotfile) if feature enabled - if ignore_hidden_files && name.as_encoded_bytes().first().is_some_and(|c| *c == b'.') { + if opt.ignore_hidden_files && name.as_encoded_bytes().first().is_some_and(|c| *c == b'.') { continue; } @@ -216,7 +223,7 @@ fn read_dir_entries( } else if meta.is_file() { files_count += 1; (FileType::File, Some(meta.len())) - } else if meta.file_type().is_symlink() { + } else if !opt.disable_symlinks && meta.file_type().is_symlink() { // NOTE: we resolve the symlink path below to just know if is a directory or not. // However, we are still showing the symlink name but not the resolved name. @@ -264,11 +271,12 @@ fn read_dir_entries( // entries should contain the "parent/entry-name" as a link format. // Otherwise, we just use the "entry-name" as a link (default behavior). // Note that in both cases, we add a trailing slash if the entry is a directory. - let mut uri = if !base_path.ends_with('/') && !base_path.is_empty() { - let parent = base_path + let mut uri = if !opt.base_path.ends_with('/') && !opt.base_path.is_empty() { + let parent = opt + .base_path .rsplit_once('/') .map(|(_, parent)| parent) - .unwrap_or(base_path); + .unwrap_or(opt.base_path); format!("{parent}/{name_encoded}") } else { name_encoded @@ -280,24 +288,25 @@ fn read_dir_entries( let mtime = meta.modified().ok().map(DateTime::::from); - file_entries.push(FileEntry { + let entry = FileEntry { name, mtime, size, r#type, uri, - }); + }; + file_entries.push(entry); } // Check the query request uri for a sorting type. E.g https://blah/?sort=5 - if let Some(q) = uri_query { + if let Some(q) = opt.uri_query { let mut parts = form_urlencoded::parse(q.as_bytes()); if parts.count() > 0 { // NOTE: we just pick up the first value (pair) if let Some(sort) = parts.next() { if sort.0 == "sort" && !sort.1.trim().is_empty() { match sort.1.parse::() { - Ok(code) => order_code = code, + Ok(code) => opt.order_code = code, Err(err) => { tracing::error!( "sorting: query value error when converting to u8: {:?}", @@ -313,13 +322,13 @@ fn read_dir_entries( let mut resp = Response::new(Body::empty()); // Handle directory listing content format - let content = match content_format { + let content = match opt.content_format { DirListFmt::Json => { // JSON resp.headers_mut() .typed_insert(ContentType::from(mime::APPLICATION_JSON)); - json_auto_index(&mut file_entries, order_code)? + json_auto_index(&mut file_entries, opt.order_code)? } // HTML (default) _ => { @@ -327,11 +336,11 @@ fn read_dir_entries( .typed_insert(ContentType::from(mime::TEXT_HTML_UTF_8)); html_auto_index( - base_path, + opt.base_path, dirs_count, files_count, &mut file_entries, - order_code, + opt.order_code, ) } }; @@ -340,7 +349,7 @@ fn read_dir_entries( .typed_insert(ContentLength(content.len() as u64)); // We skip the body for HEAD requests - if is_head { + if opt.is_head { return Ok(resp); } diff --git a/src/handler.rs b/src/handler.rs index c823ee06..fa1581c4 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -95,6 +95,8 @@ pub struct RequestHandlerOpts { pub redirect_trailing_slash: bool, /// Ignore hidden files feature. pub ignore_hidden_files: bool, + /// Prevent following symlinks for files and directories. + pub disable_symlinks: bool, /// Health endpoint feature. pub health: bool, /// Metrics endpoint feature (experimental). @@ -144,6 +146,7 @@ impl Default for RequestHandlerOpts { log_remote_address: false, redirect_trailing_slash: true, ignore_hidden_files: false, + disable_symlinks: false, health: false, #[cfg(all(unix, feature = "experimental"))] experimental_metrics: false, @@ -178,6 +181,7 @@ impl RequestHandler { let redirect_trailing_slash = self.opts.redirect_trailing_slash; let compression_static = self.opts.compression_static; let ignore_hidden_files = self.opts.ignore_hidden_files; + let disable_symlinks = self.opts.disable_symlinks; let index_files: Vec<&str> = self.opts.index_files.iter().map(|s| s.as_str()).collect(); log_addr::pre_process(&self.opts, req, remote_addr); @@ -260,6 +264,7 @@ impl RequestHandler { compression_static, ignore_hidden_files, index_files, + disable_symlinks, }) .await { diff --git a/src/server.rs b/src/server.rs index deeea5d5..fc7788c1 100644 --- a/src/server.rs +++ b/src/server.rs @@ -232,6 +232,10 @@ impl Server { let ignore_hidden_files = general.ignore_hidden_files; server_info!("ignore hidden files: enabled={}", ignore_hidden_files); + // Disable symlinks option + let disable_symlinks = general.disable_symlinks; + server_info!("disable symlinks: enabled={}", disable_symlinks); + // Grace period option let grace_period = general.grace_period; server_info!("grace period before graceful shutdown: {}s", grace_period); @@ -255,6 +259,7 @@ impl Server { log_remote_address, redirect_trailing_slash, ignore_hidden_files, + disable_symlinks, index_files, advanced_opts, ..Default::default() diff --git a/src/settings/cli.rs b/src/settings/cli.rs index 6e7bd401..8c3ea5d0 100644 --- a/src/settings/cli.rs +++ b/src/settings/cli.rs @@ -438,6 +438,18 @@ pub struct General { /// Ignore hidden files/directories (dotfiles), preventing them to be served and being included in auto HTML index pages (directory listing). pub ignore_hidden_files: bool, + #[arg( + long, + default_value = "false", + default_missing_value("true"), + num_args(0..=1), + require_equals(true), + action = clap::ArgAction::Set, + env = "SERVER_DISABLE_SYMLINKS", + )] + /// Prevent following files or directories if any path name component is a symbolic link. + pub disable_symlinks: bool, + #[arg( long, default_value = "false", diff --git a/src/settings/file.rs b/src/settings/file.rs index ce5f1eb2..1f656b4b 100644 --- a/src/settings/file.rs +++ b/src/settings/file.rs @@ -344,6 +344,9 @@ pub struct General { /// Ignore hidden files feature. pub ignore_hidden_files: Option, + /// Prevent following symbolic links of files or directories. + pub disable_symlinks: Option, + /// Health endpoint feature. pub health: Option, diff --git a/src/settings/mod.rs b/src/settings/mod.rs index 374344fc..5f9f76d7 100644 --- a/src/settings/mod.rs +++ b/src/settings/mod.rs @@ -180,6 +180,7 @@ impl Settings { let mut log_remote_address = opts.log_remote_address; let mut redirect_trailing_slash = opts.redirect_trailing_slash; let mut ignore_hidden_files = opts.ignore_hidden_files; + let mut disable_symlinks = opts.disable_symlinks; let mut index_files = opts.index_files; let mut health = opts.health; @@ -349,6 +350,9 @@ impl Settings { if let Some(v) = general.ignore_hidden_files { ignore_hidden_files = v } + if let Some(v) = general.disable_symlinks { + disable_symlinks = v + } if let Some(v) = general.health { health = v } @@ -628,6 +632,7 @@ impl Settings { log_remote_address, redirect_trailing_slash, ignore_hidden_files, + disable_symlinks, index_files, health, #[cfg(all(unix, feature = "experimental"))] diff --git a/src/static_files.rs b/src/static_files.rs index 6dccc373..2dd2c6fa 100644 --- a/src/static_files.rs +++ b/src/static_files.rs @@ -76,6 +76,8 @@ pub struct HandleOpts<'a> { pub compression_static: bool, /// Ignore hidden files feature. pub ignore_hidden_files: bool, + /// Prevent following symlinks for files and directories. + pub disable_symlinks: bool, } /// Static file response type with additional data. @@ -110,6 +112,7 @@ pub async fn handle<'a>(opts: &HandleOpts<'a>) -> Result(opts: &HandleOpts<'a>) -> Result( _headers: &'a HeaderMap, _compression_static: bool, mut index_files: &'a [&'a str], + disable_symlinks: bool, ) -> Result, StatusCode> { tracing::trace!("getting metadata for file {}", file_path.display()); + // Prevent symlinks access if option is enabled + if disable_symlinks && file_path.is_symlink() { + tracing::warn!( + "file path {} is a symlink, access denied", + file_path.display() + ); + return Err(StatusCode::FORBIDDEN); + } + + // Try to find the file path on the file system match try_metadata(file_path) { Ok((mut metadata, is_dir)) => { if is_dir { diff --git a/src/testing.rs b/src/testing.rs index 1be6e3f9..3c3459e0 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -96,6 +96,7 @@ pub mod fixtures { log_remote_address: general.log_remote_address, redirect_trailing_slash: general.redirect_trailing_slash, ignore_hidden_files: general.ignore_hidden_files, + disable_symlinks: general.disable_symlinks, index_files: vec![general.index_files], health: general.health, #[cfg(all(unix, feature = "experimental"))] diff --git a/tests/compression_static.rs b/tests/compression_static.rs index e046cd6b..41b9f955 100644 --- a/tests/compression_static.rs +++ b/tests/compression_static.rs @@ -62,6 +62,7 @@ mod tests { ))] compression_static: true, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -132,6 +133,7 @@ mod tests { ))] compression_static: true, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -199,6 +201,7 @@ mod tests { ))] compression_static: true, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -253,6 +256,7 @@ mod tests { redirect_trailing_slash: true, compression_static: true, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -295,6 +299,7 @@ mod tests { ))] compression_static: true, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await diff --git a/tests/dir_listing.rs b/tests/dir_listing.rs index fe97d5e8..835bba82 100644 --- a/tests/dir_listing.rs +++ b/tests/dir_listing.rs @@ -49,6 +49,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -81,6 +82,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -123,6 +125,7 @@ mod tests { redirect_trailing_slash: false, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -165,6 +168,7 @@ mod tests { redirect_trailing_slash: false, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -197,6 +201,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -250,6 +255,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: true, + disable_symlinks: false, index_files: &[], }) .await @@ -266,10 +272,10 @@ mod tests { if method == Method::GET { let entries: Vec = serde_json::from_str(body_str).unwrap(); - assert_eq!(entries.len(), 5); + assert_eq!(entries.len(), 6); let first_entry = entries.first().unwrap(); - assert_eq!(first_entry.name, "spécial-directöry.net"); + assert_eq!(first_entry.name, "symlink"); assert_eq!(first_entry.typed, "directory"); assert!(!first_entry.mtime.is_empty()); assert!(first_entry.size.is_none()); @@ -321,6 +327,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -365,6 +372,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: true, + disable_symlinks: false, index_files: &[], }) .await diff --git a/tests/fixtures/public/symlink b/tests/fixtures/public/symlink new file mode 120000 index 00000000..6c152c42 --- /dev/null +++ b/tests/fixtures/public/symlink @@ -0,0 +1 @@ +./spécial-directöry.net \ No newline at end of file diff --git a/tests/static_files.rs b/tests/static_files.rs index efcfb886..62f4d275 100644 --- a/tests/static_files.rs +++ b/tests/static_files.rs @@ -29,6 +29,17 @@ mod tests { PathBuf::from("docker/public/") } + const METHODS: [Method; 8] = [ + Method::CONNECT, + Method::DELETE, + Method::GET, + Method::HEAD, + Method::PATCH, + Method::POST, + Method::PUT, + Method::TRACE, + ]; + #[tokio::test] async fn handle_file() { let result = static_files::handle(&HandleOpts { @@ -46,6 +57,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -89,6 +101,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -133,6 +146,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -164,6 +178,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -197,6 +212,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -229,6 +245,7 @@ mod tests { redirect_trailing_slash: false, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -266,6 +283,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -318,6 +336,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -352,6 +371,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -388,6 +408,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -425,6 +446,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -465,6 +487,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -503,6 +526,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -539,6 +563,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -574,6 +599,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -597,17 +623,7 @@ mod tests { #[tokio::test] async fn handle_file_allowed_disallowed_methods() { - let methods = [ - Method::CONNECT, - Method::DELETE, - Method::GET, - Method::HEAD, - Method::PATCH, - Method::POST, - Method::PUT, - Method::TRACE, - ]; - for method in methods { + for method in METHODS { match static_files::handle(&HandleOpts { method: &method, headers: &HeaderMap::new(), @@ -623,6 +639,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -706,6 +723,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -776,6 +794,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -825,6 +844,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -874,6 +894,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -924,6 +945,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -966,6 +988,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1018,6 +1041,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1067,6 +1091,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1116,6 +1141,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1168,6 +1194,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1210,6 +1237,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1251,6 +1279,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1307,6 +1336,7 @@ mod tests { redirect_trailing_slash: true, compression_static: false, ignore_hidden_files: false, + disable_symlinks: false, index_files: &[], }) .await @@ -1355,6 +1385,7 @@ mod tests { redirect_trailing_slash: true, compression_static: true, ignore_hidden_files: true, + disable_symlinks: false, index_files: &[], }) .await @@ -1394,6 +1425,7 @@ mod tests { redirect_trailing_slash: true, compression_static: true, ignore_hidden_files: true, + disable_symlinks: false, index_files: &["index.html", "index.htm"], }) .await @@ -1413,4 +1445,79 @@ mod tests { } } } + + #[tokio::test] + async fn handle_disable_symlinks() { + let root_dir = PathBuf::from("tests/fixtures/public/"); + let headers = HeaderMap::new(); + + for method in METHODS { + match static_files::handle(&HandleOpts { + method: &method, + headers: &headers, + base_path: &root_dir, + uri_path: "/symlink", + uri_query: 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, + compression_static: true, + ignore_hidden_files: true, + disable_symlinks: true, + index_files: &["index.html", "index.htm"], + }) + .await + { + Ok(_) => panic!("unexpected successful response rather than an error"), + Err(err) => { + match method { + // The handle only accepts HEAD or GET request methods + Method::GET | Method::HEAD => assert_eq!(err, StatusCode::FORBIDDEN), + _ => assert_eq!(err, StatusCode::METHOD_NOT_ALLOWED), + } + } + } + } + + for method in METHODS { + match static_files::handle(&HandleOpts { + method: &method, + headers: &headers, + base_path: &root_dir, + uri_path: "/symlink/spécial file.txt~", + uri_query: 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, + compression_static: true, + ignore_hidden_files: true, + disable_symlinks: false, + index_files: &["index.html", "index.htm"], + }) + .await + { + Ok(result) => { + let res = result.resp; + assert_eq!(res.status(), 200); + } + Err(err) => { + match method { + // The handle only accepts HEAD or GET request methods + Method::GET | Method::HEAD => { + panic!("unexpected an error response {}", err) + } + _ => assert_eq!(err, StatusCode::METHOD_NOT_ALLOWED), + } + } + } + } + } } From c2273027e0c9bf84f0c5b7c839f43ec9dff37a2e Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Sun, 16 Jun 2024 00:56:49 +0200 Subject: [PATCH 10/12] chore: update dependencies 16.06.2024 --- Cargo.lock | 36 +++++++++++++++++++++++++----------- Cargo.toml | 2 +- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 170399a5..bb75be57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,9 +135,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.72" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -654,9 +654,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3935c160d00ac752e09787e6e6bfc26494c2183cc922f1bc678a60d4733bc2" +checksum = "d0e7a4dd27b9476dc40cb050d3632d3bba3a70ddbff012285f7f8559a1e7e545" [[package]] name = "httpdate" @@ -989,9 +989,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1075,9 +1075,9 @@ dependencies = [ [[package]] name = "object" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] @@ -1231,9 +1231,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ "bitflags", ] @@ -1425,6 +1425,19 @@ dependencies = [ "tzdb", ] +[[package]] +name = "shadow-rs" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d75516bdaee8f640543ad1f6e292448c23ce57143f812c3736ab4b0874383df" +dependencies = [ + "const_format", + "git2", + "is_debug", + "time", + "tzdb", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1534,7 +1547,8 @@ dependencies = [ "serde_ignored", "serde_json", "serde_repr", - "shadow-rs", + "shadow-rs 0.27.1", + "shadow-rs 0.28.0", "signal-hook", "signal-hook-tokio", "tikv-jemallocator", diff --git a/Cargo.toml b/Cargo.toml index ed00b9f8..fc4d8500 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,7 +92,7 @@ tokio-util = { version = "0.7", default-features = false, features = ["io"] } 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"] } -shadow-rs = "0.27" +shadow-rs = "0.28" [target.'cfg(all(target_env = "musl", target_pointer_width = "64"))'.dependencies.tikv-jemallocator] version = "0.5" From 67139321abae1c6a6a411ef7853f85287c6d65cd Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Tue, 18 Jun 2024 21:59:22 +0200 Subject: [PATCH 11/12] chore: update dependencies 18.06.2024 --- Cargo.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bb75be57..72e31613 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -654,9 +654,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.3" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e7a4dd27b9476dc40cb050d3632d3bba3a70ddbff012285f7f8559a1e7e545" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -831,9 +831,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" +checksum = "44a986806a1cc899952ba462bc1f28afbfd5850ab6cb030ccb20dd02cc527a24" dependencies = [ "icu_normalizer", "icu_properties", @@ -1011,9 +1011,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -2355,9 +2355,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.10+zstd.1.5.6" +version = "2.0.11+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" dependencies = [ "cc", "pkg-config", From 216e485f47f2f8aaf4d0e515519754b29128528a Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Tue, 18 Jun 2024 22:33:05 +0200 Subject: [PATCH 12/12] v2.32.0 --- CHANGELOG.md | 19 +++++++++++++++++++ Cargo.lock | 18 ++---------------- Cargo.toml | 4 ++-- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46ad9e28..662b2d96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,25 @@ 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.32.0 - 2024-06-18 + +This new `v2.32.0` release brings several bug fixes and a new option to disable symlinks as well as other improvements. + +__Fixes__ + +- [cd5fa1b](https://github.com/static-web-server/static-web-server/commit/cd5fa1b) Bugfix/security dependency updates including hyper, tokio, regex, serde, httparse and other crates (also [c227302](https://github.com/static-web-server/static-web-server/commit/c227302), [6713932](https://github.com/static-web-server/static-web-server/commit/6713932)). +- [6031a1b](https://github.com/static-web-server/static-web-server/commit/6031a1b) Incorrect `Content-Encoding` for pre-compressed Zstd file requests. PR [#452](https://github.com/static-web-server/static-web-server/pull/452) fixes [#451](https://github.com/static-web-server/static-web-server/issues/451) reported by [@nomeaning777](https://github.com/nomeaning777). +- [3410365](https://github.com/static-web-server/static-web-server/commit/3410365) Duplicated `Vary` response header for `compression` and `compression-static` features. PR [#453](https://github.com/static-web-server/static-web-server/pull/453). + +__Features__ + +- [eeb88da](https://github.com/static-web-server/static-web-server/commit/eeb88da) Disable symlinks via `--disable-symlinks` option. PR [#454](https://github.com/static-web-server/static-web-server/pull/454). See [docs](https://static-web-server.net/features/disable-symlinks). +- [b291189](https://github.com/static-web-server/static-web-server/commit/b291189) Installer: Custom install version and directory options for binary installer. PR [#449](https://github.com/static-web-server/static-web-server/pull/449) by [@frankli0324](https://github.com/frankli0324). See [docs](https://static-web-server.net/download-and-install/#binary-installer-linuxbsds). + +__Docs__ + +- [a888397](https://github.com/static-web-server/static-web-server/commit/a888397) Improve download and install page. PR [#450](https://github.com/static-web-server/static-web-server/pull/450) (also [91f8ec06](https://github.com/static-web-server/static-web-server/commit/91f8ec06)). See [docs](https://static-web-server.net/download-and-install/). + ## v2.31.1 - 2024-05-21 This new `v2.31.1` release fixes an issue when running the SWS Linux ARM64 Musl binary on systems with greater memory page sizes than 4KB and re-enables build support for the legacy Windows 7 dropped by the previous release. diff --git a/Cargo.lock b/Cargo.lock index 72e31613..7b8d48a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1412,19 +1412,6 @@ dependencies = [ "digest", ] -[[package]] -name = "shadow-rs" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7960cbd6ba74691bb15e7ebf97f7136bd02d1115f5695a58c1f31d5645750128" -dependencies = [ - "const_format", - "git2", - "is_debug", - "time", - "tzdb", -] - [[package]] name = "shadow-rs" version = "0.28.0" @@ -1518,7 +1505,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static-web-server" -version = "2.31.1" +version = "2.32.0" dependencies = [ "aho-corasick", "anyhow", @@ -1547,8 +1534,7 @@ dependencies = [ "serde_ignored", "serde_json", "serde_repr", - "shadow-rs 0.27.1", - "shadow-rs 0.28.0", + "shadow-rs", "signal-hook", "signal-hook-tokio", "tikv-jemallocator", diff --git a/Cargo.toml b/Cargo.toml index fc4d8500..121b28da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "static-web-server" -version = "2.31.1" +version = "2.32.0" edition = "2021" rust-version = "1.74.0" authors = ["Jose Quintana "] @@ -111,7 +111,7 @@ bytes = "1.6" serde_json = "1.0" [build-dependencies] -shadow-rs = "0.27" +shadow-rs = "0.28" [profile.release] codegen-units = 1