├── .dockerignore ├── .github └── workflows │ ├── actionlint.yml │ ├── ci.yml │ ├── release.yml │ └── review.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── assets ├── banner.html ├── head.html ├── rtl_head.html ├── select_head.html └── svg_head.html ├── renovate.json ├── rust-toolchain └── src ├── connection_counter.rs ├── gif_banner.rs ├── html.rs ├── main.rs ├── model.rs ├── mygif.rs ├── rtl.rs ├── select.rs └── svg.rs /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /.github/workflows/actionlint.yml: -------------------------------------------------------------------------------- 1 | name: actionlint 2 | on: 3 | pull_request: 4 | paths: 5 | - '.github/workflows/**' 6 | 7 | jobs: 8 | actionlint: 9 | name: runner / actionlint 10 | runs-on: ubuntu-24.04 11 | steps: 12 | - uses: actions/checkout@v4.2.2 13 | 14 | - name: actionlint 15 | uses: reviewdog/action-actionlint@v1.65.2 16 | with: 17 | github_token: ${{ secrets.GITHUB_TOKEN }} 18 | reporter: github-pr-review 19 | filter_mode: nofilter 20 | fail_on_error: true 21 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - 'Dockerfile' 7 | - 'src/**' 8 | - 'Cargo.toml' 9 | - 'Cargo.lock' 10 | - '.github/workflows/ci.yml' 11 | push: 12 | branches: 13 | - 'master' 14 | tags: 15 | - v* 16 | 17 | env: 18 | CARGO_INCREMENTAL: 0 19 | RUST_CACHE_VERSION: v1 20 | 21 | jobs: 22 | rust: 23 | permissions: 24 | packages: write 25 | checks: write 26 | contents: read 27 | deployments: write 28 | 29 | runs-on: ubuntu-24.04 30 | 31 | steps: 32 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 33 | 34 | - name: Get Rust toolchain 35 | id: toolchain 36 | run: | 37 | awk -F'[ ="]+' '$1 == "channel" { print "toolchain=" $2 }' rust-toolchain >> "$GITHUB_OUTPUT" 38 | 39 | - name: install clippy 40 | uses: dtolnay/rust-toolchain@stable 41 | with: 42 | toolchain: ${{ steps.toolchain.outputs.toolchain }} 43 | components: clippy 44 | 45 | - name: cache dependencies 46 | uses: Swatinem/rust-cache@v2.7.8 47 | with: 48 | prefix-key: ${{ env.RUST_CACHE_VERSION }}-rust 49 | 50 | - name: clippy check 51 | uses: sksat/action-clippy@v1.1.1 52 | with: 53 | reporter: github-check 54 | 55 | - name: unit test 56 | run: | 57 | cargo test --no-run --locked 58 | cargo test 59 | 60 | - name: release build 61 | run: cargo build --release 62 | 63 | - uses: docker/setup-buildx-action@v3.10.0 64 | 65 | - uses: docker/login-action@v3.4.0 66 | with: 67 | registry: ghcr.io 68 | username: ${{ github.repository_owner }} 69 | password: ${{ secrets.GITHUB_TOKEN }} 70 | 71 | - name: Create tagname 72 | id: tagname 73 | run: | 74 | VERSION="$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')" 75 | # 2193: ${{ github.ref }} will replaced by GitHub Actions 76 | # shellcheck disable=SC2193 77 | [[ "${{ github.ref }}" == refs/tags/* ]] && VERSION="${VERSION/v/}" 78 | [[ "$VERSION" == "master" ]] && VERSION=latest 79 | # shellcheck disable=SC2193 80 | [[ "${{ github.ref }}" == refs/pull/* ]] && VERSION=dontpush 81 | echo "$VERSION" 82 | echo "version=$VERSION" >> "$GITHUB_OUTPUT" 83 | 84 | - name: Build and Push 85 | uses: docker/build-push-action@v6.18.0 86 | if: "! startsWith(github.ref, 'refs/pull/')" 87 | with: 88 | context: . 89 | platforms: linux/amd64 90 | push: true 91 | cache-from: type=gha 92 | cache-to: type=gha,mode=max 93 | tags: | 94 | ghcr.io/yanorei32/http-clock:${{ steps.tagname.outputs.version }} 95 | 96 | - name: Build and Push 97 | uses: docker/build-push-action@v6.18.0 98 | if: "startsWith(github.ref, 'refs/pull/')" 99 | with: 100 | context: . 101 | platforms: linux/amd64 102 | push: false 103 | cache-from: type=gha 104 | cache-to: type=gha,mode=max 105 | tags: | 106 | ghcr.io/yanorei32/http-clock:${{ steps.tagname.outputs.version }} 107 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - "master" 5 | tags: 6 | - "v*" 7 | 8 | env: 9 | CARGO_INCREMENTAL: 0 10 | 11 | jobs: 12 | release: 13 | strategy: 14 | matrix: 15 | include: 16 | - target: x86_64-unknown-linux-gnu 17 | file: http-clock 18 | output: http-clock-linux.zip 19 | - target: x86_64-pc-windows-gnu 20 | file: http-clock.exe 21 | output: http-clock-windows.zip 22 | name: release 23 | runs-on: ubuntu-24.04 24 | steps: 25 | - uses: actions/checkout@v4.2.2 26 | 27 | - if: ${{ matrix.target == 'x86_64-pc-windows-gnu' }} 28 | run: | 29 | sudo apt-get update -y 30 | sudo apt-get install -y gcc-mingw-w64-x86-64 31 | 32 | - name: Get Rust toolchain 33 | id: toolchain 34 | run: | 35 | awk -F'[ ="]+' '$1 == "channel" { print "toolchain=" $2 }' rust-toolchain >> "$GITHUB_OUTPUT" 36 | 37 | - name: install clippy 38 | uses: dtolnay/rust-toolchain@stable 39 | with: 40 | components: clippy 41 | toolchain: ${{ steps.toolchain.outputs.toolchain }} 42 | targets: x86_64-pc-windows-gnu 43 | 44 | - name: cache dependencies 45 | uses: Swatinem/rust-cache@v2.7.8 46 | 47 | - name: clippy check 48 | uses: sksat/action-clippy@v1.1.1 49 | with: 50 | reporter: github-check 51 | 52 | - name: install cargo-license 53 | run: cargo install cargo-license 54 | 55 | - name: unit test 56 | run: | 57 | cargo test --no-run --locked 58 | cargo test 59 | 60 | - name: build 61 | env: 62 | TARGET: ${{ matrix.target }} 63 | run: 64 | cargo build --release --target $TARGET 65 | 66 | - env: 67 | TARGET: ${{ matrix.target }} 68 | FILE: ${{ matrix.file }} 69 | OUTPUT: ${{ matrix.output }} 70 | run: | 71 | mkdir http-clock 72 | cargo license \ 73 | --authors \ 74 | --do-not-bundle \ 75 | --avoid-dev-deps \ 76 | --avoid-build-deps \ 77 | --filter-platform $TARGET \ 78 | > http-clock/CREDITS 79 | VERSION_NAME=${GITHUB_REF##*/} 80 | if [[ $VERSION_NAME == "master" ]]; then 81 | VERSION_NAME=$(git rev-parse --short HEAD) 82 | elif [[ ${VERSION_NAME:0:1} == "v" ]]; then 83 | VERSION_NAME=${VERSION_NAME:1} 84 | fi 85 | echo "$VERSION_NAME" > http-clock/VERSION.txt 86 | cp LICENSE README.md http-clock/ 87 | cp target/$TARGET/release/$FILE http-clock/ 88 | zip -r $OUTPUT http-clock 89 | 90 | - name: pre-release 91 | uses: softprops/action-gh-release@v2.2.2 92 | if: "! startsWith(github.ref, 'refs/tags/')" 93 | with: 94 | tag_name: nightly-${{ github.sha }} 95 | prerelease: true 96 | fail_on_unmatched_files: true 97 | files: | 98 | ${{ matrix.output }} 99 | 100 | - name: tagged-release 101 | uses: softprops/action-gh-release@v2.2.2 102 | if: startsWith(github.ref, 'refs/tags/') 103 | with: 104 | fail_on_unmatched_files: true 105 | files: | 106 | ${{ matrix.output }} 107 | -------------------------------------------------------------------------------- /.github/workflows/review.yml: -------------------------------------------------------------------------------- 1 | name: Review 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - 'src/**' 7 | - 'Cargo.toml' 8 | - 'Cargo.lock' 9 | - '.github/workflows/review.yml' 10 | 11 | 12 | env: 13 | CARGO_INCREMENTAL: 0 14 | 15 | jobs: 16 | rust: 17 | runs-on: ubuntu-24.04 18 | steps: 19 | - uses: actions/checkout@v4.2.2 20 | 21 | - name: Get Rust toolchain 22 | id: toolchain 23 | run: | 24 | awk -F'[ ="]+' '$1 == "channel" { print "toolchain=" $2 }' rust-toolchain >> "$GITHUB_OUTPUT" 25 | 26 | - name: install clippy 27 | uses: dtolnay/rust-toolchain@stable 28 | with: 29 | toolchain: ${{ steps.toolchain.outputs.toolchain }} 30 | components: clippy 31 | 32 | - name: cache dependencies 33 | uses: Swatinem/rust-cache@v2.7.8 34 | 35 | - name: clippy check 36 | uses: sksat/action-clippy@v1.1.1 37 | with: 38 | reporter: github-pr-review 39 | 40 | - name: unit test 41 | run: | 42 | cargo test --no-run --locked 43 | cargo test 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "android-tzdata" 31 | version = "0.1.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 34 | 35 | [[package]] 36 | name = "android_system_properties" 37 | version = "0.1.5" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 40 | dependencies = [ 41 | "libc", 42 | ] 43 | 44 | [[package]] 45 | name = "anstream" 46 | version = "0.6.18" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 49 | dependencies = [ 50 | "anstyle", 51 | "anstyle-parse", 52 | "anstyle-query", 53 | "anstyle-wincon", 54 | "colorchoice", 55 | "is_terminal_polyfill", 56 | "utf8parse", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle" 61 | version = "1.0.10" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 64 | 65 | [[package]] 66 | name = "anstyle-parse" 67 | version = "0.2.6" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 70 | dependencies = [ 71 | "utf8parse", 72 | ] 73 | 74 | [[package]] 75 | name = "anstyle-query" 76 | version = "1.1.2" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 79 | dependencies = [ 80 | "windows-sys 0.59.0", 81 | ] 82 | 83 | [[package]] 84 | name = "anstyle-wincon" 85 | version = "3.0.7" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 88 | dependencies = [ 89 | "anstyle", 90 | "once_cell", 91 | "windows-sys 0.59.0", 92 | ] 93 | 94 | [[package]] 95 | name = "array-init" 96 | version = "2.1.0" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" 99 | 100 | [[package]] 101 | name = "async-stream" 102 | version = "0.3.6" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" 105 | dependencies = [ 106 | "async-stream-impl", 107 | "futures-core", 108 | "pin-project-lite", 109 | ] 110 | 111 | [[package]] 112 | name = "async-stream-impl" 113 | version = "0.3.6" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" 116 | dependencies = [ 117 | "proc-macro2", 118 | "quote", 119 | "syn", 120 | ] 121 | 122 | [[package]] 123 | name = "autocfg" 124 | version = "1.4.0" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 127 | 128 | [[package]] 129 | name = "axum" 130 | version = "0.8.4" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" 133 | dependencies = [ 134 | "axum-core", 135 | "bytes", 136 | "form_urlencoded", 137 | "futures-util", 138 | "http", 139 | "http-body", 140 | "http-body-util", 141 | "hyper", 142 | "hyper-util", 143 | "itoa", 144 | "matchit", 145 | "memchr", 146 | "mime", 147 | "percent-encoding", 148 | "pin-project-lite", 149 | "rustversion", 150 | "serde", 151 | "serde_json", 152 | "serde_path_to_error", 153 | "serde_urlencoded", 154 | "sync_wrapper", 155 | "tokio", 156 | "tower", 157 | "tower-layer", 158 | "tower-service", 159 | "tracing", 160 | ] 161 | 162 | [[package]] 163 | name = "axum-core" 164 | version = "0.5.2" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" 167 | dependencies = [ 168 | "bytes", 169 | "futures-core", 170 | "http", 171 | "http-body", 172 | "http-body-util", 173 | "mime", 174 | "pin-project-lite", 175 | "rustversion", 176 | "sync_wrapper", 177 | "tower-layer", 178 | "tower-service", 179 | "tracing", 180 | ] 181 | 182 | [[package]] 183 | name = "backtrace" 184 | version = "0.3.74" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 187 | dependencies = [ 188 | "addr2line", 189 | "cfg-if", 190 | "libc", 191 | "miniz_oxide", 192 | "object", 193 | "rustc-demangle", 194 | "windows-targets", 195 | ] 196 | 197 | [[package]] 198 | name = "binrw" 199 | version = "0.15.0" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "81419ff39e6ed10a92a7f125290859776ced35d9a08a665ae40b23e7ca702f30" 202 | dependencies = [ 203 | "array-init", 204 | "binrw_derive", 205 | "bytemuck", 206 | ] 207 | 208 | [[package]] 209 | name = "binrw_derive" 210 | version = "0.15.0" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "376404e55ec40d0d6f8b4b7df3f87b87954bd987f0cf9a7207ea3b6ea5c9add4" 213 | dependencies = [ 214 | "either", 215 | "owo-colors", 216 | "proc-macro2", 217 | "quote", 218 | "syn", 219 | ] 220 | 221 | [[package]] 222 | name = "bitfield-struct" 223 | version = "0.11.0" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "d3ca019570363e800b05ad4fd890734f28ac7b72f563ad8a35079efb793616f8" 226 | dependencies = [ 227 | "proc-macro2", 228 | "quote", 229 | "syn", 230 | ] 231 | 232 | [[package]] 233 | name = "bumpalo" 234 | version = "3.17.0" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 237 | 238 | [[package]] 239 | name = "bytemuck" 240 | version = "1.22.0" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" 243 | 244 | [[package]] 245 | name = "bytes" 246 | version = "1.10.1" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 249 | 250 | [[package]] 251 | name = "cc" 252 | version = "1.2.17" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" 255 | dependencies = [ 256 | "shlex", 257 | ] 258 | 259 | [[package]] 260 | name = "cfg-if" 261 | version = "1.0.0" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 264 | 265 | [[package]] 266 | name = "chrono" 267 | version = "0.4.41" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 270 | dependencies = [ 271 | "android-tzdata", 272 | "iana-time-zone", 273 | "js-sys", 274 | "num-traits", 275 | "wasm-bindgen", 276 | "windows-link", 277 | ] 278 | 279 | [[package]] 280 | name = "chrono-tz" 281 | version = "0.10.3" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "efdce149c370f133a071ca8ef6ea340b7b88748ab0810097a9e2976eaa34b4f3" 284 | dependencies = [ 285 | "chrono", 286 | "chrono-tz-build", 287 | "phf", 288 | ] 289 | 290 | [[package]] 291 | name = "chrono-tz-build" 292 | version = "0.4.1" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "8f10f8c9340e31fc120ff885fcdb54a0b48e474bbd77cab557f0c30a3e569402" 295 | dependencies = [ 296 | "parse-zoneinfo", 297 | "phf_codegen", 298 | ] 299 | 300 | [[package]] 301 | name = "clap" 302 | version = "4.5.39" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" 305 | dependencies = [ 306 | "clap_builder", 307 | "clap_derive", 308 | ] 309 | 310 | [[package]] 311 | name = "clap_builder" 312 | version = "4.5.39" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" 315 | dependencies = [ 316 | "anstream", 317 | "anstyle", 318 | "clap_lex", 319 | "strsim", 320 | ] 321 | 322 | [[package]] 323 | name = "clap_derive" 324 | version = "4.5.32" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 327 | dependencies = [ 328 | "heck", 329 | "proc-macro2", 330 | "quote", 331 | "syn", 332 | ] 333 | 334 | [[package]] 335 | name = "clap_lex" 336 | version = "0.7.4" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 339 | 340 | [[package]] 341 | name = "colorchoice" 342 | version = "1.0.3" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 345 | 346 | [[package]] 347 | name = "core-foundation-sys" 348 | version = "0.8.7" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 351 | 352 | [[package]] 353 | name = "either" 354 | version = "1.15.0" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 357 | 358 | [[package]] 359 | name = "fnv" 360 | version = "1.0.7" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 363 | 364 | [[package]] 365 | name = "form_urlencoded" 366 | version = "1.2.1" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 369 | dependencies = [ 370 | "percent-encoding", 371 | ] 372 | 373 | [[package]] 374 | name = "futures" 375 | version = "0.3.31" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 378 | dependencies = [ 379 | "futures-channel", 380 | "futures-core", 381 | "futures-executor", 382 | "futures-io", 383 | "futures-sink", 384 | "futures-task", 385 | "futures-util", 386 | ] 387 | 388 | [[package]] 389 | name = "futures-channel" 390 | version = "0.3.31" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 393 | dependencies = [ 394 | "futures-core", 395 | "futures-sink", 396 | ] 397 | 398 | [[package]] 399 | name = "futures-core" 400 | version = "0.3.31" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 403 | 404 | [[package]] 405 | name = "futures-executor" 406 | version = "0.3.31" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 409 | dependencies = [ 410 | "futures-core", 411 | "futures-task", 412 | "futures-util", 413 | ] 414 | 415 | [[package]] 416 | name = "futures-io" 417 | version = "0.3.31" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 420 | 421 | [[package]] 422 | name = "futures-macro" 423 | version = "0.3.31" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 426 | dependencies = [ 427 | "proc-macro2", 428 | "quote", 429 | "syn", 430 | ] 431 | 432 | [[package]] 433 | name = "futures-sink" 434 | version = "0.3.31" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 437 | 438 | [[package]] 439 | name = "futures-task" 440 | version = "0.3.31" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 443 | 444 | [[package]] 445 | name = "futures-util" 446 | version = "0.3.31" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 449 | dependencies = [ 450 | "futures-channel", 451 | "futures-core", 452 | "futures-io", 453 | "futures-macro", 454 | "futures-sink", 455 | "futures-task", 456 | "memchr", 457 | "pin-project-lite", 458 | "pin-utils", 459 | "slab", 460 | ] 461 | 462 | [[package]] 463 | name = "gimli" 464 | version = "0.31.1" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 467 | 468 | [[package]] 469 | name = "heck" 470 | version = "0.5.0" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 473 | 474 | [[package]] 475 | name = "http" 476 | version = "1.3.1" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 479 | dependencies = [ 480 | "bytes", 481 | "fnv", 482 | "itoa", 483 | ] 484 | 485 | [[package]] 486 | name = "http-body" 487 | version = "1.0.1" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 490 | dependencies = [ 491 | "bytes", 492 | "http", 493 | ] 494 | 495 | [[package]] 496 | name = "http-body-util" 497 | version = "0.1.3" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 500 | dependencies = [ 501 | "bytes", 502 | "futures-core", 503 | "http", 504 | "http-body", 505 | "pin-project-lite", 506 | ] 507 | 508 | [[package]] 509 | name = "http-clock" 510 | version = "0.6.1" 511 | dependencies = [ 512 | "async-stream", 513 | "axum", 514 | "binrw", 515 | "bitfield-struct", 516 | "bytes", 517 | "chrono", 518 | "chrono-tz", 519 | "clap", 520 | "futures", 521 | "itertools", 522 | "lzw", 523 | "once_cell", 524 | "tokio", 525 | "tracing", 526 | "tracing-subscriber", 527 | ] 528 | 529 | [[package]] 530 | name = "httparse" 531 | version = "1.10.1" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 534 | 535 | [[package]] 536 | name = "httpdate" 537 | version = "1.0.3" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 540 | 541 | [[package]] 542 | name = "hyper" 543 | version = "1.6.0" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 546 | dependencies = [ 547 | "bytes", 548 | "futures-channel", 549 | "futures-util", 550 | "http", 551 | "http-body", 552 | "httparse", 553 | "httpdate", 554 | "itoa", 555 | "pin-project-lite", 556 | "smallvec", 557 | "tokio", 558 | ] 559 | 560 | [[package]] 561 | name = "hyper-util" 562 | version = "0.1.11" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 565 | dependencies = [ 566 | "bytes", 567 | "futures-util", 568 | "http", 569 | "http-body", 570 | "hyper", 571 | "pin-project-lite", 572 | "tokio", 573 | "tower-service", 574 | ] 575 | 576 | [[package]] 577 | name = "iana-time-zone" 578 | version = "0.1.63" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 581 | dependencies = [ 582 | "android_system_properties", 583 | "core-foundation-sys", 584 | "iana-time-zone-haiku", 585 | "js-sys", 586 | "log", 587 | "wasm-bindgen", 588 | "windows-core", 589 | ] 590 | 591 | [[package]] 592 | name = "iana-time-zone-haiku" 593 | version = "0.1.2" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 596 | dependencies = [ 597 | "cc", 598 | ] 599 | 600 | [[package]] 601 | name = "is_terminal_polyfill" 602 | version = "1.70.1" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 605 | 606 | [[package]] 607 | name = "itertools" 608 | version = "0.14.0" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 611 | dependencies = [ 612 | "either", 613 | ] 614 | 615 | [[package]] 616 | name = "itoa" 617 | version = "1.0.15" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 620 | 621 | [[package]] 622 | name = "js-sys" 623 | version = "0.3.77" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 626 | dependencies = [ 627 | "once_cell", 628 | "wasm-bindgen", 629 | ] 630 | 631 | [[package]] 632 | name = "lazy_static" 633 | version = "1.5.0" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 636 | 637 | [[package]] 638 | name = "libc" 639 | version = "0.2.171" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" 642 | 643 | [[package]] 644 | name = "log" 645 | version = "0.4.27" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 648 | 649 | [[package]] 650 | name = "lzw" 651 | version = "0.10.0" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" 654 | 655 | [[package]] 656 | name = "matchit" 657 | version = "0.8.4" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 660 | 661 | [[package]] 662 | name = "memchr" 663 | version = "2.7.4" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 666 | 667 | [[package]] 668 | name = "mime" 669 | version = "0.3.17" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 672 | 673 | [[package]] 674 | name = "miniz_oxide" 675 | version = "0.8.5" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" 678 | dependencies = [ 679 | "adler2", 680 | ] 681 | 682 | [[package]] 683 | name = "mio" 684 | version = "1.0.3" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 687 | dependencies = [ 688 | "libc", 689 | "wasi", 690 | "windows-sys 0.52.0", 691 | ] 692 | 693 | [[package]] 694 | name = "nu-ansi-term" 695 | version = "0.46.0" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 698 | dependencies = [ 699 | "overload", 700 | "winapi", 701 | ] 702 | 703 | [[package]] 704 | name = "num-traits" 705 | version = "0.2.19" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 708 | dependencies = [ 709 | "autocfg", 710 | ] 711 | 712 | [[package]] 713 | name = "object" 714 | version = "0.36.7" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 717 | dependencies = [ 718 | "memchr", 719 | ] 720 | 721 | [[package]] 722 | name = "once_cell" 723 | version = "1.21.3" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 726 | 727 | [[package]] 728 | name = "overload" 729 | version = "0.1.1" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 732 | 733 | [[package]] 734 | name = "owo-colors" 735 | version = "4.2.0" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" 738 | 739 | [[package]] 740 | name = "parse-zoneinfo" 741 | version = "0.3.1" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" 744 | dependencies = [ 745 | "regex", 746 | ] 747 | 748 | [[package]] 749 | name = "percent-encoding" 750 | version = "2.3.1" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 753 | 754 | [[package]] 755 | name = "phf" 756 | version = "0.11.3" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 759 | dependencies = [ 760 | "phf_shared", 761 | ] 762 | 763 | [[package]] 764 | name = "phf_codegen" 765 | version = "0.11.3" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" 768 | dependencies = [ 769 | "phf_generator", 770 | "phf_shared", 771 | ] 772 | 773 | [[package]] 774 | name = "phf_generator" 775 | version = "0.11.3" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" 778 | dependencies = [ 779 | "phf_shared", 780 | "rand", 781 | ] 782 | 783 | [[package]] 784 | name = "phf_shared" 785 | version = "0.11.3" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 788 | dependencies = [ 789 | "siphasher", 790 | ] 791 | 792 | [[package]] 793 | name = "pin-project-lite" 794 | version = "0.2.16" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 797 | 798 | [[package]] 799 | name = "pin-utils" 800 | version = "0.1.0" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 803 | 804 | [[package]] 805 | name = "proc-macro2" 806 | version = "1.0.94" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 809 | dependencies = [ 810 | "unicode-ident", 811 | ] 812 | 813 | [[package]] 814 | name = "quote" 815 | version = "1.0.40" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 818 | dependencies = [ 819 | "proc-macro2", 820 | ] 821 | 822 | [[package]] 823 | name = "rand" 824 | version = "0.8.5" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 827 | dependencies = [ 828 | "rand_core", 829 | ] 830 | 831 | [[package]] 832 | name = "rand_core" 833 | version = "0.6.4" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 836 | 837 | [[package]] 838 | name = "regex" 839 | version = "1.11.1" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 842 | dependencies = [ 843 | "aho-corasick", 844 | "memchr", 845 | "regex-automata", 846 | "regex-syntax", 847 | ] 848 | 849 | [[package]] 850 | name = "regex-automata" 851 | version = "0.4.9" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 854 | dependencies = [ 855 | "aho-corasick", 856 | "memchr", 857 | "regex-syntax", 858 | ] 859 | 860 | [[package]] 861 | name = "regex-syntax" 862 | version = "0.8.5" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 865 | 866 | [[package]] 867 | name = "rustc-demangle" 868 | version = "0.1.24" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 871 | 872 | [[package]] 873 | name = "rustversion" 874 | version = "1.0.20" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 877 | 878 | [[package]] 879 | name = "ryu" 880 | version = "1.0.20" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 883 | 884 | [[package]] 885 | name = "serde" 886 | version = "1.0.219" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 889 | dependencies = [ 890 | "serde_derive", 891 | ] 892 | 893 | [[package]] 894 | name = "serde_derive" 895 | version = "1.0.219" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 898 | dependencies = [ 899 | "proc-macro2", 900 | "quote", 901 | "syn", 902 | ] 903 | 904 | [[package]] 905 | name = "serde_json" 906 | version = "1.0.140" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 909 | dependencies = [ 910 | "itoa", 911 | "memchr", 912 | "ryu", 913 | "serde", 914 | ] 915 | 916 | [[package]] 917 | name = "serde_path_to_error" 918 | version = "0.1.17" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" 921 | dependencies = [ 922 | "itoa", 923 | "serde", 924 | ] 925 | 926 | [[package]] 927 | name = "serde_urlencoded" 928 | version = "0.7.1" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 931 | dependencies = [ 932 | "form_urlencoded", 933 | "itoa", 934 | "ryu", 935 | "serde", 936 | ] 937 | 938 | [[package]] 939 | name = "sharded-slab" 940 | version = "0.1.7" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 943 | dependencies = [ 944 | "lazy_static", 945 | ] 946 | 947 | [[package]] 948 | name = "shlex" 949 | version = "1.3.0" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 952 | 953 | [[package]] 954 | name = "siphasher" 955 | version = "1.0.1" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 958 | 959 | [[package]] 960 | name = "slab" 961 | version = "0.4.9" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 964 | dependencies = [ 965 | "autocfg", 966 | ] 967 | 968 | [[package]] 969 | name = "smallvec" 970 | version = "1.14.0" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 973 | 974 | [[package]] 975 | name = "socket2" 976 | version = "0.5.9" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 979 | dependencies = [ 980 | "libc", 981 | "windows-sys 0.52.0", 982 | ] 983 | 984 | [[package]] 985 | name = "strsim" 986 | version = "0.11.1" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 989 | 990 | [[package]] 991 | name = "syn" 992 | version = "2.0.100" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 995 | dependencies = [ 996 | "proc-macro2", 997 | "quote", 998 | "unicode-ident", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "sync_wrapper" 1003 | version = "1.0.2" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1006 | 1007 | [[package]] 1008 | name = "thread_local" 1009 | version = "1.1.8" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1012 | dependencies = [ 1013 | "cfg-if", 1014 | "once_cell", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "tokio" 1019 | version = "1.45.1" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" 1022 | dependencies = [ 1023 | "backtrace", 1024 | "libc", 1025 | "mio", 1026 | "pin-project-lite", 1027 | "socket2", 1028 | "tokio-macros", 1029 | "windows-sys 0.52.0", 1030 | ] 1031 | 1032 | [[package]] 1033 | name = "tokio-macros" 1034 | version = "2.5.0" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1037 | dependencies = [ 1038 | "proc-macro2", 1039 | "quote", 1040 | "syn", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "tower" 1045 | version = "0.5.2" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1048 | dependencies = [ 1049 | "futures-core", 1050 | "futures-util", 1051 | "pin-project-lite", 1052 | "sync_wrapper", 1053 | "tokio", 1054 | "tower-layer", 1055 | "tower-service", 1056 | "tracing", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "tower-layer" 1061 | version = "0.3.3" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1064 | 1065 | [[package]] 1066 | name = "tower-service" 1067 | version = "0.3.3" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1070 | 1071 | [[package]] 1072 | name = "tracing" 1073 | version = "0.1.41" 1074 | source = "registry+https://github.com/rust-lang/crates.io-index" 1075 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1076 | dependencies = [ 1077 | "log", 1078 | "pin-project-lite", 1079 | "tracing-attributes", 1080 | "tracing-core", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "tracing-attributes" 1085 | version = "0.1.28" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 1088 | dependencies = [ 1089 | "proc-macro2", 1090 | "quote", 1091 | "syn", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "tracing-core" 1096 | version = "0.1.33" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1099 | dependencies = [ 1100 | "once_cell", 1101 | "valuable", 1102 | ] 1103 | 1104 | [[package]] 1105 | name = "tracing-log" 1106 | version = "0.2.0" 1107 | source = "registry+https://github.com/rust-lang/crates.io-index" 1108 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1109 | dependencies = [ 1110 | "log", 1111 | "once_cell", 1112 | "tracing-core", 1113 | ] 1114 | 1115 | [[package]] 1116 | name = "tracing-subscriber" 1117 | version = "0.3.19" 1118 | source = "registry+https://github.com/rust-lang/crates.io-index" 1119 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 1120 | dependencies = [ 1121 | "nu-ansi-term", 1122 | "sharded-slab", 1123 | "smallvec", 1124 | "thread_local", 1125 | "tracing-core", 1126 | "tracing-log", 1127 | ] 1128 | 1129 | [[package]] 1130 | name = "unicode-ident" 1131 | version = "1.0.18" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1134 | 1135 | [[package]] 1136 | name = "utf8parse" 1137 | version = "0.2.2" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1140 | 1141 | [[package]] 1142 | name = "valuable" 1143 | version = "0.1.1" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1146 | 1147 | [[package]] 1148 | name = "wasi" 1149 | version = "0.11.0+wasi-snapshot-preview1" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1152 | 1153 | [[package]] 1154 | name = "wasm-bindgen" 1155 | version = "0.2.100" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1158 | dependencies = [ 1159 | "cfg-if", 1160 | "once_cell", 1161 | "rustversion", 1162 | "wasm-bindgen-macro", 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "wasm-bindgen-backend" 1167 | version = "0.2.100" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1170 | dependencies = [ 1171 | "bumpalo", 1172 | "log", 1173 | "proc-macro2", 1174 | "quote", 1175 | "syn", 1176 | "wasm-bindgen-shared", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "wasm-bindgen-macro" 1181 | version = "0.2.100" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1184 | dependencies = [ 1185 | "quote", 1186 | "wasm-bindgen-macro-support", 1187 | ] 1188 | 1189 | [[package]] 1190 | name = "wasm-bindgen-macro-support" 1191 | version = "0.2.100" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1194 | dependencies = [ 1195 | "proc-macro2", 1196 | "quote", 1197 | "syn", 1198 | "wasm-bindgen-backend", 1199 | "wasm-bindgen-shared", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "wasm-bindgen-shared" 1204 | version = "0.2.100" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1207 | dependencies = [ 1208 | "unicode-ident", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "winapi" 1213 | version = "0.3.9" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1216 | dependencies = [ 1217 | "winapi-i686-pc-windows-gnu", 1218 | "winapi-x86_64-pc-windows-gnu", 1219 | ] 1220 | 1221 | [[package]] 1222 | name = "winapi-i686-pc-windows-gnu" 1223 | version = "0.4.0" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1226 | 1227 | [[package]] 1228 | name = "winapi-x86_64-pc-windows-gnu" 1229 | version = "0.4.0" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1232 | 1233 | [[package]] 1234 | name = "windows-core" 1235 | version = "0.61.0" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" 1238 | dependencies = [ 1239 | "windows-implement", 1240 | "windows-interface", 1241 | "windows-link", 1242 | "windows-result", 1243 | "windows-strings", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "windows-implement" 1248 | version = "0.60.0" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 1251 | dependencies = [ 1252 | "proc-macro2", 1253 | "quote", 1254 | "syn", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "windows-interface" 1259 | version = "0.59.1" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 1262 | dependencies = [ 1263 | "proc-macro2", 1264 | "quote", 1265 | "syn", 1266 | ] 1267 | 1268 | [[package]] 1269 | name = "windows-link" 1270 | version = "0.1.1" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 1273 | 1274 | [[package]] 1275 | name = "windows-result" 1276 | version = "0.3.2" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 1279 | dependencies = [ 1280 | "windows-link", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "windows-strings" 1285 | version = "0.4.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" 1288 | dependencies = [ 1289 | "windows-link", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "windows-sys" 1294 | version = "0.52.0" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1297 | dependencies = [ 1298 | "windows-targets", 1299 | ] 1300 | 1301 | [[package]] 1302 | name = "windows-sys" 1303 | version = "0.59.0" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1306 | dependencies = [ 1307 | "windows-targets", 1308 | ] 1309 | 1310 | [[package]] 1311 | name = "windows-targets" 1312 | version = "0.52.6" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1315 | dependencies = [ 1316 | "windows_aarch64_gnullvm", 1317 | "windows_aarch64_msvc", 1318 | "windows_i686_gnu", 1319 | "windows_i686_gnullvm", 1320 | "windows_i686_msvc", 1321 | "windows_x86_64_gnu", 1322 | "windows_x86_64_gnullvm", 1323 | "windows_x86_64_msvc", 1324 | ] 1325 | 1326 | [[package]] 1327 | name = "windows_aarch64_gnullvm" 1328 | version = "0.52.6" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1331 | 1332 | [[package]] 1333 | name = "windows_aarch64_msvc" 1334 | version = "0.52.6" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1337 | 1338 | [[package]] 1339 | name = "windows_i686_gnu" 1340 | version = "0.52.6" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1343 | 1344 | [[package]] 1345 | name = "windows_i686_gnullvm" 1346 | version = "0.52.6" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1349 | 1350 | [[package]] 1351 | name = "windows_i686_msvc" 1352 | version = "0.52.6" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1355 | 1356 | [[package]] 1357 | name = "windows_x86_64_gnu" 1358 | version = "0.52.6" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1361 | 1362 | [[package]] 1363 | name = "windows_x86_64_gnullvm" 1364 | version = "0.52.6" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1367 | 1368 | [[package]] 1369 | name = "windows_x86_64_msvc" 1370 | version = "0.52.6" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1373 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "http-clock" 3 | version = "0.6.1" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | async-stream = "0.3.5" 10 | axum = "0.8.0" 11 | binrw = "0.15.0" 12 | bitfield-struct = "0.11.0" 13 | bytes = "1.10.1" 14 | chrono = "0.4.38" 15 | chrono-tz = "0.10.0" 16 | clap = { version = "4.5.7", features = ["derive", "env"] } 17 | futures = "0.3.30" 18 | itertools = "0.14.0" 19 | lzw = "0.10.0" 20 | once_cell = "1.21.3" 21 | tokio = { version = "1.37.0", features = ["rt-multi-thread", "macros", "net", "time"] } 22 | tracing = "0.1.40" 23 | tracing-subscriber = "0.3.18" 24 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:1.87.0-bookworm as build-env 2 | LABEL maintainer="yanorei32" 3 | 4 | SHELL ["/bin/bash", "-o", "pipefail", "-c"] 5 | 6 | WORKDIR /usr/src 7 | RUN cargo new http-clock 8 | COPY LICENSE Cargo.toml Cargo.lock /usr/src/http-clock/ 9 | WORKDIR /usr/src/http-clock 10 | ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse 11 | RUN cargo install cargo-license && cargo license \ 12 | --authors \ 13 | --do-not-bundle \ 14 | --avoid-dev-deps \ 15 | --avoid-build-deps \ 16 | --filter-platform "$(rustc -vV | sed -n 's|host: ||p')" \ 17 | > CREDITS 18 | 19 | RUN cargo build --release 20 | COPY src/ /usr/src/http-clock/src/ 21 | COPY assets/ /usr/src/http-clock/assets/ 22 | RUN touch assets/* src/* && cargo build --release 23 | 24 | FROM debian:bookworm-slim@sha256:90522eeb7e5923ee2b871c639059537b30521272f10ca86fdbbbb2b75a8c40cd 25 | 26 | WORKDIR / 27 | 28 | COPY --chown=root:root --from=build-env \ 29 | /usr/src/http-clock/CREDITS \ 30 | /usr/src/http-clock/LICENSE \ 31 | /usr/share/licenses/http-clock/ 32 | 33 | COPY --chown=root:root --from=build-env \ 34 | /usr/src/http-clock/target/release/http-clock \ 35 | /usr/bin/http-clock 36 | 37 | CMD ["/usr/bin/http-clock"] 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2024, yanorei32 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HTTP Clock 2 | 3 | ## Hosted Version 4 | 5 | https://httpclock.yr32.net/ 6 | 7 | ## But, Why? 8 | 9 | [HTTP Clockを支える技術 ACT.1](https://blog.yr32.net/post/http-clock-act1/) 10 | 11 | ## Self-host Quick Start 12 | 13 | ```bash 14 | docker run --rm -it -p 3000:3000 ghcr.io/yanorei32/http-clock 15 | ``` 16 | 17 | ## Self-build Quick Start 18 | 19 | ```bash 20 | git clone https://github.com/yanorei32/http-clock 21 | cd http-clock 22 | cargo run # by default, listens in 0.0.0.0:3000 23 | ``` 24 | 25 | If you don't have cargo, you can get it with [rustup](https://www.rust-lang.org/tools/install). 26 | -------------------------------------------------------------------------------- /assets/banner.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HTTP Clock Banner 5 | 6 | 7 | 8 | 16 | 17 | 18 |
19 |

HTTP Clock Banner

20 |

Do you want the HTTP Clock banner?

21 |

We have a nice banner!

22 |
23 | 24 | 25 | <a href=https://httpclock.yr32.net/> 26 | <img src=https://httpclock.yr32.net/banner.gif alt="HTTP Clock" style="image-rendering: pixelated; image-rendering: crisp-edges;"> 27 | </a> 28 | 29 | 30 |

You MUST hotlink the banner.

31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /assets/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HTTP Clock (JST) 5 | 6 | 7 | 8 | 11 | 12 | 13 |
14 |

HTTP Clock

15 |

This page does not use JavaScript, so you can use it even if NoScript is enabled.

16 |

This page is not intended to provide exact times.

17 |

If you fear CSS too, you can use the SVG Edition.

18 |

Do you feel it's a dirty hack? Check out the SELECT edition too!

19 |

Are you a Safari fan? esu nac uoY RTL edition !

20 |

Want to embed this on your web site? GIF Banner

21 | -------------------------------------------------------------------------------- /assets/rtl_head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HTTP Clock RTL Edition (JST) 5 | 6 | 7 | 8 | 9 | 10 |
11 |

HTTP Clock (RTL Edition)

12 |

This page uses neither JavaScript, CSS nor SVG, so you can use it even if NoScript is enabled.

13 |

This page is not intended to provide exact times.

14 |