diff --git a/Cargo.lock b/Cargo.lock index 9485c5701..1966bd228 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,10 +4,11 @@ version = 3 [[package]] name = "activitystreams" -version = "0.7.0-alpha.11" +version = "0.7.0-alpha.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a5da1d857ec9ca65ef8d0469cdd64e7b93b59d6cad26f1444bf84b62f3eadd4" +checksum = "6bcc3fbb392890a1942b1e5cca76cba93c8ed24b5ff50004cc3289afaab3f92c" dependencies = [ + "activitystreams-kinds", "chrono", "mime", "serde", @@ -69,9 +70,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.0.0-beta.13" +version = "3.0.0-beta.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc3f9d97e32d75fae3ad7d955ac005eea3fd3ea60a89132768700911a60fd94" +checksum = "055b723746f19534fc5c9a210788686542986d6f1b9cb2900a297bb4c6619f3b" dependencies = [ "actix-codec", "actix-rt", @@ -111,7 +112,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -141,9 +142,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.0.0-beta.9" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411dd3296dd317ff5eff50baa13f31923ea40ec855dd7f2d3ed8639948f0195f" +checksum = "78c9b22794b8af1c2e02434873ef858f2a7db40dbbf861ce77a04cd81ac6b767" dependencies = [ "actix-rt", "actix-service", @@ -151,7 +152,7 @@ dependencies = [ "futures-core", "futures-util", "log", - "mio", + "mio 0.8.0", "num_cpus", "socket2", "tokio", @@ -170,9 +171,9 @@ dependencies = [ [[package]] name = "actix-tls" -version = "3.0.0-beta.9" +version = "3.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d4739910b49c77ea88308a9fbfae544524b34884161527f9978c0102052da0" +checksum = "4a78e066ef965e3501b0710f0722d0741e025b09e01f1af13afba0774efc2f40" dependencies = [ "actix-codec", "actix-rt", @@ -200,9 +201,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.0.0-beta.12" +version = "4.0.0-beta.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87cfc4efaad42f8a054e269d1b85046397ff4e8707e49128dea3f99a512a9d6" +checksum = "1657eb2ed5e8ef246b6e951bafb38644ca433042a65a44f02e5601083b71b895" dependencies = [ "actix-codec", "actix-http", @@ -229,7 +230,7 @@ dependencies = [ "mime", "once_cell", "paste", - "pin-project", + "pin-project-lite", "regex", "serde", "serde_json", @@ -264,9 +265,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfe80a8828fa88a0420dc8fdd4c16b8207326c917f17701881b063eadc2a8d3b" dependencies = [ "actix-router", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -275,9 +276,9 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -323,9 +324,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.45" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee10e43ae4a853c0a3591d4e2ada1719e553be18199d9da9d4a83f5927c2f5c7" +checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203" [[package]] name = "arrayvec" @@ -358,9 +359,9 @@ version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -389,9 +390,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "awc" -version = "3.0.0-beta.11" +version = "3.0.0-beta.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f7d0c472987e454f41c3f4c7fa336ca139707ab255644b0480144c2060c800" +checksum = "e9fef22345ed9fc111adf13c3b1e48473136a2669a73680b82d18d6e71e720fe" dependencies = [ "actix-codec", "actix-http", @@ -523,9 +524,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitvec" -version = "0.19.5" +version = "0.19.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321" +checksum = "55f93d0ef3363c364d5976646a38f04cf67cfe1d4c8d160cdea02cab2c116b33" dependencies = [ "funty", "radium", @@ -776,9 +777,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" dependencies = [ "cfg-if", ] @@ -855,10 +856,10 @@ checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", "strsim 0.9.3", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -869,10 +870,10 @@ checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", "strsim 0.10.0", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -883,7 +884,7 @@ checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ "darling_core 0.10.2", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -894,7 +895,7 @@ checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" dependencies = [ "darling_core 0.13.0", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -915,9 +916,9 @@ checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" dependencies = [ "darling 0.10.2", "derive_builder_core", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -927,22 +928,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" dependencies = [ "darling 0.10.2", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] name = "derive_more" -version = "0.99.16" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "rustc_version 0.3.3", - "syn 1.0.81", + "rustc_version 0.4.0", + "syn 1.0.82", ] [[package]] @@ -987,9 +988,9 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -1078,9 +1079,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "366b1ae88672638e08f97cc9037ce4e5dca6c2b37699a50c72b846a4c654d4bb" dependencies = [ "darling 0.13.0", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -1207,9 +1208,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" +checksum = "8cd0210d8c325c245ff06fd95a3b13689a1a276ac8cfa8e8720cb840bfb84b9e" dependencies = [ "futures-channel", "futures-core", @@ -1222,9 +1223,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +checksum = "7fc8cd39e3dbf865f7340dce6a2d401d24fd37c6fe6c4f0ee0de8bfca2252d27" dependencies = [ "futures-core", "futures-sink", @@ -1232,15 +1233,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" +checksum = "629316e42fe7c2a0b9a65b47d159ceaa5453ab14e8f0a3c5eedbb8cd55b4a445" [[package]] name = "futures-executor" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" +checksum = "7b808bf53348a36cab739d7e04755909b9fcaaa69b7d7e588b37b6ec62704c97" dependencies = [ "futures-core", "futures-task", @@ -1249,42 +1250,39 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" +checksum = "e481354db6b5c353246ccf6a728b0c5511d752c08da7260546fc0933869daa11" [[package]] name = "futures-macro" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" +checksum = "a89f17b21645bc4ed773c69af9c9a0effd4a3f1a3876eadd453469f8854e7fdd" dependencies = [ - "autocfg 1.0.1", - "proc-macro-hack", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] name = "futures-sink" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" +checksum = "996c6442437b62d21a32cd9906f9c41e7dc1e19a9579843fad948696769305af" [[package]] name = "futures-task" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" +checksum = "dabf1872aaab32c886832f2276d2f5399887e2bd613698a02359e4ea83f8de12" [[package]] name = "futures-util" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" +checksum = "41d22213122356472061ac0f1ab2cee28d2bac8491410fd68c2af53d1cedb83e" dependencies = [ - "autocfg 1.0.1", "futures-channel", "futures-core", "futures-io", @@ -1294,8 +1292,6 @@ dependencies = [ "memchr", "pin-project-lite", "pin-utils", - "proc-macro-hack", - "proc-macro-nested", "slab", ] @@ -1456,9 +1452,9 @@ dependencies = [ "log", "mac", "markup5ever 0.10.1", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -1516,17 +1512,17 @@ dependencies = [ [[package]] name = "http-signature-normalization-reqwest" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1e24f3c8b2c8b5eddb82d4cdf07dafe01f5b87f92b81a369dd520a107d33e8" +checksum = "1d1bd8bf2ade1c7952db9df49b776d867172903231ac8ff9bc9961663878fef7" dependencies = [ "base64 0.13.0", "bytes", "chrono", - "futures", "http", "http-signature-normalization", "reqwest", + "reqwest-middleware", "sha2", "thiserror", "tokio", @@ -1644,9 +1640,9 @@ checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] name = "itertools" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" dependencies = [ "either", ] @@ -1859,6 +1855,7 @@ dependencies = [ "percent-encoding", "rand 0.8.4", "reqwest", + "reqwest-middleware", "serde", "serde_json", "serde_with", @@ -1892,6 +1889,7 @@ dependencies = [ "once_cell", "openssl", "reqwest", + "reqwest-middleware", "serde", "serde_json", "sha2", @@ -1903,9 +1901,9 @@ dependencies = [ name = "lemmy_apub_lib_derive" version = "0.14.4-rc.4" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", "trybuild", ] @@ -2019,6 +2017,8 @@ dependencies = [ "lemmy_websocket", "openssl", "reqwest", + "reqwest-middleware", + "reqwest-tracing", "serde", "serde_json", "strum", @@ -2054,6 +2054,7 @@ dependencies = [ "rand 0.8.4", "regex", "reqwest", + "reqwest-middleware", "serde", "serde_json", "smart-default", @@ -2086,6 +2087,7 @@ dependencies = [ "lemmy_utils", "rand 0.8.4", "reqwest", + "reqwest-middleware", "serde", "serde_json", "strum", @@ -2129,9 +2131,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.107" +version = "0.2.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" +checksum = "f98a04dce437184842841303488f70d0188c5f51437d2a834dc097eafa909a01" [[package]] name = "local-channel" @@ -2162,9 +2164,9 @@ dependencies = [ [[package]] name = "lodepng" -version = "3.4.6" +version = "3.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f7ef1b146a329001ccc6ad5fc1def8300281dda5176e8336b7fd44e440fb96" +checksum = "24844d5c0b922ddd52fb5bf0964a4c7f8e799a946ec01bb463771eb04fc1a323" dependencies = [ "fallible_collections", "flate2", @@ -2264,9 +2266,9 @@ checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memoffset" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg 1.0.1", ] @@ -2287,9 +2289,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9753f12909fd8d923f75ae5c3258cae1ed3c8ec052e1b38c93c21a6d157f789c" dependencies = [ "migrations_internals", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -2298,6 +2300,16 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2336,6 +2348,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "mio" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + [[package]] name = "miow" version = "0.3.7" @@ -2590,9 +2615,9 @@ checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -2697,9 +2722,9 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -2716,9 +2741,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" +checksum = "d1a3ea4f0dd7f1f3e512cf97bf100819aa547f36a6eccac8dbaae839eb92363e" [[package]] name = "png" @@ -2759,12 +2784,6 @@ version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - [[package]] name = "proc-macro2" version = "0.4.30" @@ -2776,9 +2795,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "fb37d2df5df740e582f28f8560cf425f52bb267d872fe58358eadb554909f07a" dependencies = [ "unicode-xid 0.2.2", ] @@ -2808,14 +2827,14 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", ] [[package]] name = "quoted_printable" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1238256b09923649ec89b08104c4dfe9f6cb2fea734a5db5384e44916d59e9c5" +checksum = "3fee2dce59f7a43418e3382c766554c614e06a552d53a8f07ef499ea4b332c0f" [[package]] name = "r2d2" @@ -3121,9 +3140,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.6" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d2927ca2f685faf0fc620ac4834690d29e7abb153add10f5812eef20b5e280" +checksum = "07bea77bc708afa10e59905c3d4af7c8fd43c9214251673095ff8b14345fcbc5" dependencies = [ "base64 0.13.0", "bytes", @@ -3139,6 +3158,7 @@ dependencies = [ "lazy_static", "log", "mime", + "mime_guess", "native-tls", "percent-encoding", "pin-project-lite", @@ -3154,6 +3174,36 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest-middleware" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb4bd0c419665f9266097de27649a7723140acd100f2676245e0461278ca97a" +dependencies = [ + "anyhow", + "async-trait", + "futures", + "http", + "reqwest", + "serde", + "task-local-extensions", + "thiserror", +] + +[[package]] +name = "reqwest-tracing" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89af431b8c46776b5071a9a739c2b5fadbed6be2c6158d1ac5f71c4da3d2261c" +dependencies = [ + "async-trait", + "reqwest", + "reqwest-middleware", + "task-local-extensions", + "tokio", + "tracing", +] + [[package]] name = "rgb" version = "0.8.29" @@ -3200,18 +3250,18 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 0.11.0", + "semver 1.0.4", ] [[package]] name = "rustls" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac4581f0fc0e0efd529d069e8189ec7b90b8e7680e21beb35141bdc45f36040" +checksum = "d37e5e2290f3e040b594b1a9e04377c2c671f1a1cfd9bfdef82106ac1c113f84" dependencies = [ "log", "ring", @@ -3221,15 +3271,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" +checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" [[package]] name = "same-file" @@ -3321,17 +3371,14 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0", + "semver-parser", ] [[package]] name = "semver" -version = "0.11.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser 0.10.2", -] +checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" [[package]] name = "semver-parser" @@ -3339,15 +3386,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" version = "1.0.130" @@ -3363,16 +3401,16 @@ version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] name = "serde_json" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e277c495ac6cd1a01a58d0a0c574568b4d1ddf14f59965c6a58b8d96400b54f3" +checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" dependencies = [ "indexmap", "itoa", @@ -3410,9 +3448,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" dependencies = [ "darling 0.13.0", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3432,9 +3470,9 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3546,9 +3584,9 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3602,11 +3640,11 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", "serde", "serde_derive", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3616,13 +3654,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" dependencies = [ "base-x", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", "serde", "serde_derive", "serde_json", "sha1", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3668,7 +3706,7 @@ checksum = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6" dependencies = [ "phf_generator 0.7.24", "phf_shared 0.7.24", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", "string_cache_shared", ] @@ -3681,7 +3719,7 @@ checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" dependencies = [ "phf_generator 0.8.0", "phf_shared 0.8.0", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", ] @@ -3716,9 +3754,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" dependencies = [ "heck", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3745,11 +3783,11 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966" +checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", "unicode-xid 0.2.2", ] @@ -3760,6 +3798,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "task-local-extensions" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36794203e10c86e5998179e260869d156e0674f02d5451b4a3fb9fd86d02aaab" +dependencies = [ + "tokio", +] + [[package]] name = "tempfile" version = "3.2.0" @@ -3809,9 +3856,9 @@ version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3887,10 +3934,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" dependencies = [ "proc-macro-hack", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", "standback", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -3918,7 +3965,7 @@ dependencies = [ "bytes", "libc", "memchr", - "mio", + "mio 0.7.14", "once_cell", "parking_lot", "pin-project-lite", @@ -3933,9 +3980,9 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -4002,9 +4049,9 @@ dependencies = [ [[package]] name = "tracing-actix-web" -version = "0.5.0-beta.3" +version = "0.5.0-beta.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "994e4a59135823bdca121a8d086e3fcc71741c8677b47fa95a6afdd15e8f646f" +checksum = "a90ef8ed903a84ce2c0cf35bd2896e55e22eaa5e2b49c4f16167f4615bb204ac" dependencies = [ "actix-web", "pin-project", @@ -4019,9 +4066,9 @@ version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", ] [[package]] @@ -4066,9 +4113,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507ec620f809cdf07cccb5bc57b13069a88031b795efd4079b1c71b66c1613d" +checksum = "245da694cc7fc4729f3f418b304cb57789f1bed2a78c575407ab8a23f53cb4d3" dependencies = [ "ansi_term", "lazy_static", @@ -4090,9 +4137,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "trybuild" -version = "1.0.52" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "150e726dc059e6fbd4fce3288f5bb3cf70128cf63b0dde23b938a3cad810fb23" +checksum = "9d664de8ea7e531ad4c0f5a834f20b8cb2b8e6dfe88d05796ee7887518ed67b9" dependencies = [ "dissimilar", "glob", @@ -4137,6 +4184,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c" +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.7" @@ -4275,9 +4331,9 @@ dependencies = [ "bumpalo", "lazy_static", "log", - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", "wasm-bindgen-shared", ] @@ -4309,9 +4365,9 @@ version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ - "proc-macro2 1.0.32", + "proc-macro2 1.0.33", "quote 1.0.10", - "syn 1.0.81", + "syn 1.0.82", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/Cargo.toml b/Cargo.toml index 040a25cf3..339c8265d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,8 @@ http-signature-normalization-actix = { version = "0.5.0-beta.10", default-featur tokio = { version = "1.12.0", features = ["sync"] } anyhow = "1.0.44" reqwest = { version = "0.11.4", features = ["json"] } +reqwest-middleware = "0.1.2" +reqwest-tracing = "0.2.0" activitystreams = "0.7.0-alpha.11" actix-rt = { version = "2.2.0", default-features = false } serde_json = { version = "1.0.68", features = ["preserve_order"] } diff --git a/crates/api_crud/src/community/read.rs b/crates/api_crud/src/community/read.rs index 7a6d43542..32ccf73d0 100644 --- a/crates/api_crud/src/community/read.rs +++ b/crates/api_crud/src/community/read.rs @@ -45,7 +45,7 @@ impl PerformCrud for GetCommunity { .await?; ObjectId::::new(community_actor_id) - .dereference(context, &mut 0) + .dereference(context, context.client(), &mut 0) .await .map_err(LemmyError::from) .map_err(|e| e.with_message("couldnt_find_community"))? diff --git a/crates/api_crud/src/user/read.rs b/crates/api_crud/src/user/read.rs index b63d95c83..20864ab6c 100644 --- a/crates/api_crud/src/user/read.rs +++ b/crates/api_crud/src/user/read.rs @@ -52,7 +52,7 @@ impl PerformCrud for GetPersonDetails { webfinger_resolve::(&name, EndpointType::Person, context, &mut 0).await?; let person = ObjectId::::new(actor_id) - .dereference(context, &mut 0) + .dereference(context, context.client(), &mut 0) .await; person .map_err(LemmyError::from) diff --git a/crates/apub/Cargo.toml b/crates/apub/Cargo.toml index fb4e5f100..47da38d60 100644 --- a/crates/apub/Cargo.toml +++ b/crates/apub/Cargo.toml @@ -55,3 +55,4 @@ once_cell = "1.8.0" [dev-dependencies] serial_test = "0.5.1" assert-json-diff = "2.0.1" +reqwest-middleware = "0.1.2" diff --git a/crates/apub/src/activities/comment/create_or_update.rs b/crates/apub/src/activities/comment/create_or_update.rs index 3b1ee3932..b0894ab1a 100644 --- a/crates/apub/src/activities/comment/create_or_update.rs +++ b/crates/apub/src/activities/comment/create_or_update.rs @@ -71,7 +71,9 @@ impl CreateOrUpdateComment { .collect(); let mut inboxes = vec![]; for t in tagged_users { - let person = t.dereference(context, request_counter).await?; + let person = t + .dereference(context, context.client(), request_counter) + .await?; inboxes.push(person.shared_inbox_or_inbox_url()); } diff --git a/crates/apub/src/activities/comment/mod.rs b/crates/apub/src/activities/comment/mod.rs index 29c249526..e26bdc06a 100644 --- a/crates/apub/src/activities/comment/mod.rs +++ b/crates/apub/src/activities/comment/mod.rs @@ -21,7 +21,9 @@ async fn get_notif_recipients( ) -> Result, LemmyError> { let post_id = comment.post_id; let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??; - let actor = actor.dereference(context, request_counter).await?; + let actor = actor + .dereference(context, context.client(), request_counter) + .await?; // Note: // Although mentions could be gotten from the post tags (they are included there), or the ccs, diff --git a/crates/apub/src/activities/community/add_mod.rs b/crates/apub/src/activities/community/add_mod.rs index 3daedaa2e..4fba5ccc0 100644 --- a/crates/apub/src/activities/community/add_mod.rs +++ b/crates/apub/src/activities/community/add_mod.rs @@ -86,7 +86,10 @@ impl ActivityHandler for AddMod { request_counter: &mut i32, ) -> Result<(), LemmyError> { let community = self.get_community(context, request_counter).await?; - let new_mod = self.object.dereference(context, request_counter).await?; + let new_mod = self + .object + .dereference(context, context.client(), request_counter) + .await?; // If we had to refetch the community while parsing the activity, then the new mod has already // been added. Skip it here as it would result in a duplicate key error. diff --git a/crates/apub/src/activities/community/block_user.rs b/crates/apub/src/activities/community/block_user.rs index 140b9a869..cff72c5c8 100644 --- a/crates/apub/src/activities/community/block_user.rs +++ b/crates/apub/src/activities/community/block_user.rs @@ -93,7 +93,10 @@ impl ActivityHandler for BlockUserFromCommunity { request_counter: &mut i32, ) -> Result<(), LemmyError> { let community = self.get_community(context, request_counter).await?; - let blocked_user = self.object.dereference(context, request_counter).await?; + let blocked_user = self + .object + .dereference(context, context.client(), request_counter) + .await?; let community_user_ban_form = CommunityPersonBanForm { community_id: community.id, @@ -129,6 +132,9 @@ impl GetCommunity for BlockUserFromCommunity { context: &LemmyContext, request_counter: &mut i32, ) -> Result { - self.target.dereference(context, request_counter).await + self + .target + .dereference(context, context.client(), request_counter) + .await } } diff --git a/crates/apub/src/activities/community/mod.rs b/crates/apub/src/activities/community/mod.rs index 5961fa047..670b9a7b0 100644 --- a/crates/apub/src/activities/community/mod.rs +++ b/crates/apub/src/activities/community/mod.rs @@ -44,6 +44,6 @@ async fn get_community_from_moderators_url( ) -> Result { let community_id = Url::parse(&moderators.to_string().replace("/moderators", ""))?; ObjectId::new(community_id) - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await } diff --git a/crates/apub/src/activities/community/remove_mod.rs b/crates/apub/src/activities/community/remove_mod.rs index b6a565f1f..448aa23d2 100644 --- a/crates/apub/src/activities/community/remove_mod.rs +++ b/crates/apub/src/activities/community/remove_mod.rs @@ -86,7 +86,10 @@ impl ActivityHandler for RemoveMod { request_counter: &mut i32, ) -> Result<(), LemmyError> { let community = self.get_community(context, request_counter).await?; - let remove_mod = self.object.dereference(context, request_counter).await?; + let remove_mod = self + .object + .dereference(context, context.client(), request_counter) + .await?; let form = CommunityModeratorForm { community_id: community.id, diff --git a/crates/apub/src/activities/community/report.rs b/crates/apub/src/activities/community/report.rs index 35a426679..5ebbd9d7d 100644 --- a/crates/apub/src/activities/community/report.rs +++ b/crates/apub/src/activities/community/report.rs @@ -74,7 +74,9 @@ impl ActivityHandler for Report { request_counter: &mut i32, ) -> Result<(), LemmyError> { verify_activity(&self.id, self.actor.inner(), &context.settings())?; - let community = self.to[0].dereference(context, request_counter).await?; + let community = self.to[0] + .dereference(context, context.client(), request_counter) + .await?; verify_person_in_community(&self.actor, &community, context, request_counter).await?; Ok(()) } @@ -85,8 +87,15 @@ impl ActivityHandler for Report { context: &Data, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let actor = self.actor.dereference(context, request_counter).await?; - match self.object.dereference(context, request_counter).await? { + let actor = self + .actor + .dereference(context, context.client(), request_counter) + .await?; + match self + .object + .dereference(context, context.client(), request_counter) + .await? + { PostOrComment::Post(post) => { let report_form = PostReportForm { creator_id: actor.id, diff --git a/crates/apub/src/activities/community/undo_block_user.rs b/crates/apub/src/activities/community/undo_block_user.rs index 2a7a2b150..8add53b6a 100644 --- a/crates/apub/src/activities/community/undo_block_user.rs +++ b/crates/apub/src/activities/community/undo_block_user.rs @@ -87,7 +87,7 @@ impl ActivityHandler for UndoBlockUserFromCommunity { let blocked_user = self .object .object - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; let community_user_ban_form = CommunityPersonBanForm { diff --git a/crates/apub/src/activities/community/update.rs b/crates/apub/src/activities/community/update.rs index e1c39241c..cddc2e25d 100644 --- a/crates/apub/src/activities/community/update.rs +++ b/crates/apub/src/activities/community/update.rs @@ -121,6 +121,8 @@ impl GetCommunity for UpdateCommunity { request_counter: &mut i32, ) -> Result { let cid = ObjectId::new(self.object.id.clone()); - cid.dereference(context, request_counter).await + cid + .dereference(context, context.client(), request_counter) + .await } } diff --git a/crates/apub/src/activities/deletion/delete.rs b/crates/apub/src/activities/deletion/delete.rs index 9f53a8bfc..774582b16 100644 --- a/crates/apub/src/activities/deletion/delete.rs +++ b/crates/apub/src/activities/deletion/delete.rs @@ -139,7 +139,9 @@ pub(in crate::activities) async fn receive_remove_action( context: &LemmyContext, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let actor = actor.dereference(context, request_counter).await?; + let actor = actor + .dereference(context, context.client(), request_counter) + .await?; use UserOperationCrud::*; match DeletableObjects::read_from_db(object, context).await? { DeletableObjects::Community(community) => { diff --git a/crates/apub/src/activities/deletion/mod.rs b/crates/apub/src/activities/deletion/mod.rs index a9c72a3a4..419469c95 100644 --- a/crates/apub/src/activities/deletion/mod.rs +++ b/crates/apub/src/activities/deletion/mod.rs @@ -165,7 +165,9 @@ async fn receive_delete_action( match DeletableObjects::read_from_db(object, context).await? { DeletableObjects::Community(community) => { if community.local { - let mod_ = actor.dereference(context, request_counter).await?; + let mod_ = actor + .dereference(context, context.client(), request_counter) + .await?; let object = DeletableObjects::Community(community.clone()); send_apub_delete(&mod_, &community.clone(), object, true, context).await?; } diff --git a/crates/apub/src/activities/following/accept.rs b/crates/apub/src/activities/following/accept.rs index a45dcf3c5..690bec28f 100644 --- a/crates/apub/src/activities/following/accept.rs +++ b/crates/apub/src/activities/following/accept.rs @@ -25,7 +25,7 @@ impl AcceptFollowCommunity { let person = follow .actor .clone() - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; let accept = AcceptFollowCommunity { actor: ObjectId::new(community.actor_id()), @@ -65,11 +65,14 @@ impl ActivityHandler for AcceptFollowCommunity { context: &Data, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let person = self.actor.dereference(context, request_counter).await?; + let person = self + .actor + .dereference(context, context.client(), request_counter) + .await?; let community = self .object .actor - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; // This will throw an error if no follow was requested blocking(context.pool(), move |conn| { diff --git a/crates/apub/src/activities/following/follow.rs b/crates/apub/src/activities/following/follow.rs index 877df61f3..fb35b0d32 100644 --- a/crates/apub/src/activities/following/follow.rs +++ b/crates/apub/src/activities/following/follow.rs @@ -75,7 +75,10 @@ impl ActivityHandler for FollowCommunity { ) -> Result<(), LemmyError> { verify_activity(&self.id, self.actor.inner(), &context.settings())?; verify_person(&self.actor, context, request_counter).await?; - let community = self.object.dereference(context, request_counter).await?; + let community = self + .object + .dereference(context, context.client(), request_counter) + .await?; verify_person_in_community(&self.actor, &community, context, request_counter).await?; Ok(()) } @@ -86,8 +89,14 @@ impl ActivityHandler for FollowCommunity { context: &Data, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let person = self.actor.dereference(context, request_counter).await?; - let community = self.object.dereference(context, request_counter).await?; + let person = self + .actor + .dereference(context, context.client(), request_counter) + .await?; + let community = self + .object + .dereference(context, context.client(), request_counter) + .await?; let community_follower_form = CommunityFollowerForm { community_id: community.id, person_id: person.id, diff --git a/crates/apub/src/activities/following/undo_follow.rs b/crates/apub/src/activities/following/undo_follow.rs index 8644cbc50..73b0366bc 100644 --- a/crates/apub/src/activities/following/undo_follow.rs +++ b/crates/apub/src/activities/following/undo_follow.rs @@ -64,11 +64,14 @@ impl ActivityHandler for UndoFollowCommunity { context: &Data, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let person = self.actor.dereference(context, request_counter).await?; + let person = self + .actor + .dereference(context, context.client(), request_counter) + .await?; let community = self .object .object - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; let community_follower_form = CommunityFollowerForm { diff --git a/crates/apub/src/activities/mod.rs b/crates/apub/src/activities/mod.rs index 8a4c4ffe2..e09d69255 100644 --- a/crates/apub/src/activities/mod.rs +++ b/crates/apub/src/activities/mod.rs @@ -41,7 +41,9 @@ async fn verify_person( context: &LemmyContext, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let person = person_id.dereference(context, request_counter).await?; + let person = person_id + .dereference(context, context.client(), request_counter) + .await?; if person.banned { let error = LemmyError::from(anyhow::anyhow!("Person {} is banned", person_id)); return Err(error.with_message("banned")); @@ -58,7 +60,9 @@ pub(crate) async fn verify_person_in_community( context: &LemmyContext, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let person = person_id.dereference(context, request_counter).await?; + let person = person_id + .dereference(context, context.client(), request_counter) + .await?; if person.banned { return Err(LemmyError::from_message("Person is banned from site")); } @@ -90,7 +94,9 @@ pub(crate) async fn verify_mod_action( request_counter: &mut i32, ) -> Result<(), LemmyError> { if community.local { - let actor = actor_id.dereference(context, request_counter).await?; + let actor = actor_id + .dereference(context, context.client(), request_counter) + .await?; // Note: this will also return true for admins in addition to mods, but as we dont know about // remote admins, it doesnt make any difference. diff --git a/crates/apub/src/activities/voting/undo_vote.rs b/crates/apub/src/activities/voting/undo_vote.rs index 3e8403916..3606756a3 100644 --- a/crates/apub/src/activities/voting/undo_vote.rs +++ b/crates/apub/src/activities/voting/undo_vote.rs @@ -86,11 +86,14 @@ impl ActivityHandler for UndoVote { context: &Data, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let actor = self.actor.dereference(context, request_counter).await?; + let actor = self + .actor + .dereference(context, context.client(), request_counter) + .await?; let object = self .object .object - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; match object { PostOrComment::Post(p) => undo_vote_post(actor, &p, context).await, diff --git a/crates/apub/src/activities/voting/vote.rs b/crates/apub/src/activities/voting/vote.rs index 283b04359..789a4c67d 100644 --- a/crates/apub/src/activities/voting/vote.rs +++ b/crates/apub/src/activities/voting/vote.rs @@ -90,8 +90,14 @@ impl ActivityHandler for Vote { context: &Data, request_counter: &mut i32, ) -> Result<(), LemmyError> { - let actor = self.actor.dereference(context, request_counter).await?; - let object = self.object.dereference(context, request_counter).await?; + let actor = self + .actor + .dereference(context, context.client(), request_counter) + .await?; + let object = self + .object + .dereference(context, context.client(), request_counter) + .await?; match object { PostOrComment::Post(p) => vote_post(&self.kind, actor, &p, context).await, PostOrComment::Comment(c) => vote_comment(&self.kind, actor, &c, context).await, @@ -107,7 +113,10 @@ impl GetCommunity for Vote { context: &LemmyContext, request_counter: &mut i32, ) -> Result { - let object = self.object.dereference(context, request_counter).await?; + let object = self + .object + .dereference(context, context.client(), request_counter) + .await?; let cid = match object { PostOrComment::Post(p) => p.community_id, PostOrComment::Comment(c) => { diff --git a/crates/apub/src/collections/community_moderators.rs b/crates/apub/src/collections/community_moderators.rs index 1f7619178..04611ddd0 100644 --- a/crates/apub/src/collections/community_moderators.rs +++ b/crates/apub/src/collections/community_moderators.rs @@ -110,7 +110,9 @@ impl ApubObject for ApubCommunityModerators { // Add new mods to database which have been added to moderators collection for mod_id in apub.ordered_items { let mod_id = ObjectId::new(mod_id); - let mod_user: ApubPerson = mod_id.dereference(&data.1, request_counter).await?; + let mod_user: ApubPerson = mod_id + .dereference(&data.1, data.1.client(), request_counter) + .await?; if !current_moderators .iter() @@ -154,7 +156,8 @@ mod tests { #[actix_rt::test] #[serial] async fn test_parse_lemmy_community_moderators() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let community = parse_lemmy_community(&context).await; let community_id = community.id; diff --git a/crates/apub/src/fetcher/search.rs b/crates/apub/src/fetcher/search.rs index 816a0516f..8c53c25c7 100644 --- a/crates/apub/src/fetcher/search.rs +++ b/crates/apub/src/fetcher/search.rs @@ -27,7 +27,7 @@ pub async fn search_by_apub_id( match Url::parse(query) { Ok(url) => { ObjectId::new(url) - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await } Err(_) => { @@ -43,7 +43,7 @@ pub async fn search_by_apub_id( .await?; Ok(SearchableObjects::Person( ObjectId::new(id) - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?, )) } @@ -57,7 +57,7 @@ pub async fn search_by_apub_id( .await?; Ok(SearchableObjects::Community( ObjectId::new(id) - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?, )) } diff --git a/crates/apub/src/fetcher/webfinger.rs b/crates/apub/src/fetcher/webfinger.rs index 426ec2d6e..e623bee22 100644 --- a/crates/apub/src/fetcher/webfinger.rs +++ b/crates/apub/src/fetcher/webfinger.rs @@ -84,7 +84,7 @@ where *request_counter += 1; if *request_counter > context.settings().http_fetch_retry_limit { - return Err(LemmyError::from(anyhow!("Request retry limit reached"))); + return Err(LemmyError::from_message("Request retry limit reached")); } let response = retry(|| context.client().get(&fetch_url).send()).await?; @@ -109,7 +109,7 @@ where .collect(); for l in links { let object = ObjectId::::new(l) - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await; if object.is_ok() { return object.map(|o| o.actor_id().into()); diff --git a/crates/apub/src/http/community.rs b/crates/apub/src/http/community.rs index d974e31dc..599da96bd 100644 --- a/crates/apub/src/http/community.rs +++ b/crates/apub/src/http/community.rs @@ -119,7 +119,9 @@ pub(crate) async fn get_apub_community_outbox( .await??; let id = ObjectId::new(generate_outbox_url(&community.actor_id)?); let outbox_data = CommunityContext(community.into(), context.get_ref().clone()); - let outbox: ApubCommunityOutbox = id.dereference(&outbox_data, &mut 0).await?; + let outbox: ApubCommunityOutbox = id + .dereference(&outbox_data, context.client(), &mut 0) + .await?; Ok(create_apub_response(&outbox.into_apub(&outbox_data).await?)) } @@ -135,7 +137,9 @@ pub(crate) async fn get_apub_community_moderators( .into(); let id = ObjectId::new(generate_outbox_url(&community.actor_id)?); let outbox_data = CommunityContext(community, context.get_ref().clone()); - let moderators: ApubCommunityModerators = id.dereference(&outbox_data, &mut 0).await?; + let moderators: ApubCommunityModerators = id + .dereference(&outbox_data, context.client(), &mut 0) + .await?; Ok(create_apub_response( &moderators.into_apub(&outbox_data).await?, )) diff --git a/crates/apub/src/http/mod.rs b/crates/apub/src/http/mod.rs index 5e40b9d6c..d9764fac2 100644 --- a/crates/apub/src/http/mod.rs +++ b/crates/apub/src/http/mod.rs @@ -95,7 +95,7 @@ where check_is_apub_id_valid(&activity_data.actor, false, &context.settings())?; let request_counter = &mut 0; let actor = ObjectId::::new(activity_data.actor) - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; verify_signature(&request, &actor.public_key())?; diff --git a/crates/apub/src/objects/comment.rs b/crates/apub/src/objects/comment.rs index 57bbbe122..f525d1f64 100644 --- a/crates/apub/src/objects/comment.rs +++ b/crates/apub/src/objects/comment.rs @@ -179,7 +179,7 @@ impl ApubObject for ApubComment { ) -> Result { let creator = note .attributed_to - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; let (post, parent_comment_id) = note.get_parents(context, request_counter).await?; @@ -246,7 +246,8 @@ pub(crate) mod tests { #[actix_rt::test] #[serial] pub(crate) async fn test_parse_lemmy_comment() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let url = Url::parse("https://enterprise.lemmy.ml/comment/38741").unwrap(); let data = prepare_comment_test(&url, &context).await; @@ -276,7 +277,8 @@ pub(crate) mod tests { #[actix_rt::test] #[serial] async fn test_parse_pleroma_comment() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let url = Url::parse("https://enterprise.lemmy.ml/comment/38741").unwrap(); let data = prepare_comment_test(&url, &context).await; diff --git a/crates/apub/src/objects/community.rs b/crates/apub/src/objects/community.rs index c560278e4..30f506eb4 100644 --- a/crates/apub/src/objects/community.rs +++ b/crates/apub/src/objects/community.rs @@ -147,14 +147,14 @@ impl ApubObject for ApubCommunity { group .outbox - .dereference(&outbox_data, request_counter) + .dereference(&outbox_data, context.client(), request_counter) .await .map_err(|e| debug!("{}", e)) .ok(); if let Some(moderators) = &group.moderators { moderators - .dereference(&outbox_data, request_counter) + .dereference(&outbox_data, context.client(), request_counter) .await .map_err(|e| debug!("{}", e)) .ok(); @@ -247,7 +247,8 @@ pub(crate) mod tests { #[actix_rt::test] #[serial] async fn test_parse_lemmy_community() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let community = parse_lemmy_community(&context).await; diff --git a/crates/apub/src/objects/mod.rs b/crates/apub/src/objects/mod.rs index 5e0a08096..46013e1e3 100644 --- a/crates/apub/src/objects/mod.rs +++ b/crates/apub/src/objects/mod.rs @@ -39,6 +39,7 @@ pub(crate) mod tests { }; use lemmy_websocket::{chat_server::ChatServer, LemmyContext}; use reqwest::Client; + use reqwest_middleware::ClientBuilder; use serde::de::DeserializeOwned; use std::{fs::File, io::BufReader, sync::Arc}; use tokio::sync::Mutex; @@ -57,6 +58,8 @@ pub(crate) mod tests { .user_agent(build_user_agent(&settings)) .build() .unwrap(); + + let client = ClientBuilder::new(client).build(); let secret = Secret { id: 0, jwt_secret: "".to_string(), diff --git a/crates/apub/src/objects/person.rs b/crates/apub/src/objects/person.rs index a4f858c0a..aa658eb41 100644 --- a/crates/apub/src/objects/person.rs +++ b/crates/apub/src/objects/person.rs @@ -224,7 +224,8 @@ pub(crate) mod tests { #[actix_rt::test] #[serial] async fn test_parse_lemmy_person() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let person = parse_lemmy_person(&context).await; @@ -238,7 +239,8 @@ pub(crate) mod tests { #[actix_rt::test] #[serial] async fn test_parse_pleroma_person() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let json = file_to_json_object("assets/pleroma/objects/person.json"); let url = Url::parse("https://queer.hacktivis.me/users/lanodan").unwrap(); diff --git a/crates/apub/src/objects/post.rs b/crates/apub/src/objects/post.rs index 37c0fb3f8..a8d64c18d 100644 --- a/crates/apub/src/objects/post.rs +++ b/crates/apub/src/objects/post.rs @@ -158,7 +158,7 @@ impl ApubObject for ApubPost { ) -> Result { let creator = page .attributed_to - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; let community = page.extract_community(context, request_counter).await?; @@ -216,7 +216,8 @@ mod tests { #[actix_rt::test] #[serial] async fn test_parse_lemmy_post() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let community = parse_lemmy_community(&context).await; let person = parse_lemmy_person(&context).await; diff --git a/crates/apub/src/objects/private_message.rs b/crates/apub/src/objects/private_message.rs index a96a14e89..c7b053e4f 100644 --- a/crates/apub/src/objects/private_message.rs +++ b/crates/apub/src/objects/private_message.rs @@ -113,7 +113,7 @@ impl ApubObject for ApubPrivateMessage { verify_domains_match(note.attributed_to.inner(), note.id.inner())?; let person = note .attributed_to - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?; if person.banned { return Err(LemmyError::from_message("Person is banned from site")); @@ -129,9 +129,11 @@ impl ApubObject for ApubPrivateMessage { ) -> Result { let creator = note .attributed_to - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) + .await?; + let recipient = note.to[0] + .dereference(context, context.client(), request_counter) .await?; - let recipient = note.to[0].dereference(context, request_counter).await?; let content = if let Some(source) = ¬e.source { source.content.clone() } else { @@ -195,7 +197,8 @@ mod tests { #[actix_rt::test] #[serial] async fn test_parse_lemmy_pm() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let url = Url::parse("https://enterprise.lemmy.ml/private_message/1621").unwrap(); let data = prepare_comment_test(&url, &context).await; @@ -223,7 +226,8 @@ mod tests { #[actix_rt::test] #[serial] async fn test_parse_pleroma_pm() { - let manager = create_activity_queue(); + let client = reqwest::Client::new().into(); + let manager = create_activity_queue(client); let context = init_context(manager.queue_handle().clone()); let url = Url::parse("https://enterprise.lemmy.ml/private_message/1621").unwrap(); let data = prepare_comment_test(&url, &context).await; diff --git a/crates/apub/src/protocol/objects/note.rs b/crates/apub/src/protocol/objects/note.rs index 39c606b00..ff463926d 100644 --- a/crates/apub/src/protocol/objects/note.rs +++ b/crates/apub/src/protocol/objects/note.rs @@ -67,7 +67,7 @@ impl Note { let parent = Box::pin( self .in_reply_to - .dereference(context, request_counter) + .dereference(context, context.client(), request_counter) .await?, ); match parent.deref() { diff --git a/crates/apub/src/protocol/objects/page.rs b/crates/apub/src/protocol/objects/page.rs index bac85600a..08b167dde 100644 --- a/crates/apub/src/protocol/objects/page.rs +++ b/crates/apub/src/protocol/objects/page.rs @@ -70,7 +70,10 @@ impl Page { loop { if let Some(cid) = to_iter.next() { let cid = ObjectId::new(cid.clone()); - if let Ok(c) = cid.dereference(context, request_counter).await { + if let Ok(c) = cid + .dereference(context, context.client(), request_counter) + .await + { break Ok(c); } } else { diff --git a/crates/apub_lib/Cargo.toml b/crates/apub_lib/Cargo.toml index 611c9fbc3..4c65c9369 100644 --- a/crates/apub_lib/Cargo.toml +++ b/crates/apub_lib/Cargo.toml @@ -17,6 +17,7 @@ url = { version = "2.2.2", features = ["serde"] } serde_json = { version = "1.0.68", features = ["preserve_order"] } anyhow = "1.0.44" reqwest = { version = "0.11.4", features = ["json"] } +reqwest-middleware = "0.1.2" tracing = "0.1.29" base64 = "0.13.0" openssl = "0.10.36" @@ -25,6 +26,6 @@ http = "0.2.5" sha2 = "0.9.8" actix-web = { version = "4.0.0-beta.9", default-features = false } http-signature-normalization-actix = { version = "0.5.0-beta.10", default-features = false, features = ["server", "sha-2"] } -http-signature-normalization-reqwest = { version = "0.2.0", default-features = false, features = ["sha-2"] } +http-signature-normalization-reqwest = { version = "0.3.0", default-features = false, features = ["sha-2", "middleware"] } background-jobs = "0.11.0" diesel = "1.4.8" diff --git a/crates/apub_lib/src/activity_queue.rs b/crates/apub_lib/src/activity_queue.rs index a6562deb7..c02586ce9 100644 --- a/crates/apub_lib/src/activity_queue.rs +++ b/crates/apub_lib/src/activity_queue.rs @@ -10,7 +10,7 @@ use background_jobs::{ WorkerConfig, }; use lemmy_utils::{location_info, LemmyError}; -use reqwest::Client; +use reqwest_middleware::ClientWithMiddleware; use serde::{Deserialize, Serialize}; use std::{env, fmt::Debug, future::Future, pin::Pin}; use tracing::{info, warn}; @@ -21,7 +21,7 @@ pub async fn send_activity( actor: &dyn ActorType, inboxes: Vec<&Url>, activity: String, - client: &Client, + client: &ClientWithMiddleware, activity_queue: &QueueHandle, ) -> Result<(), LemmyError> { for i in inboxes { @@ -66,7 +66,7 @@ impl ActixJob for SendActivityTask { } } -async fn do_send(task: SendActivityTask, client: &Client) -> Result<(), Error> { +async fn do_send(task: SendActivityTask, client: &ClientWithMiddleware) -> Result<(), Error> { info!("Sending {} to {}", task.activity_id, task.inbox); let result = sign_and_send( client, @@ -101,10 +101,10 @@ async fn do_send(task: SendActivityTask, client: &Client) -> Result<(), Error> { Ok(()) } -pub fn create_activity_queue() -> Manager { +pub fn create_activity_queue(client: ClientWithMiddleware) -> Manager { // Configure and start our workers - WorkerConfig::new_managed(Storage::new(), |_| MyState { - client: Client::default(), + WorkerConfig::new_managed(Storage::new(), move |_| MyState { + client: client.clone(), }) .register::() .start() @@ -112,5 +112,5 @@ pub fn create_activity_queue() -> Manager { #[derive(Clone)] struct MyState { - pub client: Client, + pub client: ClientWithMiddleware, } diff --git a/crates/apub_lib/src/object_id.rs b/crates/apub_lib/src/object_id.rs index e8d0bd6d2..5bb862f68 100644 --- a/crates/apub_lib/src/object_id.rs +++ b/crates/apub_lib/src/object_id.rs @@ -2,13 +2,9 @@ use crate::{traits::ApubObject, APUB_JSON_CONTENT_TYPE}; use activitystreams::chrono::{Duration as ChronoDuration, NaiveDateTime, Utc}; use anyhow::anyhow; use diesel::NotFound; -use lemmy_utils::{ - request::{build_user_agent, retry}, - settings::structs::Settings, - LemmyError, -}; -use once_cell::sync::Lazy; -use reqwest::{Client, StatusCode}; +use lemmy_utils::{request::retry, settings::structs::Settings, LemmyError}; +use reqwest::StatusCode; +use reqwest_middleware::ClientWithMiddleware; use serde::{Deserialize, Serialize}; use std::{ fmt::{Debug, Display, Formatter}, @@ -18,13 +14,6 @@ use std::{ use tracing::info; use url::Url; -static CLIENT: Lazy = Lazy::new(|| { - Client::builder() - .user_agent(build_user_agent(&Settings::get())) - .build() - .expect("Couldn't build client") -}); - /// We store Url on the heap because it is quite large (88 bytes). #[derive(Clone, PartialEq, Serialize, Deserialize, Debug)] #[serde(transparent)] @@ -53,6 +42,7 @@ where pub async fn dereference( &self, data: &::DataType, + client: &ClientWithMiddleware, request_counter: &mut i32, ) -> Result { let db_object = self.dereference_from_db(data).await?; @@ -71,7 +61,7 @@ where if let Some(last_refreshed_at) = object.last_refreshed_at() { if should_refetch_object(last_refreshed_at) { return self - .dereference_from_http(data, request_counter, Some(object)) + .dereference_from_http(data, client, request_counter, Some(object)) .await; } } @@ -80,7 +70,7 @@ where // object not found, need to fetch over http else { self - .dereference_from_http(data, request_counter, None) + .dereference_from_http(data, client, request_counter, None) .await } } @@ -107,6 +97,7 @@ where async fn dereference_from_http( &self, data: &::DataType, + client: &ClientWithMiddleware, request_counter: &mut i32, db_object: Option, ) -> Result { @@ -120,7 +111,7 @@ where } let res = retry(|| { - CLIENT + client .get(self.0.as_str()) .header("Accept", APUB_JSON_CONTENT_TYPE) .timeout(Duration::from_secs(60)) diff --git a/crates/apub_lib/src/signatures.rs b/crates/apub_lib/src/signatures.rs index 36c6b9644..153eb7453 100644 --- a/crates/apub_lib/src/signatures.rs +++ b/crates/apub_lib/src/signatures.rs @@ -11,7 +11,8 @@ use openssl::{ pkey::PKey, sign::{Signer, Verifier}, }; -use reqwest::{Client, Response}; +use reqwest::Response; +use reqwest_middleware::ClientWithMiddleware; use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use std::str::FromStr; @@ -24,7 +25,7 @@ static HTTP_SIG_CONFIG: Lazy = Lazy::new(Config::new); /// Creates an HTTP post request to `inbox_url`, with the given `client` and `headers`, and /// `activity` as request body. The request is signed with `private_key` and then sent. pub async fn sign_and_send( - client: &Client, + client: &ClientWithMiddleware, inbox_url: &Url, activity: String, actor_id: &Url, @@ -43,7 +44,7 @@ pub async fn sign_and_send( ); headers.insert(HeaderName::from_str("Host")?, HeaderValue::from_str(&host)?); - let response = client + let request = client .post(&inbox_url.to_string()) .headers(headers) .signature_with_digest( @@ -61,6 +62,8 @@ pub async fn sign_and_send( ) .await?; + let response = client.execute(request).await?; + Ok(response) } diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml index 3bd4a0ea8..44d510eae 100644 --- a/crates/utils/Cargo.toml +++ b/crates/utils/Cargo.toml @@ -32,6 +32,7 @@ actix-web = { version = "4.0.0-beta.9", default-features = false, features = ["r actix-rt = { version = "2.2.0", default-features = false } anyhow = "1.0.44" reqwest = { version = "0.11.4", features = ["json"] } +reqwest-middleware = "0.1.2" tokio = { version = "1.12.0", features = ["sync"] } strum = "0.21.0" strum_macros = "0.21.1" diff --git a/crates/utils/src/request.rs b/crates/utils/src/request.rs index 88680c080..10341e801 100644 --- a/crates/utils/src/request.rs +++ b/crates/utils/src/request.rs @@ -1,7 +1,7 @@ use crate::{settings::structs::Settings, version::VERSION, LemmyError}; use anyhow::anyhow; use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; -use reqwest::Client; +use reqwest_middleware::ClientWithMiddleware; use serde::{Deserialize, Serialize}; use std::future::Future; use thiserror::Error; @@ -17,30 +17,33 @@ struct SendError(pub String); #[error("Error receiving response, {0}")] pub struct RecvError(pub String); -pub async fn retry(f: F) -> Result +pub async fn retry(f: F) -> Result where F: Fn() -> Fut, - Fut: Future>, + Fut: Future>, { retry_custom(|| async { Ok((f)().await) }).await } -async fn retry_custom(f: F) -> Result +async fn retry_custom(f: F) -> Result where F: Fn() -> Fut, - Fut: Future, reqwest::Error>>, + Fut: Future, reqwest_middleware::Error>>, { - let mut response: Option> = None; + let mut response: Option> = None; for _ in 0u8..3 { match (f)().await? { Ok(t) => return Ok(t), - Err(e) => { + Err(reqwest_middleware::Error::Reqwest(e)) => { if e.is_timeout() { - response = Some(Err(e)); + response = Some(Err(reqwest_middleware::Error::Reqwest(e))); continue; } - return Err(e); + return Err(reqwest_middleware::Error::Reqwest(e)); + } + Err(otherwise) => { + return Err(otherwise); } } } @@ -57,7 +60,10 @@ pub struct SiteMetadata { } /// Fetches the post link html tags (like title, description, image, etc) -pub async fn fetch_site_metadata(client: &Client, url: &Url) -> Result { +pub async fn fetch_site_metadata( + client: &ClientWithMiddleware, + url: &Url, +) -> Result { let response = client.get(url.as_str()).send().await?; let html = response @@ -119,7 +125,7 @@ pub(crate) struct PictrsFile { } pub(crate) async fn fetch_pictrs( - client: &Client, + client: &ClientWithMiddleware, settings: &Settings, image_url: &Url, ) -> Result { @@ -152,7 +158,7 @@ pub(crate) async fn fetch_pictrs( /// Both are options, since the URL might be either an html page, or an image /// Returns the SiteMetadata, and a Pictrs URL, if there is a picture associated pub async fn fetch_site_data( - client: &Client, + client: &ClientWithMiddleware, settings: &Settings, url: Option<&Url>, ) -> (Option, Option) { @@ -201,7 +207,7 @@ pub async fn fetch_site_data( } } -async fn is_image_content_type(client: &Client, url: &Url) -> Result<(), LemmyError> { +async fn is_image_content_type(client: &ClientWithMiddleware, url: &Url) -> Result<(), LemmyError> { let response = client.get(url.as_str()).send().await?; if response .headers() @@ -239,7 +245,8 @@ mod tests { let client = reqwest::Client::builder() .user_agent(build_user_agent(&settings)) .build() - .unwrap(); + .unwrap() + .into(); let sample_url = Url::parse("https://www.redspark.nu/en/peoples-war/district-leader-of-chand-led-cpn-arrested-in-bhojpur/").unwrap(); let sample_res = fetch_site_metadata(&client, &sample_url).await.unwrap(); assert_eq!( diff --git a/crates/websocket/Cargo.toml b/crates/websocket/Cargo.toml index 0ee04c86e..4340e4865 100644 --- a/crates/websocket/Cargo.toml +++ b/crates/websocket/Cargo.toml @@ -19,6 +19,7 @@ lemmy_db_schema = { version = "=0.14.4-rc.4", path = "../db_schema" } lemmy_db_views = { version = "=0.14.4-rc.4", path = "../db_views" } lemmy_db_views_actor = { version = "=0.14.4-rc.4", path = "../db_views_actor" } reqwest = { version = "0.11.4", features = ["json"] } +reqwest-middleware = "0.1.2" tracing = "0.1.29" rand = "0.8.4" serde = { version = "1.0.130", features = ["derive"] } diff --git a/crates/websocket/src/chat_server.rs b/crates/websocket/src/chat_server.rs index 5d91800e0..53274e386 100644 --- a/crates/websocket/src/chat_server.rs +++ b/crates/websocket/src/chat_server.rs @@ -27,7 +27,7 @@ use lemmy_utils::{ LemmyError, }; use rand::rngs::ThreadRng; -use reqwest::Client; +use reqwest_middleware::ClientWithMiddleware; use serde::Serialize; use serde_json::Value; use std::{ @@ -90,7 +90,7 @@ pub struct ChatServer { message_handler_crud: MessageHandlerCrudType, /// An HTTP Client - client: Client, + client: ClientWithMiddleware, activity_queue: QueueHandle, } @@ -110,7 +110,7 @@ impl ChatServer { rate_limiter: RateLimit, message_handler: MessageHandlerType, message_handler_crud: MessageHandlerCrudType, - client: Client, + client: ClientWithMiddleware, activity_queue: QueueHandle, settings: Settings, secret: Secret, diff --git a/crates/websocket/src/lib.rs b/crates/websocket/src/lib.rs index f422ac51e..88f0f6a43 100644 --- a/crates/websocket/src/lib.rs +++ b/crates/websocket/src/lib.rs @@ -6,7 +6,7 @@ use actix::Addr; use background_jobs::QueueHandle; use lemmy_db_schema::{source::secret::Secret, DbPool}; use lemmy_utils::{settings::structs::Settings, LemmyError}; -use reqwest::Client; +use reqwest_middleware::ClientWithMiddleware; use serde::Serialize; pub mod chat_server; @@ -18,7 +18,7 @@ pub mod send; pub struct LemmyContext { pool: DbPool, chat_server: Addr, - client: Client, + client: ClientWithMiddleware, activity_queue: QueueHandle, settings: Settings, secret: Secret, @@ -28,7 +28,7 @@ impl LemmyContext { pub fn create( pool: DbPool, chat_server: Addr, - client: Client, + client: ClientWithMiddleware, activity_queue: QueueHandle, settings: Settings, secret: Secret, @@ -48,7 +48,7 @@ impl LemmyContext { pub fn chat_server(&self) -> &Addr { &self.chat_server } - pub fn client(&self) -> &Client { + pub fn client(&self) -> &ClientWithMiddleware { &self.client } pub fn activity_queue(&self) -> &QueueHandle { diff --git a/src/main.rs b/src/main.rs index 8f130fde2..c65cf4479 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,6 +29,8 @@ use lemmy_utils::{ }; use lemmy_websocket::{chat_server::ChatServer, LemmyContext}; use reqwest::Client; +use reqwest_middleware::ClientBuilder; +use reqwest_tracing::TracingMiddleware; use std::{env, sync::Arc, thread}; use tokio::sync::Mutex; use tracing_actix_web::TracingLogger; @@ -95,7 +97,9 @@ async fn main() -> Result<(), LemmyError> { .user_agent(build_user_agent(&settings)) .build()?; - let queue_manager = create_activity_queue(); + let client = ClientBuilder::new(client).with(TracingMiddleware).build(); + + let queue_manager = create_activity_queue(client.clone()); let activity_queue = queue_manager.queue_handle().clone();