From ea1a590df11552cee90bce0bfe557ea771f3c9b6 Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sun, 23 Jun 2024 02:52:41 +0200
Subject: [PATCH 1/5] Added sentry support.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 Cargo.lock                             | 677 +++++++++++--------------
 Cargo.toml                             |  43 +-
 src/data_storage/impls/file_storage.rs |   8 +-
 src/data_storage/impls/s3_hybrid.rs    |   8 +-
 src/data_storage/mod.rs                |   9 +
 src/errors.rs                          |   8 +-
 src/info_storages/mod.rs               |   4 +
 src/main.rs                            |  18 +
 src/notifiers/impls/amqp_notifier.rs   |   1 +
 src/notifiers/impls/dir_notifier.rs    |   8 +-
 src/notifiers/impls/file_notifier.rs   |  40 +-
 src/notifiers/impls/http_notifier.rs   |  19 +-
 src/notifiers/manager.rs               |   4 +-
 src/notifiers/mod.rs                   |   1 +
 src/server/mod.rs                      |  54 +-
 src/server/routes/create.rs            |   4 +-
 src/server/routes/upload.rs            |   6 +-
 src/utils/headers.rs                   |   7 +-
 18 files changed, 451 insertions(+), 468 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 710f0f4..ba59293 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",
 ]
@@ -28,17 +28,6 @@ dependencies = [
  "cpufeatures",
 ]
 
-[[package]]
-name = "ahash"
-version = "0.7.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
-dependencies = [
- "getrandom",
- "once_cell",
- "version_check",
-]
-
 [[package]]
 name = "ahash"
 version = "0.8.11"
@@ -155,9 +144,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",
 ]
@@ -219,22 +208,21 @@ dependencies = [
 
 [[package]]
 name = "async-channel"
-version = "2.2.1"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928"
+checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a"
 dependencies = [
  "concurrent-queue",
- "event-listener 5.3.0",
- "event-listener-strategy 0.5.2",
+ "event-listener-strategy",
  "futures-core",
  "pin-project-lite",
 ]
 
 [[package]]
 name = "async-executor"
-version = "1.11.0"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a"
+checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0"
 dependencies = [
  "async-task",
  "concurrent-queue",
@@ -251,8 +239,8 @@ checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
 dependencies = [
  "async-channel",
  "async-executor",
- "async-io 2.3.2",
- "async-lock 3.3.0",
+ "async-io 2.3.3",
+ "async-lock 3.4.0",
  "blocking",
  "futures-lite 2.3.0",
  "once_cell",
@@ -291,17 +279,17 @@ dependencies = [
 
 [[package]]
 name = "async-io"
-version = "2.3.2"
+version = "2.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884"
+checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
 dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.4.0",
  "cfg-if",
  "concurrent-queue",
  "futures-io",
  "futures-lite 2.3.0",
  "parking",
- "polling 3.7.0",
+ "polling 3.7.2",
  "rustix 0.38.34",
  "slab",
  "tracing",
@@ -319,12 +307,12 @@ dependencies = [
 
 [[package]]
 name = "async-lock"
-version = "3.3.0"
+version = "3.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
+checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
 dependencies = [
- "event-listener 4.0.3",
- "event-listener-strategy 0.4.0",
+ "event-listener 5.3.1",
+ "event-listener-strategy",
  "pin-project-lite",
 ]
 
@@ -365,9 +353,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
 
 [[package]]
 name = "attohttpc"
-version = "0.22.0"
+version = "0.26.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fcf00bc6d5abb29b5f97e3c61a90b6d3caa12f3faf897d4a3e3607c050a35a7"
+checksum = "0f77d243921b0979fbbd728dd2d5162e68ac8252976797c24eb5b3a6af9090dc"
 dependencies = [
  "http 0.2.12",
  "log",
@@ -385,12 +373,12 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "aws-creds"
-version = "0.34.1"
+version = "0.36.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3776743bb68d4ad02ba30ba8f64373f1be4e082fe47651767171ce75bb2f6cf5"
+checksum = "390ad3b77f3e21e01a4a0355865853b681daf1988510b0b15e31c0c4ae7eb0f6"
 dependencies = [
  "attohttpc",
- "dirs",
+ "home",
  "log",
  "quick-xml",
  "rust-ini",
@@ -402,9 +390,9 @@ dependencies = [
 
 [[package]]
 name = "aws-lc-rs"
-version = "1.7.1"
+version = "1.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8487b59d62764df8231cb371c459314df895b41756df457a1fb1243d65c89195"
+checksum = "bf7d844e282b4b56750b2d4e893b2205581ded8709fddd2b6aa5418c150ca877"
 dependencies = [
  "aws-lc-sys",
  "mirai-annotations",
@@ -414,9 +402,9 @@ dependencies = [
 
 [[package]]
 name = "aws-lc-sys"
-version = "0.16.0"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c15eb61145320320eb919d9bab524617a7aa4216c78d342fae3a758bc33073e4"
+checksum = "c3a2c29203f6bf296d01141cc8bb9dbd5ecd4c27843f2ee0767bcd5985a927da"
 dependencies = [
  "bindgen",
  "cc",
@@ -493,9 +481,9 @@ dependencies = [
 
 [[package]]
 name = "backtrace"
-version = "0.3.71"
+version = "0.3.73"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
+checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
 dependencies = [
  "addr2line",
  "cc",
@@ -506,12 +494,6 @@ dependencies = [
  "rustc-demangle",
 ]
 
-[[package]]
-name = "base64"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
-
 [[package]]
 name = "base64"
 version = "0.21.7"
@@ -547,7 +529,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "rustc-hash",
+ "rustc-hash 1.1.0",
  "shlex",
  "syn",
  "which",
@@ -585,12 +567,11 @@ dependencies = [
 
 [[package]]
 name = "blocking"
-version = "1.6.0"
+version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "495f7104e962b7356f0aeb34247aca1fe7d2e783b346582db7f2904cb5717e88"
+checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea"
 dependencies = [
  "async-channel",
- "async-lock 3.3.0",
  "async-task",
  "futures-io",
  "futures-lite 2.3.0",
@@ -620,9 +601,9 @@ dependencies = [
 
 [[package]]
 name = "cc"
-version = "1.0.97"
+version = "1.0.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4"
+checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695"
 dependencies = [
  "jobserver",
  "libc",
@@ -671,9 +652,9 @@ dependencies = [
 
 [[package]]
 name = "clang-sys"
-version = "1.7.0"
+version = "1.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1"
+checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
 dependencies = [
  "glob",
  "libc",
@@ -682,9 +663,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",
@@ -692,9 +673,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",
@@ -704,11 +685,11 @@ 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 0.5.0",
+ "heck",
  "proc-macro2",
  "quote",
  "syn",
@@ -716,9 +697,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 = "cmake"
@@ -787,6 +768,26 @@ version = "0.9.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
 
+[[package]]
+name = "const-random"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
+dependencies = [
+ "const-random-macro",
+]
+
+[[package]]
+name = "const-random-macro"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "tiny-keccak",
+]
+
 [[package]]
 name = "cookie-factory"
 version = "0.3.3"
@@ -820,9 +821,15 @@ dependencies = [
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.19"
+version = "0.8.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
 
 [[package]]
 name = "crypto-common"
@@ -918,31 +925,11 @@ dependencies = [
  "subtle",
 ]
 
-[[package]]
-name = "dirs"
-version = "4.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
-dependencies = [
- "dirs-sys",
-]
-
-[[package]]
-name = "dirs-sys"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
-dependencies = [
- "libc",
- "redox_users",
- "winapi",
-]
-
 [[package]]
 name = "displaydoc"
-version = "0.2.4"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -951,9 +938,12 @@ dependencies = [
 
 [[package]]
 name = "dlv-list"
-version = "0.3.0"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257"
+checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f"
+dependencies = [
+ "const-random",
+]
 
 [[package]]
 name = "doc-comment"
@@ -969,9 +959,9 @@ checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
 
 [[package]]
 name = "either"
-version = "1.11.0"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
+checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
 
 [[package]]
 name = "encoding_rs"
@@ -1002,9 +992,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.8"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
 dependencies = [
  "libc",
  "windows-sys 0.52.0",
@@ -1018,43 +1008,22 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
 
 [[package]]
 name = "event-listener"
-version = "4.0.3"
+version = "5.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
+checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba"
 dependencies = [
  "concurrent-queue",
  "parking",
  "pin-project-lite",
 ]
 
-[[package]]
-name = "event-listener"
-version = "5.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24"
-dependencies = [
- "concurrent-queue",
- "parking",
- "pin-project-lite",
-]
-
-[[package]]
-name = "event-listener-strategy"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
-dependencies = [
- "event-listener 4.0.3",
- "pin-project-lite",
-]
-
 [[package]]
 name = "event-listener-strategy"
 version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
 dependencies = [
- "event-listener 5.3.0",
+ "event-listener 5.3.1",
  "pin-project-lite",
 ]
 
@@ -1304,9 +1273,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 = "glob"
@@ -1316,34 +1285,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
 
 [[package]]
 name = "h2"
-version = "0.3.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
-dependencies = [
- "bytes",
- "fnv",
- "futures-core",
- "futures-sink",
- "futures-util",
- "http 0.2.12",
- "indexmap",
- "slab",
- "tokio",
- "tokio-util",
- "tracing",
-]
-
-[[package]]
-name = "h2"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069"
+checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab"
 dependencies = [
+ "atomic-waker",
  "bytes",
  "fnv",
  "futures-core",
  "futures-sink",
- "futures-util",
  "http 1.1.0",
  "indexmap",
  "slab",
@@ -1354,12 +1304,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.12.3"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-dependencies = [
- "ahash 0.7.8",
-]
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
 
 [[package]]
 name = "hashbrown"
@@ -1367,12 +1314,6 @@ version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 
-[[package]]
-name = "heck"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-
 [[package]]
 name = "heck"
 version = "0.5.0"
@@ -1385,6 +1326,12 @@ version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
 
+[[package]]
+name = "hermit-abi"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
+
 [[package]]
 name = "hex"
 version = "0.4.3"
@@ -1465,12 +1412,12 @@ dependencies = [
 
 [[package]]
 name = "http-body-util"
-version = "0.1.1"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
 dependencies = [
  "bytes",
- "futures-core",
+ "futures-util",
  "http 1.1.0",
  "http-body 1.0.0",
  "pin-project-lite",
@@ -1478,9 +1425,9 @@ dependencies = [
 
 [[package]]
 name = "httparse"
-version = "1.8.0"
+version = "1.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
 
 [[package]]
 name = "httpdate"
@@ -1490,15 +1437,14 @@ 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",
  "futures-core",
  "futures-util",
- "h2 0.3.26",
  "http 0.2.12",
  "http-body 0.4.6",
  "httparse",
@@ -1521,7 +1467,7 @@ dependencies = [
  "bytes",
  "futures-channel",
  "futures-util",
- "h2 0.4.4",
+ "h2",
  "http 1.1.0",
  "http-body 1.0.0",
  "httparse",
@@ -1533,6 +1479,23 @@ dependencies = [
  "want",
 ]
 
+[[package]]
+name = "hyper-rustls"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
+dependencies = [
+ "futures-util",
+ "http 1.1.0",
+ "hyper 1.3.1",
+ "hyper-util",
+ "rustls",
+ "rustls-pki-types",
+ "tokio",
+ "tokio-rustls",
+ "tower-service",
+]
+
 [[package]]
 name = "hyper-tls"
 version = "0.5.0"
@@ -1540,7 +1503,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
 dependencies = [
  "bytes",
- "hyper 0.14.28",
+ "hyper 0.14.29",
  "native-tls",
  "tokio",
  "tokio-native-tls",
@@ -1564,9 +1527,9 @@ dependencies = [
 
 [[package]]
 name = "hyper-util"
-version = "0.1.3"
+version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"
+checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56"
 dependencies = [
  "bytes",
  "futures-channel",
@@ -1637,9 +1600,9 @@ dependencies = [
 
 [[package]]
 name = "instant"
-version = "0.1.12"
+version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
 dependencies = [
  "cfg-if",
 ]
@@ -1650,7 +1613,7 @@ version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
 dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
  "libc",
  "windows-sys 0.48.0",
 ]
@@ -1667,7 +1630,7 @@ version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
 dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
  "libc",
  "windows-sys 0.52.0",
 ]
@@ -1747,9 +1710,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
 
 [[package]]
 name = "libc"
-version = "0.2.154"
+version = "0.2.155"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
 
 [[package]]
 name = "libloading"
@@ -1761,16 +1724,6 @@ dependencies = [
  "windows-targets 0.52.5",
 ]
 
-[[package]]
-name = "libredox"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
-dependencies = [
- "bitflags 2.5.0",
- "libc",
-]
-
 [[package]]
 name = "linux-raw-sys"
 version = "0.3.8"
@@ -1779,9 +1732,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
 
 [[package]]
 name = "lock_api"
@@ -1834,9 +1787,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
 
 [[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 = "metrics"
@@ -1844,7 +1797,7 @@ version = "0.22.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2be3cbd384d4e955b231c895ce10685e3d8260c5ccffae898c96c723b0772835"
 dependencies = [
- "ahash 0.8.11",
+ "ahash",
  "portable-atomic",
 ]
 
@@ -1881,9 +1834,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
 
 [[package]]
 name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
 dependencies = [
  "adler",
 ]
@@ -1926,11 +1879,10 @@ dependencies = [
 
 [[package]]
 name = "native-tls"
-version = "0.2.11"
+version = "0.2.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
 dependencies = [
- "lazy_static",
  "libc",
  "log",
  "openssl",
@@ -2002,15 +1954,15 @@ version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
 dependencies = [
- "hermit-abi",
+ "hermit-abi 0.3.9",
  "libc",
 ]
 
 [[package]]
 name = "object"
-version = "0.32.2"
+version = "0.36.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434"
 dependencies = [
  "memchr",
 ]
@@ -2076,12 +2028,12 @@ dependencies = [
 
 [[package]]
 name = "ordered-multimap"
-version = "0.4.3"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a"
+checksum = "4ed8acf08e98e744e5384c8bc63ceb0364e68a6854187221c18df61c4797690e"
 dependencies = [
  "dlv-list",
- "hashbrown 0.12.3",
+ "hashbrown 0.13.2",
 ]
 
 [[package]]
@@ -2103,9 +2055,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
 
 [[package]]
 name = "p12-keystore"
-version = "0.1.2"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbd7792ed56836118732faffa19b8c2bb20d5f3ff8b403002cd817d6c4ffc96c"
+checksum = "df7b60d0b2dcace322e6e8c4499c4c8bdf331c1bae046a54be5e4191c3610286"
 dependencies = [
  "cbc",
  "cms",
@@ -2131,9 +2083,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
 
 [[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",
@@ -2229,9 +2181,9 @@ dependencies = [
 
 [[package]]
 name = "piper"
-version = "0.2.1"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4"
+checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
 dependencies = [
  "atomic-waker",
  "fastrand 2.1.0",
@@ -2292,13 +2244,13 @@ dependencies = [
 
 [[package]]
 name = "polling"
-version = "3.7.0"
+version = "3.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3"
+checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
 dependencies = [
  "cfg-if",
  "concurrent-queue",
- "hermit-abi",
+ "hermit-abi 0.4.0",
  "pin-project-lite",
  "rustix 0.38.34",
  "tracing",
@@ -2335,18 +2287,18 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.82"
+version = "1.0.86"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quick-xml"
-version = "0.26.0"
+version = "0.30.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd"
+checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956"
 dependencies = [
  "memchr",
  "serde",
@@ -2413,9 +2365,9 @@ dependencies = [
 
 [[package]]
 name = "redis"
-version = "0.25.3"
+version = "0.25.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6472825949c09872e8f2c50bde59fcefc17748b6be5c90fd67cd8b4daca73bfd"
+checksum = "e0d7a6955c7511f60f3ba9e86c6d02b3c3f144f8c24b288d1f4e18074ab8bbec"
 dependencies = [
  "arc-swap",
  "async-trait",
@@ -2437,29 +2389,18 @@ 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 2.5.0",
 ]
 
-[[package]]
-name = "redox_users"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
-dependencies = [
- "getrandom",
- "libredox",
- "thiserror",
-]
-
 [[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",
@@ -2469,9 +2410,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",
@@ -2480,57 +2421,15 @@ 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 = "reqwest"
-version = "0.11.27"
+version = "0.12.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
-dependencies = [
- "base64 0.21.7",
- "bytes",
- "encoding_rs",
- "futures-core",
- "futures-util",
- "h2 0.3.26",
- "http 0.2.12",
- "http-body 0.4.6",
- "hyper 0.14.28",
- "hyper-tls 0.5.0",
- "ipnet",
- "js-sys",
- "log",
- "mime",
- "native-tls",
- "once_cell",
- "percent-encoding",
- "pin-project-lite",
- "rustls-pemfile 1.0.4",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "sync_wrapper 0.1.2",
- "system-configuration",
- "tokio",
- "tokio-native-tls",
- "tokio-util",
- "tower-service",
- "url",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "wasm-streams",
- "web-sys",
- "winreg 0.50.0",
-]
-
-[[package]]
-name = "reqwest"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10"
+checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
 dependencies = [
  "base64 0.22.1",
  "bytes",
@@ -2538,11 +2437,12 @@ dependencies = [
  "futures-channel",
  "futures-core",
  "futures-util",
- "h2 0.4.4",
+ "h2",
  "http 1.1.0",
  "http-body 1.0.0",
  "http-body-util",
  "hyper 1.3.1",
+ "hyper-rustls",
  "hyper-tls 0.6.0",
  "hyper-util",
  "ipnet",
@@ -2553,11 +2453,11 @@ dependencies = [
  "once_cell",
  "percent-encoding",
  "pin-project-lite",
- "rustls-pemfile 2.1.2",
+ "rustls-pemfile",
  "serde",
  "serde_json",
  "serde_urlencoded",
- "sync_wrapper 0.1.2",
+ "sync_wrapper 1.0.1",
  "system-configuration",
  "tokio",
  "tokio-native-tls",
@@ -2566,7 +2466,7 @@ dependencies = [
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "web-sys",
- "winreg 0.52.0",
+ "winreg",
 ]
 
 [[package]]
@@ -2586,9 +2486,9 @@ dependencies = [
 
 [[package]]
 name = "rust-ini"
-version = "0.18.0"
+version = "0.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df"
+checksum = "7e2a3bcec1f113553ef1c88aae6c020a369d03d55b58de9869a0908930385091"
 dependencies = [
  "cfg-if",
  "ordered-multimap",
@@ -2596,33 +2496,37 @@ dependencies = [
 
 [[package]]
 name = "rust-s3"
-version = "0.33.0"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b2ac5ff6acfbe74226fa701b5ef793aaa054055c13ebb7060ad36942956e027"
+checksum = "c6679da8efaf4c6f0c161de0961dfe95fb6e9049c398d6fbdada2639f053aedb"
 dependencies = [
  "async-trait",
  "aws-creds",
  "aws-region",
- "base64 0.13.1",
+ "base64 0.21.7",
  "bytes",
  "cfg-if",
  "futures",
  "hex",
  "hmac",
  "http 0.2.12",
+ "hyper 0.14.29",
+ "hyper-tls 0.5.0",
  "log",
  "maybe-async",
  "md5",
  "minidom",
+ "native-tls",
  "percent-encoding",
  "quick-xml",
- "reqwest 0.11.27",
  "serde",
  "serde_derive",
+ "serde_json",
  "sha2",
  "thiserror",
  "time",
  "tokio",
+ "tokio-native-tls",
  "tokio-stream",
  "url",
 ]
@@ -2639,6 +2543,12 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
+[[package]]
+name = "rustc-hash"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
+
 [[package]]
 name = "rustc_version"
 version = "0.4.0"
@@ -2680,15 +2590,15 @@ dependencies = [
  "bitflags 2.5.0",
  "errno",
  "libc",
- "linux-raw-sys 0.4.13",
+ "linux-raw-sys 0.4.14",
  "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "rustls"
-version = "0.23.5"
+version = "0.23.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e"
+checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402"
 dependencies = [
  "aws-lc-rs",
  "log",
@@ -2719,21 +2629,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792"
 dependencies = [
  "openssl-probe",
- "rustls-pemfile 2.1.2",
+ "rustls-pemfile",
  "rustls-pki-types",
  "schannel",
  "security-framework",
 ]
 
-[[package]]
-name = "rustls-pemfile"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
-dependencies = [
- "base64 0.21.7",
-]
-
 [[package]]
 name = "rustls-pemfile"
 version = "2.1.2"
@@ -2752,9 +2653,9 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
 
 [[package]]
 name = "rustls-webpki"
-version = "0.102.3"
+version = "0.102.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf"
+checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e"
 dependencies = [
  "aws-lc-rs",
  "ring",
@@ -2783,9 +2684,9 @@ dependencies = [
  "mime_guess",
  "mobc",
  "redis",
- "reqwest 0.12.4",
+ "reqwest",
  "rust-s3",
- "rustc-hash",
+ "rustc-hash 2.0.0",
  "sentry",
  "sentry-tower",
  "sentry-tracing",
@@ -2801,6 +2702,7 @@ dependencies = [
  "tower",
  "tower-http",
  "tracing",
+ "tracing-error",
  "tracing-subscriber",
  "uuid",
  "wildmatch",
@@ -2808,9 +2710,9 @@ dependencies = [
 
 [[package]]
 name = "rustversion"
-version = "1.0.16"
+version = "1.0.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0"
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
 
 [[package]]
 name = "rxml"
@@ -2901,13 +2803,13 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 
 [[package]]
 name = "sentry"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00421ed8fa0c995f07cde48ba6c89e80f2b312f74ff637326f392fbfd23abe02"
+checksum = "5484316556650182f03b43d4c746ce0e3e48074a21e2f51244b648b6542e1066"
 dependencies = [
  "httpdate",
  "native-tls",
- "reqwest 0.12.4",
+ "reqwest",
  "sentry-backtrace",
  "sentry-contexts",
  "sentry-core",
@@ -2920,9 +2822,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-backtrace"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a79194074f34b0cbe5dd33896e5928bbc6ab63a889bd9df2264af5acb186921e"
+checksum = "40aa225bb41e2ec9d7c90886834367f560efc1af028f1c5478a6cce6a59c463a"
 dependencies = [
  "backtrace",
  "once_cell",
@@ -2932,9 +2834,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-contexts"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eba8870c5dba2bfd9db25c75574a11429f6b95957b0a78ac02e2970dd7a5249a"
+checksum = "1a8dd746da3d16cb8c39751619cefd4fcdbd6df9610f3310fd646b55f6e39910"
 dependencies = [
  "hostname",
  "libc",
@@ -2946,9 +2848,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-core"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46a75011ea1c0d5c46e9e57df03ce81f5c7f0a9e199086334a1f9c0a541e0826"
+checksum = "161283cfe8e99c8f6f236a402b9ccf726b201f365988b5bb637ebca0abbd4a30"
 dependencies = [
  "once_cell",
  "rand",
@@ -2959,9 +2861,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-debug-images"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ec2a486336559414ab66548da610da5e9626863c3c4ffca07d88f7dc71c8de8"
+checksum = "8fc6b25e945fcaa5e97c43faee0267eebda9f18d4b09a251775d8fef1086238a"
 dependencies = [
  "findshlibs",
  "once_cell",
@@ -2970,9 +2872,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-panic"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eaa3ecfa3c8750c78dcfd4637cfa2598b95b52897ed184b4dc77fcf7d95060d"
+checksum = "bc74f229c7186dd971a9491ffcbe7883544aa064d1589bd30b83fb856cd22d63"
 dependencies = [
  "sentry-backtrace",
  "sentry-core",
@@ -2980,9 +2882,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-tower"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df141464944fdf8e2a6f2184eb1d973a20456466f788346b6e3a51791cdaa370"
+checksum = "6c90802b38c899a2c9e557dff25ad186362eddf755d5f5244001b172dd03bead"
 dependencies = [
  "axum",
  "http 1.1.0",
@@ -2995,9 +2897,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-tracing"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f715932bf369a61b7256687c6f0554141b7ce097287e30e3f7ed6e9de82498fe"
+checksum = "cd3c5faf2103cd01eeda779ea439b68c4ee15adcdb16600836e97feafab362ec"
 dependencies = [
  "sentry-backtrace",
  "sentry-core",
@@ -3007,9 +2909,9 @@ dependencies = [
 
 [[package]]
 name = "sentry-types"
-version = "0.32.3"
+version = "0.34.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4519c900ce734f7a0eb7aba0869dfb225a7af8820634a7dd51449e3b093cfb7c"
+checksum = "5d68cdf6bc41b8ff3ae2a9c4671e97426dcdd154cc1d4b6b72813f285d6b163f"
 dependencies = [
  "debugid",
  "hex",
@@ -3024,18 +2926,18 @@ dependencies = [
 
 [[package]]
 name = "serde"
-version = "1.0.201"
+version = "1.0.203"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c"
+checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.201"
+version = "1.0.203"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865"
+checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3215,11 +3117,11 @@ dependencies = [
 
 [[package]]
 name = "strum_macros"
-version = "0.26.2"
+version = "0.26.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946"
+checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
 dependencies = [
- "heck 0.4.1",
+ "heck",
  "proc-macro2",
  "quote",
  "rustversion",
@@ -3228,15 +3130,15 @@ dependencies = [
 
 [[package]]
 name = "subtle"
-version = "2.5.0"
+version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "0d0208408ba0c3df17ed26eb06992cb1a1268d41b2c0e12e65203fbe3972cee5"
 
 [[package]]
 name = "syn"
-version = "2.0.61"
+version = "2.0.67"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9"
+checksum = "ff8655ed1d86f3af4ee3fd3263786bc14245ad17c4c7e85ba7187fb3ae028c90"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3296,7 +3198,7 @@ dependencies = [
  "cfg-if",
  "p12-keystore",
  "rustls-connector",
- "rustls-pemfile 2.1.2",
+ "rustls-pemfile",
 ]
 
 [[package]]
@@ -3313,18 +3215,18 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.60"
+version = "1.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18"
+checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.60"
+version = "1.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524"
+checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3392,6 +3294,15 @@ dependencies = [
  "time-core",
 ]
 
+[[package]]
+name = "tiny-keccak"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
+dependencies = [
+ "crunchy",
+]
+
 [[package]]
 name = "tinyvec"
 version = "1.6.0"
@@ -3409,9 +3320,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",
@@ -3428,9 +3339,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",
@@ -3458,6 +3369,17 @@ dependencies = [
  "tokio",
 ]
 
+[[package]]
+name = "tokio-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
+dependencies = [
+ "rustls",
+ "rustls-pki-types",
+ "tokio",
+]
+
 [[package]]
 name = "tokio-stream"
 version = "0.1.15"
@@ -3560,6 +3482,16 @@ dependencies = [
  "valuable",
 ]
 
+[[package]]
+name = "tracing-error"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e"
+dependencies = [
+ "tracing",
+ "tracing-subscriber",
+]
+
 [[package]]
 name = "tracing-log"
 version = "0.2.0"
@@ -3659,9 +3591,9 @@ dependencies = [
 
 [[package]]
 name = "url"
-version = "2.5.0"
+version = "2.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
 dependencies = [
  "form_urlencoded",
  "idna",
@@ -3671,9 +3603,9 @@ dependencies = [
 
 [[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"
@@ -3705,9 +3637,9 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
 [[package]]
 name = "waker-fn"
-version = "1.1.1"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
+checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
 
 [[package]]
 name = "want"
@@ -3790,19 +3722,6 @@ version = "0.2.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
 
-[[package]]
-name = "wasm-streams"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
-dependencies = [
- "futures-util",
- "js-sys",
- "wasm-bindgen",
- "wasm-bindgen-futures",
- "web-sys",
-]
-
 [[package]]
 name = "web-sys"
 version = "0.3.69"
@@ -3827,9 +3746,9 @@ dependencies = [
 
 [[package]]
 name = "wildmatch"
-version = "2.3.3"
+version = "2.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "939e59c1bc731542357fdaad98b209ef78c8743d652bb61439d16b16a79eb025"
+checksum = "3928939971918220fed093266b809d1ee4ec6c1a2d72692ff6876898f3b16c19"
 
 [[package]]
 name = "winapi"
@@ -4011,16 +3930,6 @@ version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
 
-[[package]]
-name = "winreg"
-version = "0.50.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
-dependencies = [
- "cfg-if",
- "windows-sys 0.48.0",
-]
-
 [[package]]
 name = "winreg"
 version = "0.52.0"
@@ -4081,6 +3990,20 @@ dependencies = [
 
 [[package]]
 name = "zeroize"
-version = "1.7.0"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
diff --git a/Cargo.toml b/Cargo.toml
index 21f5e73..7b4c21b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,28 +16,28 @@ path = "src/main.rs"
 
 [dependencies]
 async-trait = "0.1.74"
-axum = { version = "0.7.1" }
+axum = { version = "0.7.5" }
 base64 = "0.22.1"
-bytes = "1.5.0"
-chrono = { version = "0.4.26", features = ["serde"] }
+bytes = "1.6.0"
+chrono = { version = "0.4.38", features = ["serde"] }
 clap = { version = "4.3.21", features = ["env", "derive"] }
-enum_dispatch = "0.3.12"
+enum_dispatch = "0.3.13"
 fern = { version = "0.6.2", features = ["colored", "chrono"] }
-futures = "0.3.29"
-log = "0.4.20"
+futures = "0.3.30"
+log = "0.4.21"
 mime = "0.3.17"
 mime_guess = "2.0.4"
-mobc = "0.8.3"
+mobc = "0.8.4"
 redis = { version = "0.25.3", features = ["tokio-comp", "connection-manager"] }
-rustc-hash = "1.1.0"
-serde = { version = "1.0.192", features = ["derive"] }
-serde_json = "1.0.108"
+rustc-hash = "2.0.0"
+serde = { version = "1.0.202", features = ["derive"] }
+serde_json = "1.0.117"
 strum = { version = "0.26.2", features = ["derive"] }
-thiserror = "1.0.50"
-tokio = { version = "1.31.0", features = ["full", "bytes"] }
-tokio-util = { version = "0.7.10", features = ["io"] }
-uuid = { version = "1.5.0", features = ["v4"] }
-rust-s3 = "^0.33"
+thiserror = "1.0.60"
+tokio = { version = "1.37.0", features = ["full", "bytes"] }
+tokio-util = { version = "0.7.11", features = ["io"] }
+uuid = { version = "1.8.0", features = ["v4"] }
+rust-s3 = "0.34.0"
 tower = "0.4.13"
 # Hashsums
 sha1 = { version = "^0.10.1", features = ["compress"] }
@@ -45,13 +45,13 @@ sha2 = { version = "^0.10.1", features = ["compress"] }
 md-5 = "^0.10.1"
 digest = "^0.10.1"
 reqwest = "0.12.4"
-lapin = "2.3.1"
-tower-http = { version = "0.5.0", features = ["cors", "trace"] }
-wildmatch = "2.1.1"
+lapin = "2.3.4"
+tower-http = { version = "0.5.2", features = ["cors", "trace"] }
+wildmatch = "2.3.3"
 tracing = "0.1.40"
-sentry = "0.32.0"
-sentry-tracing = "0.32.0"
-sentry-tower = { version = "0.32.0", features = [
+sentry = "0.34.0"
+sentry-tracing = "0.34.0"
+sentry-tower = { version = "0.34.0", features = [
     "http",
     "axum",
     "axum-matched-path",
@@ -61,6 +61,7 @@ tracing-subscriber = { version = "0.3.18", features = [
     "parking_lot",
     "time",
 ] }
+tracing-error = { version = "0.2.0", features = ["traced-error"] }
 
 [target.'cfg(not(target_env = "msvc"))'.dependencies]
 tikv-jemallocator = { version = "0.5.4", features = [
diff --git a/src/data_storage/impls/file_storage.rs b/src/data_storage/impls/file_storage.rs
index 0515dbc..c8aa7ff 100644
--- a/src/data_storage/impls/file_storage.rs
+++ b/src/data_storage/impls/file_storage.rs
@@ -80,7 +80,7 @@ impl Storage for FileStorage {
         Ok(resp)
     }
 
-    async fn add_bytes(&self, file_info: &FileInfo, mut bytes: Bytes) -> RustusResult<()> {
+    async fn add_bytes(&self, file_info: &FileInfo, bytes: Bytes) -> RustusResult<()> {
         // In normal situation this `if` statement is not
         // gonna be called, but what if it is ...
         let Some(path) = &file_info.path else {
@@ -101,7 +101,6 @@ impl Storage for FileStorage {
             writer.get_ref().sync_data().await?;
         }
         writer.into_inner().shutdown().await?;
-        bytes.clear();
         Ok(())
     }
 
@@ -147,10 +146,11 @@ impl Storage for FileStorage {
             reader.shutdown().await?;
         }
         writer.flush().await?;
+        let mut inner_file = writer.into_inner();
         if self.force_fsync {
-            writer.get_ref().sync_data().await?;
+            inner_file.sync_data().await?;
         }
-        writer.into_inner().shutdown().await?;
+        inner_file.shutdown().await?;
         Ok(())
     }
 
diff --git a/src/data_storage/impls/s3_hybrid.rs b/src/data_storage/impls/s3_hybrid.rs
index fed2673..4385892 100644
--- a/src/data_storage/impls/s3_hybrid.rs
+++ b/src/data_storage/impls/s3_hybrid.rs
@@ -13,7 +13,7 @@ use axum::response::{IntoResponse, Response};
 use bytes::Bytes;
 use s3::{
     command::Command,
-    request::{tokio_backend::Reqwest, Request as S3Request},
+    request::{tokio_backend::HyperRequest, Request as S3Request},
     Bucket,
 };
 
@@ -138,9 +138,9 @@ impl Storage for S3HybridStorage {
         }
         let key = self.get_s3_key(file_info);
         let command = Command::GetObject;
-        let s3_request = Reqwest::new(&self.bucket, &key, command).unwrap();
-        let s3_response = s3_request.response().await.unwrap();
-        let mut resp = axum::body::Body::from_stream(s3_response.bytes_stream()).into_response();
+        let s3_request = HyperRequest::new(&self.bucket, &key, command).await?;
+        let s3_response = s3_request.response_data_to_stream().await?;
+        let mut resp = axum::body::Body::from_stream(s3_response.bytes).into_response();
         resp.headers_mut()
             .generate_disposition(file_info.get_filename());
         Ok(resp)
diff --git a/src/data_storage/mod.rs b/src/data_storage/mod.rs
index 712dac5..c2ca4c3 100644
--- a/src/data_storage/mod.rs
+++ b/src/data_storage/mod.rs
@@ -100,6 +100,7 @@ impl base::Storage for DataStorageImpl {
         }
     }
 
+    #[tracing::instrument(err, skip(self, bytes), fields(storage = self.get_name()))]
     async fn add_bytes(
         &self,
         file_info: &crate::models::file_info::FileInfo,
@@ -111,10 +112,17 @@ impl base::Storage for DataStorageImpl {
         }
     }
 
+    #[tracing::instrument("FileStorage create_file", skip(self, file_info), fields(storage = self.get_name()))]
     async fn create_file(
         &self,
         file_info: &crate::models::file_info::FileInfo,
     ) -> RustusResult<String> {
+        tracing::info!(
+            path = file_info.path,
+            length = file_info.length,
+            "Creating file: {:?}",
+            file_info.id
+        );
         match self {
             Self::File(file) => file.create_file(file_info).await,
             Self::S3Hybrid(s3) => s3.create_file(file_info).await,
@@ -132,6 +140,7 @@ impl base::Storage for DataStorageImpl {
         }
     }
 
+    #[tracing::instrument(skip(self), fields(storage = self.get_name()))]
     async fn remove_file(
         &self,
         file_info: &crate::models::file_info::FileInfo,
diff --git a/src/errors.rs b/src/errors.rs
index f7fb8b3..85c6ded 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -1,5 +1,3 @@
-use std::io::{Error, ErrorKind};
-
 use axum::response::IntoResponse;
 
 use axum::http::StatusCode;
@@ -69,9 +67,9 @@ pub enum RustusError {
 }
 
 /// This conversion allows us to use `RustusError` in the `main` function.
-impl From<RustusError> for Error {
+impl From<RustusError> for std::io::Error {
     fn from(err: RustusError) -> Self {
-        Error::new(ErrorKind::Other, err)
+        std::io::Error::new(std::io::ErrorKind::Other, err)
     }
 }
 
@@ -98,7 +96,7 @@ impl IntoResponse for RustusError {
     fn into_response(self) -> axum::response::Response {
         let status_code = self.get_status_code();
         if status_code != StatusCode::NOT_FOUND {
-            tracing::error!(err=?self, "{self}");
+            tracing::error!(err=%self, "{self}");
         }
         match self {
             RustusError::HTTPHookError(_, proxy_response, content_type) => {
diff --git a/src/info_storages/mod.rs b/src/info_storages/mod.rs
index fe20da1..0b1efba 100644
--- a/src/info_storages/mod.rs
+++ b/src/info_storages/mod.rs
@@ -63,17 +63,20 @@ impl base::InfoStorage for InfoStorageImpl {
         }
     }
 
+    #[tracing::instrument(err, skip(self, file_info))]
     async fn set_info(
         &self,
         file_info: &crate::models::file_info::FileInfo,
         create: bool,
     ) -> RustusResult<()> {
+        tracing::debug!("Setting file info: {:?}", file_info);
         match self {
             Self::Redis(redis) => redis.set_info(file_info, create).await,
             Self::File(file) => file.set_info(file_info, create).await,
         }
     }
 
+    #[tracing::instrument(err, skip(self))]
     async fn get_info(&self, file_id: &str) -> RustusResult<crate::models::file_info::FileInfo> {
         match self {
             Self::Redis(redis) => redis.get_info(file_id).await,
@@ -81,6 +84,7 @@ impl base::InfoStorage for InfoStorageImpl {
         }
     }
 
+    #[tracing::instrument(err, skip(self))]
     async fn remove_info(&self, file_id: &str) -> RustusResult<()> {
         match self {
             Self::Redis(redis) => redis.remove_info(file_id).await,
diff --git a/src/main.rs b/src/main.rs
index f91300b..a96878f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,6 +3,7 @@
 use std::{borrow::Cow, str::FromStr};
 
 use errors::RustusResult;
+use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
 
 pub mod config;
 pub mod data_storage;
@@ -49,7 +50,9 @@ fn main() -> RustusResult<()> {
     greeting(&args);
     #[allow(clippy::no_effect_underscore_binding)]
     let mut _guard = None;
+    let mut sentry_layer = None;
     if let Some(sentry_dsn) = &args.sentry_config.dsn {
+        sentry_layer = Some(sentry_tracing::layer());
         let default_options = sentry::ClientOptions::default();
         _guard = Some(sentry::init(sentry::ClientOptions {
             dsn: sentry::types::Dsn::from_str(sentry_dsn.as_str()).ok(),
@@ -74,6 +77,21 @@ fn main() -> RustusResult<()> {
         }));
     }
 
+    tracing_subscriber::registry()
+        .with(tracing_subscriber::filter::LevelFilter::from_level(
+            args.log_level,
+        ))
+        .with(
+            tracing_subscriber::fmt::layer()
+                .with_level(true)
+                .with_file(false)
+                .with_line_number(false)
+                .with_target(false),
+        )
+        .with(tracing_error::ErrorLayer::default())
+        .with(sentry_layer)
+        .init();
+
     let mut builder = if Some(1) == args.workers {
         tokio::runtime::Builder::new_current_thread()
     } else {
diff --git a/src/notifiers/impls/amqp_notifier.rs b/src/notifiers/impls/amqp_notifier.rs
index ffe4856..84e9d93 100644
--- a/src/notifiers/impls/amqp_notifier.rs
+++ b/src/notifiers/impls/amqp_notifier.rs
@@ -157,6 +157,7 @@ impl Notifier for AMQPNotifier {
         hook: &Hook,
         _header_map: &HeaderMap,
     ) -> RustusResult<()> {
+        tracing::info!("Sending message to AMQP.");
         let chan = self.channel_pool.get().await?;
         let queue = self.get_queue_name(hook);
         let routing_key = self.routing_key.as_ref().unwrap_or(&queue);
diff --git a/src/notifiers/impls/dir_notifier.rs b/src/notifiers/impls/dir_notifier.rs
index 5285112..0bd06b6 100644
--- a/src/notifiers/impls/dir_notifier.rs
+++ b/src/notifiers/impls/dir_notifier.rs
@@ -33,12 +33,10 @@ impl Notifier for DirNotifier {
     ) -> RustusResult<()> {
         let hook_path = self.dir.join(hook.to_string());
         if !hook_path.exists() {
-            tracing::debug!("Hook {} not found.", hook.to_string());
-            return Err(RustusError::HookError(format!(
-                "Hook file {hook} not found."
-            )));
+            tracing::warn!("Hook {} not found.", hook.to_string());
+            return Ok(());
         }
-        tracing::debug!("Running hook: {}", hook_path.as_path().display());
+        tracing::info!("Running dir hook: {}", hook_path.as_path().display());
         let mut command = Command::new(hook_path).arg(message).spawn()?;
         let stat = command.wait().await?;
         if !stat.success() {
diff --git a/src/notifiers/impls/file_notifier.rs b/src/notifiers/impls/file_notifier.rs
index f75425c..8503b3f 100644
--- a/src/notifiers/impls/file_notifier.rs
+++ b/src/notifiers/impls/file_notifier.rs
@@ -23,23 +23,47 @@ impl Notifier for FileNotifier {
         Ok(())
     }
 
-    #[tracing::instrument(err, skip(self, message, _headers_map), fields(exit_status = tracing::field::Empty))]
+    #[tracing::instrument(
+        err,
+        skip(self, message, _headers_map),
+        fields(
+            exit_status = tracing::field::Empty,
+            sout = tracing::field::Empty,
+            serr = tracing::field::Empty,
+        )
+    )]
     async fn send_message(
         &self,
         message: &str,
         hook: &Hook,
         _headers_map: &HeaderMap,
     ) -> RustusResult<()> {
-        tracing::debug!("Running command: {}", self.command.as_str());
-        let mut command = Command::new(self.command.as_str())
-            .arg(hook.to_string())
+        let hook_str = hook.to_string();
+        tracing::info!(
+            "Running command: `{} \"{}\" \"{{message}}\"`",
+            self.command.as_str(),
+            &hook_str
+        );
+
+        let command = Command::new(self.command.as_str())
+            .arg(hook_str)
             .arg(message)
+            .stderr(std::process::Stdio::piped())
+            .stdout(std::process::Stdio::piped())
             .spawn()?;
-        let stat = command.wait().await?;
-        if !stat.success() {
-            tracing::Span::current().record("exit_status", stat.code().unwrap_or(0));
-            return Err(RustusError::HookError("Returned wrong status code".into()));
+        let output = command.wait_with_output().await?;
+
+        tracing::Span::current()
+            .record("exit_status", output.status.code().unwrap_or(0))
+            .record("sout", String::from_utf8_lossy(&output.stdout).to_string())
+            .record("serr", String::from_utf8_lossy(&output.stderr).to_string());
+
+        if !output.status.success() {
+            return Err(RustusError::HookError(String::from(
+                "Returned wrong status code",
+            )));
         }
+
         Ok(())
     }
 }
diff --git a/src/notifiers/impls/http_notifier.rs b/src/notifiers/impls/http_notifier.rs
index c244a2d..0195ea6 100644
--- a/src/notifiers/impls/http_notifier.rs
+++ b/src/notifiers/impls/http_notifier.rs
@@ -40,11 +40,10 @@ impl Notifier for HttpNotifier {
         hook: &Hook,
         header_map: &HeaderMap,
     ) -> RustusResult<()> {
-        tracing::debug!("Starting HTTP Hook.");
+        tracing::info!("Starting HTTP Hook.");
         let idempotency_key = uuid::Uuid::new_v4().to_string();
         let body_bytes = bytes::Bytes::copy_from_slice(message.as_bytes());
-        let requests_vec = self.urls.iter().map(|url| {
-            tracing::debug!("Preparing request for {}", url);
+        for url in &self.urls {
             let mut request = self
                 .client
                 .post(url.as_str())
@@ -57,17 +56,15 @@ impl Notifier for HttpNotifier {
                     request = request.header(item.as_str(), value.as_bytes());
                 }
             }
-            request.body(body_bytes.clone()).send()
-        });
-        for response in requests_vec {
-            let real_resp = response.await?;
-            if !real_resp.status().is_success() {
-                let content_type = real_resp
+            tracing::info!("Sending request to {}", url);
+            let response = request.body(body_bytes.clone()).send().await?;
+            if !response.status().is_success() {
+                let content_type = response
                     .headers()
                     .get("Content-Type")
                     .and_then(|hval| hval.to_str().ok().map(String::from));
-                let status = real_resp.status().as_u16();
-                let text = real_resp.text().await.unwrap_or_default();
+                let status = response.status().as_u16();
+                let text = response.text().await.unwrap_or_default();
                 tracing::Span::current().record("response_body", &text);
                 return Err(RustusError::HTTPHookError(status, text, content_type));
             }
diff --git a/src/notifiers/manager.rs b/src/notifiers/manager.rs
index 3b4e10e..8b07c78 100644
--- a/src/notifiers/manager.rs
+++ b/src/notifiers/manager.rs
@@ -73,6 +73,7 @@ impl NotificationManager {
     ///
     /// This method might fail in case if any of the notifiers fails.
     pub async fn prepare(&mut self) -> crate::errors::RustusResult<()> {
+        tracing::info!("Preparing notifiers.");
         for notifier in &mut self.notifiers {
             notifier.prepare().await?;
         }
@@ -84,13 +85,14 @@ impl NotificationManager {
     /// # Errors
     ///
     /// This method might fail in case if any of the notifiers fails.
-    #[tracing::instrument(skip(self, hook, headers_map))]
+    #[tracing::instrument(skip(self, message, hook, headers_map))]
     pub async fn notify_all(
         &self,
         message: &str,
         hook: &super::hooks::Hook,
         headers_map: &HeaderMap,
     ) -> crate::errors::RustusResult<()> {
+        tracing::info!("Sending message to all notifiers.");
         let collect = self.notifiers.iter().map(|notifier| {
             notifier
                 .send_message(message, hook, headers_map)
diff --git a/src/notifiers/mod.rs b/src/notifiers/mod.rs
index 6f1bc74..2d52218 100644
--- a/src/notifiers/mod.rs
+++ b/src/notifiers/mod.rs
@@ -25,6 +25,7 @@ impl base::Notifier for NotifierImpl {
             Self::Amqp(amqp) => amqp.prepare().await,
         }
     }
+
     async fn send_message(
         &self,
         message: &str,
diff --git a/src/server/mod.rs b/src/server/mod.rs
index 1a4c7c8..7257ceb 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -14,8 +14,8 @@ use axum::{
     response::{IntoResponse, Response},
     Router, ServiceExt,
 };
+use tokio::signal;
 use tower::Layer;
-use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
 
 mod cors;
 mod routes;
@@ -125,25 +125,6 @@ pub async fn start(config: Config) -> RustusResult<()> {
         0,
     )));
 
-    let mut sentry_layer = None;
-    if config.sentry_config.dsn.is_some() {
-        sentry_layer = Some(sentry_tracing::layer());
-    }
-
-    tracing_subscriber::registry()
-        .with(tracing_subscriber::filter::LevelFilter::from_level(
-            config.log_level,
-        ))
-        .with(
-            tracing_subscriber::fmt::layer()
-                .with_level(true)
-                .with_file(false)
-                .with_line_number(false)
-                .with_target(false),
-        )
-        .with(sentry_layer)
-        .init();
-
     let tracer = tower_http::trace::TraceLayer::new_for_http()
         .make_span_with(move |request: &Request| {
             let path = request.uri().path().to_string();
@@ -157,7 +138,7 @@ pub async fn start(config: Config) -> RustusResult<()> {
                 method = ?request.method(),
                 path,
                 version = ?request.version(),
-                ip = ip,
+                ip,
                 status = tracing::field::Empty,
             )
         })
@@ -171,9 +152,10 @@ pub async fn start(config: Config) -> RustusResult<()> {
                 if response.headers().contains_key("X-NO-LOG") {
                     return;
                 }
-                tracing::info!("access log");
+                tracing::info!("request completed with status: {}", response.status());
             },
-        );
+        )
+        .on_failure(());
 
     let state = Arc::new(RustusState::from_config(&config).await?);
     let tus_app = get_router(state);
@@ -197,6 +179,32 @@ pub async fn start(config: Config) -> RustusResult<()> {
             .layer(main_router)
             .into_make_service_with_connect_info::<SocketAddr>(),
     )
+    .with_graceful_shutdown(shutdown_signal())
     .await?;
     Ok(())
 }
+
+async fn shutdown_signal() {
+    let ctrl_c = async {
+        signal::ctrl_c()
+            .await
+            .expect("failed to install Ctrl+C handler");
+    };
+
+    #[cfg(unix)]
+    let terminate = async {
+        signal::unix::signal(signal::unix::SignalKind::terminate())
+            .expect("failed to install signal handler")
+            .recv()
+            .await;
+    };
+
+    #[cfg(not(unix))]
+    let terminate = std::future::pending::<()>();
+
+    tokio::select! {
+        _ = ctrl_c => {},
+        _ = terminate => {},
+    }
+    eprintln!("Shutting down ...")
+}
diff --git a/src/server/routes/create.rs b/src/server/routes/create.rs
index d752fd2..02deaa3 100644
--- a/src/server/routes/create.rs
+++ b/src/server/routes/create.rs
@@ -15,7 +15,7 @@ use crate::{
 };
 
 #[allow(clippy::too_many_lines)]
-#[tracing::instrument(level = "info", skip_all, fields(upload_id = tracing::field::Empty))]
+#[tracing::instrument(skip_all, fields(upload_id = tracing::field::Empty, file_path = tracing::field::Empty))]
 pub async fn handler(
     uri: Uri,
     method: Method,
@@ -97,6 +97,8 @@ pub async fn handler(
 
     file_info.path = Some(state.data_storage.create_file(&file_info).await?);
 
+    tracing::Span::current().record("file_path", &file_info.path);
+
     if file_info.is_final {
         let mut final_size = 0;
         let mut parts_info = Vec::new();
diff --git a/src/server/routes/upload.rs b/src/server/routes/upload.rs
index a9e0e76..8cfe1b0 100644
--- a/src/server/routes/upload.rs
+++ b/src/server/routes/upload.rs
@@ -18,7 +18,6 @@ use crate::{
     utils::{hashes::verify_chunk_checksum, headers::HeaderMapExt},
 };
 
-#[tracing::instrument(level = "info", skip_all, fields(upload_id = tracing::field::Empty))]
 pub async fn handler(
     uri: Uri,
     method: Method,
@@ -110,11 +109,10 @@ pub async fn handler(
     }
     let chunk_len = body.len();
 
-    // Appending bytes to file.
-    state.data_storage.add_bytes(&file_info, body).await?;
-    // bytes.clear()
     // Updating offset.
     file_info.offset += chunk_len;
+    // Appending bytes to file.
+    state.data_storage.add_bytes(&file_info, body).await?;
     // Saving info to info storage.
     state.info_storage.set_info(&file_info, false).await?;
 
diff --git a/src/utils/headers.rs b/src/utils/headers.rs
index a59f42a..2970e19 100644
--- a/src/utils/headers.rs
+++ b/src/utils/headers.rs
@@ -1,8 +1,8 @@
-use std::{collections::HashMap, hash::BuildHasherDefault, net::SocketAddr, str::FromStr};
+use std::{collections::HashMap, net::SocketAddr, str::FromStr};
 
 use axum::http::{HeaderMap, HeaderValue};
 use base64::{engine::general_purpose, Engine};
-use rustc_hash::{FxHashMap, FxHasher};
+use rustc_hash::{FxBuildHasher, FxHashMap};
 
 static DISPOSITION_TYPE_INLINE: &str = "inline";
 static DISPOSITION_TYPE_ATTACHMENT: &str = "attachment";
@@ -34,8 +34,7 @@ impl HeaderMapExt for HeaderMap {
     fn get_metadata(&self) -> Option<FxHashMap<String, String>> {
         let meta_split = self.get("Upload-Metadata")?.to_str().ok()?.split(',');
         let (shint, _) = meta_split.size_hint();
-        let mut meta_map =
-            HashMap::with_capacity_and_hasher(shint, BuildHasherDefault::<FxHasher>::default());
+        let mut meta_map = HashMap::with_capacity_and_hasher(shint, FxBuildHasher::default());
         for meta_entry in meta_split {
             let mut entry_split = meta_entry.trim().split(' ');
             let key = entry_split.next();

From 160c0d574bcae81d5772d4f93922abb4f5ef61a0 Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sun, 23 Jun 2024 03:56:09 +0200
Subject: [PATCH 2/5] Fixed clippy.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 .pre-commit-config.yaml                       |  9 -------
 src/data_storage/impls/file_storage.rs        |  4 ++--
 src/errors.rs                                 | 24 +++++++++----------
 src/info_storages/impls/file_info_storage.rs  |  2 +-
 src/info_storages/impls/redis_info_storage.rs |  8 +++----
 src/main.rs                                   | 20 ++++++++++++++--
 src/models/file_info.rs                       | 14 ++++-------
 src/notifiers/impls/amqp_notifier.rs          | 11 ++++-----
 src/notifiers/impls/dir_notifier.rs           |  2 +-
 src/notifiers/impls/file_notifier.rs          |  2 +-
 src/notifiers/manager.rs                      |  1 +
 src/notifiers/serializer.rs                   |  8 +++----
 src/server/mod.rs                             |  6 ++---
 src/server/routes/create.rs                   | 23 +++++++++---------
 src/server/routes/upload.rs                   | 10 ++++----
 src/utils/hashes.rs                           |  4 +---
 src/utils/headers.rs                          |  7 ++----
 src/utils/lapin_pool.rs                       |  6 ++---
 18 files changed, 77 insertions(+), 84 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4e1b3be..78cb694 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -27,18 +27,9 @@ repos:
         entry: cargo
         args:
           - clippy
-          - --all
-          - -p
-          - rustus
           - --
-          - -W
-          - clippy::all
-          - -W
-          - clippy::pedantic
           - -D
           - warnings
-          - -A
-          - clippy::module_name_repetitions
 
       - id: check
         types:
diff --git a/src/data_storage/impls/file_storage.rs b/src/data_storage/impls/file_storage.rs
index c8aa7ff..96cf6cd 100644
--- a/src/data_storage/impls/file_storage.rs
+++ b/src/data_storage/impls/file_storage.rs
@@ -22,8 +22,8 @@ pub struct FileStorage {
 
 impl FileStorage {
     #[must_use]
-    pub fn new(data_dir: PathBuf, dir_struct: String, force_fsync: bool) -> FileStorage {
-        FileStorage {
+    pub const fn new(data_dir: PathBuf, dir_struct: String, force_fsync: bool) -> Self {
+        Self {
             data_dir,
             dir_struct,
             force_fsync,
diff --git a/src/errors.rs b/src/errors.rs
index 85c6ded..7239567 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -69,22 +69,22 @@ pub enum RustusError {
 /// This conversion allows us to use `RustusError` in the `main` function.
 impl From<RustusError> for std::io::Error {
     fn from(err: RustusError) -> Self {
-        std::io::Error::new(std::io::ErrorKind::Other, err)
+        Self::new(std::io::ErrorKind::Other, err)
     }
 }
 
 impl RustusError {
     fn get_status_code(&self) -> StatusCode {
         match self {
-            RustusError::FileNotFound => StatusCode::NOT_FOUND,
-            RustusError::WrongOffset => StatusCode::CONFLICT,
-            RustusError::FrozenFile
-            | RustusError::SizeAlreadyKnown
-            | RustusError::HookError(_)
-            | RustusError::UnknownHashAlgorithm
-            | RustusError::WrongHeaderValue => StatusCode::BAD_REQUEST,
-            RustusError::WrongChecksum => StatusCode::EXPECTATION_FAILED,
-            RustusError::HTTPHookError(status, _, _) => {
+            Self::FileNotFound => StatusCode::NOT_FOUND,
+            Self::WrongOffset => StatusCode::CONFLICT,
+            Self::FrozenFile
+            | Self::SizeAlreadyKnown
+            | Self::HookError(_)
+            | Self::UnknownHashAlgorithm
+            | Self::WrongHeaderValue => StatusCode::BAD_REQUEST,
+            Self::WrongChecksum => StatusCode::EXPECTATION_FAILED,
+            Self::HTTPHookError(status, _, _) => {
                 StatusCode::from_u16(*status).unwrap_or(StatusCode::INTERNAL_SERVER_ERROR)
             }
             _ => StatusCode::INTERNAL_SERVER_ERROR,
@@ -99,12 +99,12 @@ impl IntoResponse for RustusError {
             tracing::error!(err=%self, "{self}");
         }
         match self {
-            RustusError::HTTPHookError(_, proxy_response, content_type) => {
+            Self::HTTPHookError(_, proxy_response, content_type) => {
                 axum::response::IntoResponse::into_response((
                     status_code,
                     [(
                         "Content-Type",
-                        content_type.unwrap_or("text/plain; charset=utf-8".into()),
+                        content_type.unwrap_or_else(|| "text/plain; charset=utf-8".into()),
                     )],
                     proxy_response,
                 ))
diff --git a/src/info_storages/impls/file_info_storage.rs b/src/info_storages/impls/file_info_storage.rs
index d7fb55a..255edf8 100644
--- a/src/info_storages/impls/file_info_storage.rs
+++ b/src/info_storages/impls/file_info_storage.rs
@@ -16,7 +16,7 @@ pub struct FileInfoStorage {
 
 impl FileInfoStorage {
     #[must_use]
-    pub fn new(info_dir: PathBuf) -> Self {
+    pub const fn new(info_dir: PathBuf) -> Self {
         Self { info_dir }
     }
 
diff --git a/src/info_storages/impls/redis_info_storage.rs b/src/info_storages/impls/redis_info_storage.rs
index 81ab10d..ca72d47 100644
--- a/src/info_storages/impls/redis_info_storage.rs
+++ b/src/info_storages/impls/redis_info_storage.rs
@@ -12,7 +12,7 @@ struct RedisConnectionManager {
 }
 
 impl RedisConnectionManager {
-    pub fn new(client: redis::Client) -> Self {
+    pub const fn new(client: redis::Client) -> Self {
         Self { client }
     }
 }
@@ -81,11 +81,9 @@ impl InfoStorage for RedisStorage {
             .query_async::<MultiplexedConnection, Option<String>>(&mut conn)
             .await?;
 
-        if let Some(res) = res {
+        res.map_or(Err(RustusError::FileNotFound), |res| {
             serde_json::from_str::<FileInfo>(res.as_str()).map_err(RustusError::from)
-        } else {
-            Err(RustusError::FileNotFound)
-        }
+        })
     }
 
     async fn remove_info(&self, file_id: &str) -> RustusResult<()> {
diff --git a/src/main.rs b/src/main.rs
index a96878f..e90558d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,5 +1,21 @@
 #![allow(async_fn_in_trait)]
-
+#![warn(
+    // Base lints.
+    clippy::all,
+    // Some pedantic lints.
+    clippy::pedantic,
+    // New lints which are cool.
+    clippy::nursery,
+)]
+#![
+    allow(
+        // I don't care about this.
+        clippy::module_name_repetitions,
+        // Yo, the hell you should put
+        // it in docs, if signature is clear as sky.
+        clippy::missing_errors_doc
+    )
+]
 use std::{borrow::Cow, str::FromStr};
 
 use errors::RustusResult;
@@ -48,7 +64,7 @@ fn greeting(app_conf: &config::Config) {
 fn main() -> RustusResult<()> {
     let args = config::Config::parse();
     greeting(&args);
-    #[allow(clippy::no_effect_underscore_binding)]
+    #[allow(clippy::collection_is_never_read)]
     let mut _guard = None;
     let mut sentry_layer = None;
     if let Some(sentry_dsn) = &args.sentry_config.dsn {
diff --git a/src/models/file_info.rs b/src/models/file_info.rs
index 9f56a46..a0b48da 100644
--- a/src/models/file_info.rs
+++ b/src/models/file_info.rs
@@ -38,19 +38,13 @@ impl FileInfo {
         path: Option<String>,
         storage: String,
         initial_metadata: Option<FxHashMap<String, String>>,
-    ) -> FileInfo {
+    ) -> Self {
         let id = String::from(file_id);
 
-        let mut deferred_size = true;
-        if length.is_some() {
-            deferred_size = false;
-        }
-        let metadata = match initial_metadata {
-            Some(meta) => meta,
-            None => FxHashMap::default(),
-        };
+        let deferred_size = length.is_none();
+        let metadata = initial_metadata.unwrap_or_default();
 
-        FileInfo {
+        Self {
             id,
             path,
             length,
diff --git a/src/notifiers/impls/amqp_notifier.rs b/src/notifiers/impls/amqp_notifier.rs
index 84e9d93..0f39d75 100644
--- a/src/notifiers/impls/amqp_notifier.rs
+++ b/src/notifiers/impls/amqp_notifier.rs
@@ -60,7 +60,7 @@ impl AMQPNotifier {
     /// TODO: add separate type for this structure.
     pub fn new(options: AMQPHooksOptions) -> Self {
         let manager = ConnnectionPool::new(
-            options.hooks_amqp_url.mlog_err("AMQP url").unwrap().clone(),
+            options.hooks_amqp_url.mlog_err("AMQP url").unwrap(),
             ConnectionProperties::default(),
         );
         let connection_pool = mobc::Pool::builder()
@@ -102,11 +102,10 @@ impl AMQPNotifier {
     /// Otherwise it will generate queue name based on hook name.
     #[must_use]
     pub fn get_queue_name(&self, hook: &Hook) -> String {
-        if let Some(routing_key) = self.routing_key.as_ref() {
-            routing_key.into()
-        } else {
-            format!("{}.{hook}", self.queues_prefix.as_str())
-        }
+        self.routing_key.as_ref().map_or(
+            format!("{}.{hook}", self.queues_prefix.as_str()),
+            std::convert::Into::into,
+        )
     }
 }
 
diff --git a/src/notifiers/impls/dir_notifier.rs b/src/notifiers/impls/dir_notifier.rs
index 0bd06b6..57e0973 100644
--- a/src/notifiers/impls/dir_notifier.rs
+++ b/src/notifiers/impls/dir_notifier.rs
@@ -14,7 +14,7 @@ pub struct DirNotifier {
 
 impl DirNotifier {
     #[must_use]
-    pub fn new(dir: PathBuf) -> Self {
+    pub const fn new(dir: PathBuf) -> Self {
         Self { dir }
     }
 }
diff --git a/src/notifiers/impls/file_notifier.rs b/src/notifiers/impls/file_notifier.rs
index 8503b3f..374171f 100644
--- a/src/notifiers/impls/file_notifier.rs
+++ b/src/notifiers/impls/file_notifier.rs
@@ -13,7 +13,7 @@ pub struct FileNotifier {
 
 impl FileNotifier {
     #[must_use]
-    pub fn new(command: String) -> Self {
+    pub const fn new(command: String) -> Self {
         Self { command }
     }
 }
diff --git a/src/notifiers/manager.rs b/src/notifiers/manager.rs
index 8b07c78..da49817 100644
--- a/src/notifiers/manager.rs
+++ b/src/notifiers/manager.rs
@@ -22,6 +22,7 @@ impl NotificationManager {
     /// It's capable of having multiple notifiers,
     /// which are used to send messages.
     #[must_use]
+    #[allow(clippy::cognitive_complexity)]
     pub fn new(rustus_config: &Config) -> Self {
         let mut manager = Self {
             notifiers: Vec::new(),
diff --git a/src/notifiers/serializer.rs b/src/notifiers/serializer.rs
index 3529cbf..6888a2b 100644
--- a/src/notifiers/serializer.rs
+++ b/src/notifiers/serializer.rs
@@ -45,16 +45,16 @@ impl Format {
             file_info,
         );
         match self {
-            Format::Default => default_format(hook_data),
-            Format::Tusd => tusd_format(hook_data),
-            Format::V2 => v2_format(hook_data),
+            Self::Default => default_format(hook_data),
+            Self::Tusd => tusd_format(hook_data),
+            Self::V2 => v2_format(hook_data),
         }
     }
 }
 
 impl<'a> HookData<'a> {
     #[must_use]
-    pub fn new(
+    pub const fn new(
         uri: String,
         method: &'a str,
         remote_addr: String,
diff --git a/src/server/mod.rs b/src/server/mod.rs
index 7257ceb..e7960e5 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -203,8 +203,8 @@ async fn shutdown_signal() {
     let terminate = std::future::pending::<()>();
 
     tokio::select! {
-        _ = ctrl_c => {},
-        _ = terminate => {},
+        () = ctrl_c => {},
+        () = terminate => {},
     }
-    eprintln!("Shutting down ...")
+    eprintln!("Shutting down ...");
 }
diff --git a/src/server/routes/create.rs b/src/server/routes/create.rs
index 02deaa3..4ebcc8f 100644
--- a/src/server/routes/create.rs
+++ b/src/server/routes/create.rs
@@ -25,14 +25,12 @@ pub async fn handler(
     body: Bytes,
 ) -> RustusResult<Response> {
     let upload_len: Option<usize> = headers.parse("Upload-Length");
-    if !state.config.allow_empty {
-        if let Some(0) = upload_len {
-            return Ok((
-                StatusCode::BAD_REQUEST,
-                "Upload-Length must be greater than 0",
-            )
-                .into_response());
-        }
+    if !state.config.allow_empty && Some(0) == upload_len {
+        return Ok((
+            StatusCode::BAD_REQUEST,
+            "Upload-Length must be greater than 0",
+        )
+            .into_response());
     }
     let defer_size = headers.check("Upload-Defer-Length", |val| val == "1");
     let defer_ext = state
@@ -186,10 +184,11 @@ pub async fn handler(
     // It's more intuitive to send post-finish
     // hook, when final upload is created.
     // https://github.com/s3rius/rustus/issues/77
-    let mut post_hook = Hook::PostCreate;
-    if file_info.is_final || Some(file_info.offset) == file_info.length {
-        post_hook = Hook::PostFinish;
-    }
+    let post_hook = if file_info.is_final || Some(file_info.offset) == file_info.length {
+        Hook::PostFinish
+    } else {
+        Hook::PostCreate
+    };
 
     if state.config.notification_hooks_set.contains(&post_hook) {
         let message = state.config.notification_config.hooks_format.format(
diff --git a/src/server/routes/upload.rs b/src/server/routes/upload.rs
index 8cfe1b0..3bf49a6 100644
--- a/src/server/routes/upload.rs
+++ b/src/server/routes/upload.rs
@@ -116,11 +116,11 @@ pub async fn handler(
     // Saving info to info storage.
     state.info_storage.set_info(&file_info, false).await?;
 
-    let mut hook = Hook::PostReceive;
-
-    if file_info.length == Some(file_info.offset) {
-        hook = Hook::PostFinish;
-    }
+    let hook = if file_info.length == Some(file_info.offset) {
+        Hook::PostFinish
+    } else {
+        Hook::PostReceive
+    };
 
     if state.config.notification_hooks_set.contains(&hook) {
         let state_clone = state.clone();
diff --git a/src/utils/hashes.rs b/src/utils/hashes.rs
index bd87a37..14233c6 100644
--- a/src/utils/hashes.rs
+++ b/src/utils/hashes.rs
@@ -51,10 +51,8 @@ pub fn verify_chunk_checksum(header: &HeaderValue, data: &[u8]) -> RustusResult<
                 return checksum_verify(algo, data, checksum.as_slice());
             }
         }
-        Err(RustusError::WrongHeaderValue)
-    } else {
-        Err(RustusError::WrongHeaderValue)
     }
+    Err(RustusError::WrongHeaderValue)
 }
 
 #[cfg(test)]
diff --git a/src/utils/headers.rs b/src/utils/headers.rs
index 2970e19..b3bdd34 100644
--- a/src/utils/headers.rs
+++ b/src/utils/headers.rs
@@ -24,17 +24,14 @@ impl HeaderMapExt for HeaderMap {
 
     fn check(&self, name: &str, expr: fn(&str) -> bool) -> bool {
         self.get(name)
-            .and_then(|val| match val.to_str() {
-                Ok(val) => Some(expr(val)),
-                Err(_) => None,
-            })
+            .and_then(|val| val.to_str().map_or(None, |val| Some(expr(val))))
             .unwrap_or(false)
     }
 
     fn get_metadata(&self) -> Option<FxHashMap<String, String>> {
         let meta_split = self.get("Upload-Metadata")?.to_str().ok()?.split(',');
         let (shint, _) = meta_split.size_hint();
-        let mut meta_map = HashMap::with_capacity_and_hasher(shint, FxBuildHasher::default());
+        let mut meta_map = HashMap::with_capacity_and_hasher(shint, FxBuildHasher);
         for meta_entry in meta_split {
             let mut entry_split = meta_entry.trim().split(' ');
             let key = entry_split.next();
diff --git a/src/utils/lapin_pool.rs b/src/utils/lapin_pool.rs
index 97a8d10..266716d 100644
--- a/src/utils/lapin_pool.rs
+++ b/src/utils/lapin_pool.rs
@@ -14,14 +14,14 @@ pub struct ChannelPool {
 impl ChannelPool {
     #[must_use]
     pub fn new(pool: mobc::Pool<ConnnectionPool>) -> Self {
-        ChannelPool { pool }
+        Self { pool }
     }
 }
 
 impl ConnnectionPool {
     #[must_use]
-    pub fn new(url: String, properties: ConnectionProperties) -> Self {
-        ConnnectionPool { url, properties }
+    pub const fn new(url: String, properties: ConnectionProperties) -> Self {
+        Self { url, properties }
     }
 }
 

From d2f2bd64775b0225e767d6ecfe9ff972f2861abb Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sun, 23 Jun 2024 08:17:04 +0200
Subject: [PATCH 3/5] Changed workflow.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 .github/workflows/test.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 86aef21..68e0495 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -49,7 +49,7 @@ jobs:
       - uses: actions-rs/clippy-check@v1
         with:
           token: ${{ secrets.GITHUB_TOKEN }}
-          args: --all-features -p rustus -- -W clippy::all -W clippy::pedantic -D warnings -A clippy::module_name_repetitions
+          args: --all-features -p rustus -- -D warnings
 
   tests:
     needs: pre_job

From 7d3082afdc41cadbebe5977330d986f8664be21a Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sun, 23 Jun 2024 08:19:49 +0200
Subject: [PATCH 4/5] Fixed clippy.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 src/data_storage/mod.rs | 2 ++
 src/models/file_info.rs | 4 ++--
 src/utils/hashes.rs     | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/data_storage/mod.rs b/src/data_storage/mod.rs
index c2ca4c3..45302ef 100644
--- a/src/data_storage/mod.rs
+++ b/src/data_storage/mod.rs
@@ -151,7 +151,9 @@ impl base::Storage for DataStorageImpl {
         }
     }
 }
+
 fn from_string_or_path(variable: &Option<String>, path: &Option<PathBuf>) -> String {
+    #[allow(clippy::option_if_let_else)]
     if let Some(variable) = variable {
         variable.to_string()
     } else if let Some(path) = path {
diff --git a/src/models/file_info.rs b/src/models/file_info.rs
index a0b48da..fb9f09c 100644
--- a/src/models/file_info.rs
+++ b/src/models/file_info.rs
@@ -92,8 +92,8 @@ impl FileInfo {
     }
 
     #[cfg(test)]
-    pub fn new_test() -> Self {
-        FileInfo::new(
+    #[must_use] pub fn new_test() -> Self {
+        Self::new(
             uuid::Uuid::new_v4().to_string().as_str(),
             Some(10),
             Some("random_path".into()),
diff --git a/src/utils/hashes.rs b/src/utils/hashes.rs
index 14233c6..a374cf3 100644
--- a/src/utils/hashes.rs
+++ b/src/utils/hashes.rs
@@ -88,7 +88,7 @@ mod tests {
 
     #[test]
     fn test_sum_unknown_algo_checksum_verify() {
-        let res = checksum_verify("base64", "test".as_bytes(), b"dGVzdAo=");
+        let res = checksum_verify("base64", b"test", b"dGVzdAo=");
         assert!(res.is_err());
     }
 

From e324ef46e6295f4456317b39660a0668161cb219 Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sun, 23 Jun 2024 08:20:32 +0200
Subject: [PATCH 5/5] Fixed fmt.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 src/models/file_info.rs | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/models/file_info.rs b/src/models/file_info.rs
index fb9f09c..93ba17c 100644
--- a/src/models/file_info.rs
+++ b/src/models/file_info.rs
@@ -92,7 +92,8 @@ impl FileInfo {
     }
 
     #[cfg(test)]
-    #[must_use] pub fn new_test() -> Self {
+    #[must_use]
+    pub fn new_test() -> Self {
         Self::new(
             uuid::Uuid::new_v4().to_string().as_str(),
             Some(10),