From ea1a590df11552cee90bce0bfe557ea771f3c9b6 Mon Sep 17 00:00:00 2001 From: Pavel Kirilin Date: Sun, 23 Jun 2024 02:52:41 +0200 Subject: [PATCH 1/5] Added sentry support. Signed-off-by: Pavel Kirilin --- 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 { + 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 for Error { +impl From 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 { 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::(), ) + .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> { 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::::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 Date: Sun, 23 Jun 2024 03:56:09 +0200 Subject: [PATCH 2/5] Fixed clippy. Signed-off-by: Pavel Kirilin --- .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 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::>(&mut conn) .await?; - if let Some(res) = res { + res.map_or(Err(RustusError::FileNotFound), |res| { serde_json::from_str::(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, storage: String, initial_metadata: Option>, - ) -> 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 { let upload_len: Option = 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> { 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) -> 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 Date: Sun, 23 Jun 2024 08:17:04 +0200 Subject: [PATCH 3/5] Changed workflow. Signed-off-by: Pavel Kirilin --- .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 Date: Sun, 23 Jun 2024 08:19:49 +0200 Subject: [PATCH 4/5] Fixed clippy. Signed-off-by: Pavel Kirilin --- 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, path: &Option) -> 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 Date: Sun, 23 Jun 2024 08:20:32 +0200 Subject: [PATCH 5/5] Fixed fmt. Signed-off-by: Pavel Kirilin --- 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),