From 52fdc6a87768686e0d8c60123c321d8f62f97360 Mon Sep 17 00:00:00 2001 From: "Dustin J. Mitchell" Date: Sat, 8 Apr 2023 09:30:28 -0400 Subject: [PATCH] Update Actix crates to latest versions This avoids a vulnerability in tokio (#3085). The major version updates of both actix-web and actix-rt required some signficant changes. Chief among those, it turns out we were relying on actix-rt to run the HttpServer in a different thread from the rest of the test, so that we could talk to it from sync code in the test thread. This no longer works, so the sync code is now run in a dedicated thread with `actix_rt::task::spawn_blocking`. --- Cargo.lock | 1070 ++++------------- taskchampion/integration-tests/Cargo.toml | 4 +- .../integration-tests/tests/cross-sync.rs | 135 ++- .../integration-tests/tests/snapshots.rs | 132 +- taskchampion/sync-server/Cargo.toml | 4 +- .../sync-server/src/api/add_snapshot.rs | 34 +- .../sync-server/src/api/add_version.rs | 34 +- .../sync-server/src/api/get_child_version.rs | 24 +- .../sync-server/src/api/get_snapshot.rs | 14 +- taskchampion/sync-server/src/lib.rs | 5 +- 10 files changed, 466 insertions(+), 990 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e74670d6d..2c9677e27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,91 +4,65 @@ version = 3 [[package]] name = "actix-codec" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78d1833b3838dbe990df0f1f87baf640cf6146e898166afe401839d1b001e570" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" dependencies = [ "bitflags 1.3.2", - "bytes 0.5.6", + "bytes", "futures-core", "futures-sink", "log", - "pin-project 0.4.29", + "memchr", + "pin-project-lite", "tokio", "tokio-util", ] -[[package]] -name = "actix-connect" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177837a10863f15ba8d3ae3ec12fac1099099529ed20083a27fdfe247381d0dc" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "derive_more", - "either", - "futures-util", - "http", - "log", - "trust-dns-proto", - "trust-dns-resolver", -] - [[package]] name = "actix-http" -version = "2.2.2" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be6b66b62a794a8e6d366ac9415bb7d475ffd1e9f4671f38c1d8a8a5df950b3" +checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" dependencies = [ "actix-codec", - "actix-connect", "actix-rt", "actix-service", - "actix-threadpool", "actix-utils", - "base64", + "ahash 0.8.3", + "base64 0.21.0", "bitflags 1.3.2", "brotli", - "bytes 0.5.6", - "cookie", - "copyless", + "bytes", + "bytestring", "derive_more", - "either", "encoding_rs", "flate2", - "futures-channel", "futures-core", - "futures-util", - "fxhash", "h2", "http", "httparse", - "indexmap", - "itoa 0.4.8", + "httpdate", + "itoa", "language-tags", - "lazy_static", - "log", + "local-channel", "mime", "percent-encoding", - "pin-project 1.0.10", - "rand 0.7.3", - "regex", - "serde", - "serde_json", - "serde_urlencoded", - "sha-1", - "slab", - "time 0.2.27", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", ] [[package]] name = "actix-macros" -version = "0.1.3" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ca8ce00b267af8ccebbd647de0d61e0674b6e61185cc7a592ff88772bed655" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ "quote", "syn", @@ -96,128 +70,72 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.2.7" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad299af73649e1fc893e333ccf86f377751eb95ff875d095131574c6f43452c" +checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" dependencies = [ "bytestring", "http", - "log", "regex", "serde", + "tracing", ] [[package]] name = "actix-rt" -version = "1.1.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227" +checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" dependencies = [ "actix-macros", - "actix-threadpool", - "copyless", - "futures-channel", - "futures-util", - "smallvec", + "futures-core", "tokio", ] [[package]] name = "actix-server" -version = "1.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45407e6e672ca24784baa667c5d32ef109ccdd8d5e0b5ebb9ef8a67f4dfb708e" +checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" dependencies = [ - "actix-codec", "actix-rt", "actix-service", "actix-utils", - "futures-channel", + "futures-core", "futures-util", - "log", "mio", - "mio-uds", "num_cpus", - "slab", "socket2", + "tokio", + "tracing", ] [[package]] name = "actix-service" -version = "1.0.6" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0052435d581b5be835d11f4eb3bce417c8af18d87ddf8ace99f8e67e595882bb" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" dependencies = [ - "futures-util", - "pin-project 0.4.29", -] - -[[package]] -name = "actix-testing" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47239ca38799ab74ee6a8a94d1ce857014b2ac36f242f70f3f75a66f691e791c" -dependencies = [ - "actix-macros", - "actix-rt", - "actix-server", - "actix-service", - "log", - "socket2", -] - -[[package]] -name = "actix-threadpool" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d209f04d002854b9afd3743032a27b066158817965bf5d036824d19ac2cc0e30" -dependencies = [ - "derive_more", - "futures-channel", - "lazy_static", - "log", - "num_cpus", - "parking_lot", - "threadpool", -] - -[[package]] -name = "actix-tls" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24789b7d7361cf5503a504ebe1c10806896f61e96eca9a7350e23001aca715fb" -dependencies = [ - "actix-codec", - "actix-service", - "actix-utils", - "futures-util", + "futures-core", + "paste", + "pin-project-lite", ] [[package]] name = "actix-utils" -version = "2.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9022dec56632d1d7979e59af14f0597a28a830a9c1c7fec8b2327eb9f16b5a" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "bitflags 1.3.2", - "bytes 0.5.6", - "either", - "futures-channel", - "futures-sink", - "futures-util", - "log", - "pin-project 0.4.29", - "slab", + "local-waker", + "pin-project-lite", ] [[package]] name = "actix-web" -version = "3.3.3" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6534a126df581caf443ba2751cab42092c89b3f1d06a9d829b1e17edfe3e277" +checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" dependencies = [ "actix-codec", "actix-http", @@ -226,38 +144,41 @@ dependencies = [ "actix-rt", "actix-server", "actix-service", - "actix-testing", - "actix-threadpool", - "actix-tls", "actix-utils", "actix-web-codegen", - "awc", - "bytes 0.5.6", + "ahash 0.7.6", + "bytes", + "bytestring", + "cfg-if", + "cookie", "derive_more", "encoding_rs", - "futures-channel", "futures-core", "futures-util", - "fxhash", + "http", + "itoa", + "language-tags", "log", "mime", - "pin-project 1.0.10", + "once_cell", + "pin-project-lite", "regex", "serde", "serde_json", "serde_urlencoded", + "smallvec", "socket2", - "time 0.2.27", - "tinyvec", + "time 0.3.20", "url", ] [[package]] name = "actix-web-codegen" -version = "0.4.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad26f77093333e0e7c6ffe54ebe3582d908a104e448723eec6d43d08b07143fb" +checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" dependencies = [ + "actix-router", "proc-macro2", "quote", "syn", @@ -275,7 +196,19 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.6", + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "getrandom", "once_cell", "version_check", ] @@ -319,17 +252,6 @@ version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" -[[package]] -name = "async-trait" -version = "0.1.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "atty" version = "0.2.14" @@ -338,7 +260,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi 0.1.19", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -347,42 +269,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "awc" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b381e490e7b0cfc37ebc54079b0413d8093ef43d14a4e4747083f7fa47a9e691" -dependencies = [ - "actix-codec", - "actix-http", - "actix-rt", - "actix-service", - "base64", - "bytes 0.5.6", - "cfg-if 1.0.0", - "derive_more", - "futures-core", - "log", - "mime", - "percent-encoding", - "rand 0.7.3", - "serde", - "serde_json", - "serde_urlencoded", -] - -[[package]] -name = "base-x" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" - [[package]] name = "base64" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + [[package]] name = "bit-set" version = "0.5.2" @@ -412,9 +310,9 @@ checksum = "487f1e0fcbe47deb8b0574e646def1c903389d95241dd1bbcc6ce4a715dfc0c1" [[package]] name = "block-buffer" -version = "0.9.0" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -452,12 +350,6 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytes" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" - [[package]] name = "bytes" version = "1.1.0" @@ -470,7 +362,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" dependencies = [ - "bytes 1.1.0", + "bytes", ] [[package]] @@ -497,12 +389,9 @@ name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -523,7 +412,7 @@ dependencies = [ "serde", "time 0.1.43", "wasm-bindgen", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -572,12 +461,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "const_fn" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" - [[package]] name = "convert_case" version = "0.4.0" @@ -586,21 +469,15 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cookie" -version = "0.14.4" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", - "time 0.2.27", + "time 0.3.20", "version_check", ] -[[package]] -name = "copyless" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" - [[package]] name = "core-foundation-sys" version = "0.8.3" @@ -622,7 +499,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", ] [[package]] @@ -644,7 +531,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version", "syn", ] @@ -656,44 +543,21 @@ checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" [[package]] name = "digest" -version = "0.9.0" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "generic-array", + "block-buffer", + "crypto-common", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - [[package]] name = "encoding_rs" version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enum-as-inner" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", + "cfg-if", ] [[package]] @@ -717,7 +581,7 @@ checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" dependencies = [ "errno-dragonfly", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -788,22 +652,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags 1.3.2", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - [[package]] name = "futures" version = "0.3.25" @@ -894,20 +742,11 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.9", + "pin-project-lite", "pin-utils", "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" version = "0.14.5" @@ -920,33 +759,22 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.16" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "h2" -version = "0.2.7" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" dependencies = [ - "bytes 0.5.6", + "bytes", "fnv", "futures-core", "futures-sink", @@ -957,7 +785,6 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "tracing-futures", ] [[package]] @@ -972,7 +799,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" dependencies = [ - "ahash", + "ahash 0.7.6", ] [[package]] @@ -1008,26 +835,15 @@ dependencies = [ "libc", ] -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi 0.3.9", -] - [[package]] name = "http" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ - "bytes 1.1.0", + "bytes", "fnv", - "itoa 1.0.2", + "itoa", ] [[package]] @@ -1036,6 +852,12 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + [[package]] name = "humantime" version = "2.1.0" @@ -1053,7 +875,7 @@ dependencies = [ "js-sys", "once_cell", "wasm-bindgen", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1083,7 +905,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1114,27 +936,6 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] - -[[package]] -name = "ipconfig" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" -dependencies = [ - "socket2", - "widestring", - "winapi 0.3.9", - "winreg", -] - [[package]] name = "is-terminal" version = "0.4.0" @@ -1147,18 +948,21 @@ dependencies = [ "windows-sys 0.42.0", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.59" @@ -1168,21 +972,11 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "language-tags" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy_static" @@ -1213,12 +1007,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linked-hash-map" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" - [[package]] name = "linux-raw-sys" version = "0.1.3" @@ -1231,6 +1019,24 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd550e73688e6d578f0ac2119e32b797a327631a42f9433e59d02e139c8df60d" +[[package]] +name = "local-channel" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" + [[package]] name = "lock_api" version = "0.4.7" @@ -1247,24 +1053,9 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] -[[package]] -name = "lru-cache" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matches" version = "0.1.9" @@ -1294,55 +1085,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.23" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", "libc", "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio-uds" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -dependencies = [ - "iovec", - "libc", - "mio", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "net2" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", + "wasi", + "windows-sys 0.45.0", ] [[package]] @@ -1381,12 +1131,6 @@ version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "os_str_bytes" version = "6.1.0" @@ -1399,86 +1143,44 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] name = "parking_lot" -version = "0.11.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ - "cfg-if 1.0.0", - "instant", + "cfg-if", "libc", "redox_syscall 0.2.13", "smallvec", - "winapi 0.3.9", + "windows-sys 0.45.0", ] +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -[[package]] -name = "pin-project" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9615c18d31137579e9ff063499264ddc1278e7b1982757ebc111028c4d1dc909" -dependencies = [ - "pin-project-internal 0.4.29", -] - -[[package]] -name = "pin-project" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" -dependencies = [ - "pin-project-internal 1.0.10", -] - -[[package]] -name = "pin-project-internal" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "044964427019eed9d49d9d5bbce6047ef18f37100ea400912a9fa4a3523ab12a" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1515,12 +1217,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - [[package]] name = "proc-macro2" version = "1.0.47" @@ -1542,8 +1238,8 @@ dependencies = [ "lazy_static", "num-traits", "quick-error 2.0.1", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax", "rusty-fork", @@ -1572,19 +1268,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -1592,18 +1275,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", ] [[package]] @@ -1613,16 +1286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -1631,16 +1295,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.6", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -1649,7 +1304,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -1687,16 +1342,6 @@ version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" -[[package]] -name = "resolv-conf" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error 1.2.3", -] - [[package]] name = "ring" version = "0.16.20" @@ -1709,7 +1354,7 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1721,7 +1366,7 @@ dependencies = [ "futures", "futures-timer", "rstest_macros", - "rustc_version 0.4.0", + "rustc_version", ] [[package]] @@ -1730,10 +1375,10 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290ca1a1c8ca7edb7c3283bd44dc35dd54fdec6253a3912e201ba1072018fca8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version", "syn", "unicode-ident", ] @@ -1752,22 +1397,13 @@ dependencies = [ "smallvec", ] -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.9", + "semver", ] [[package]] @@ -1850,27 +1486,12 @@ dependencies = [ "untrusted", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - [[package]] name = "semver" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" version = "1.0.147" @@ -1897,7 +1518,7 @@ version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" dependencies = [ - "itoa 1.0.2", + "itoa", "ryu", "serde", ] @@ -1909,39 +1530,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.2", + "itoa", "ryu", "serde", ] [[package]] -name = "sha-1" -version = "0.9.8" +name = "sha1" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ - "block-buffer", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest", - "opaque-debug", ] -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -1965,13 +1569,12 @@ checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "socket2" -version = "0.3.19" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ - "cfg-if 1.0.0", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1980,64 +1583,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version 0.2.3", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "strsim" version = "0.10.0" @@ -2135,7 +1680,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "fastrand", "redox_syscall 0.3.5", "rustix 0.37.4", @@ -2177,15 +1722,6 @@ dependencies = [ "syn", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "time" version = "0.1.43" @@ -2193,45 +1729,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] name = "time" -version = "0.2.27" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", + "itoa", + "serde", + "time-core", "time-macros", - "version_check", - "winapi 0.3.9", ] +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + [[package]] name = "time-macros" -version = "0.1.1" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] - -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn", + "time-core", ] [[package]] @@ -2251,36 +1776,33 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "0.2.25" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" dependencies = [ - "bytes 0.5.6", - "futures-core", - "iovec", - "lazy_static", + "autocfg", + "bytes", "libc", - "memchr", "mio", - "mio-uds", - "pin-project-lite 0.1.12", + "parking_lot", + "pin-project-lite", "signal-hook-registry", - "slab", - "winapi 0.3.9", + "socket2", + "windows-sys 0.45.0", ] [[package]] name = "tokio-util" -version = "0.3.1" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-core", "futures-sink", - "log", - "pin-project-lite 0.1.12", + "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -2298,9 +1820,9 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "log", - "pin-project-lite 0.2.9", + "pin-project-lite", "tracing-core", ] @@ -2313,55 +1835,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project 1.0.10", - "tracing", -] - -[[package]] -name = "trust-dns-proto" -version = "0.19.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cad71a0c0d68ab9941d2fb6e82f8fb2e86d9945b94e1661dd0aaea2b88215a9" -dependencies = [ - "async-trait", - "cfg-if 1.0.0", - "enum-as-inner", - "futures", - "idna", - "lazy_static", - "log", - "rand 0.7.3", - "smallvec", - "thiserror", - "tokio", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.19.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" -dependencies = [ - "cfg-if 0.1.10", - "futures", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "resolv-conf", - "smallvec", - "thiserror", - "tokio", - "trust-dns-proto", -] - [[package]] name = "typenum" version = "1.15.0" @@ -2407,7 +1880,7 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "733b5ad78377302af52c0dbcb2623d78fe50e4b3bf215948ff29e9ee031d8566" dependencies = [ - "base64", + "base64 0.13.0", "flate2", "log", "once_cell", @@ -2435,7 +1908,7 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" dependencies = [ - "getrandom 0.2.6", + "getrandom", "serde", ] @@ -2462,15 +1935,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" @@ -2478,7 +1945,7 @@ version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] @@ -2555,18 +2022,6 @@ dependencies = [ "webpki", ] -[[package]] -name = "widestring" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - [[package]] name = "winapi" version = "0.3.9" @@ -2577,12 +2032,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -2595,7 +2044,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2685,25 +2134,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" -[[package]] -name = "winreg" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "xtask" version = "0.4.1" @@ -2717,3 +2147,33 @@ name = "yansi" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zstd" +version = "0.12.3+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "6.0.5+zstd.1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", +] diff --git a/taskchampion/integration-tests/Cargo.toml b/taskchampion/integration-tests/Cargo.toml index 0f45c926f..ee41d2f51 100644 --- a/taskchampion/integration-tests/Cargo.toml +++ b/taskchampion/integration-tests/Cargo.toml @@ -13,8 +13,8 @@ taskchampion-sync-server = { path = "../sync-server" } [dev-dependencies] anyhow = "1.0" -actix-web = "^3.3.2" -actix-rt = "^1.1.1" +actix-web = "^4.3.1" +actix-rt = "2" tempfile = "3" pretty_assertions = "1" log = "^0.4.17" diff --git a/taskchampion/integration-tests/tests/cross-sync.rs b/taskchampion/integration-tests/tests/cross-sync.rs index 10b3317d2..b13fb5354 100644 --- a/taskchampion/integration-tests/tests/cross-sync.rs +++ b/taskchampion/integration-tests/tests/cross-sync.rs @@ -5,86 +5,93 @@ use taskchampion_sync_server::{storage::InMemoryStorage, Server}; #[actix_rt::test] async fn cross_sync() -> anyhow::Result<()> { - let _ = env_logger::builder() - .is_test(true) - .filter_level(log::LevelFilter::Trace) - .try_init(); + async fn server() -> anyhow::Result { + let _ = env_logger::builder() + .is_test(true) + .filter_level(log::LevelFilter::Trace) + .try_init(); - let server = Server::new(Default::default(), Box::new(InMemoryStorage::new())); - let httpserver = - HttpServer::new(move || App::new().configure(|sc| server.config(sc))).bind("0.0.0.0:0")?; + let server = Server::new(Default::default(), Box::new(InMemoryStorage::new())); + let httpserver = HttpServer::new(move || App::new().configure(|sc| server.config(sc))) + .bind("0.0.0.0:0")?; - // bind was to :0, so the kernel will have selected an unused port - let port = httpserver.addrs()[0].port(); + // bind was to :0, so the kernel will have selected an unused port + let port = httpserver.addrs()[0].port(); + actix_rt::spawn(httpserver.run()); + Ok(port) + } - httpserver.run(); + fn client(port: u16) -> anyhow::Result<()> { + // set up two replicas, and demonstrate replication between them + let mut rep1 = Replica::new(StorageConfig::InMemory.into_storage()?); + let mut rep2 = Replica::new(StorageConfig::InMemory.into_storage()?); - // set up two replicas, and demonstrate replication between them - let mut rep1 = Replica::new(StorageConfig::InMemory.into_storage()?); - let mut rep2 = Replica::new(StorageConfig::InMemory.into_storage()?); + let client_key = Uuid::new_v4(); + let encryption_secret = b"abc123".to_vec(); + let make_server = || { + ServerConfig::Remote { + origin: format!("http://127.0.0.1:{}", port), + client_key, + encryption_secret: encryption_secret.clone(), + } + .into_server() + }; - let client_key = Uuid::new_v4(); - let encryption_secret = b"abc123".to_vec(); - let make_server = || { - ServerConfig::Remote { - origin: format!("http://127.0.0.1:{}", port), - client_key, - encryption_secret: encryption_secret.clone(), - } - .into_server() - }; + let mut serv1 = make_server()?; + let mut serv2 = make_server()?; - let mut serv1 = make_server()?; - let mut serv2 = make_server()?; + // add some tasks on rep1 + let t1 = rep1.new_task(Status::Pending, "test 1".into())?; + let t2 = rep1.new_task(Status::Pending, "test 2".into())?; - // add some tasks on rep1 - let t1 = rep1.new_task(Status::Pending, "test 1".into())?; - let t2 = rep1.new_task(Status::Pending, "test 2".into())?; + // modify t1 + let mut t1 = t1.into_mut(&mut rep1); + t1.start()?; + let t1 = t1.into_immut(); - // modify t1 - let mut t1 = t1.into_mut(&mut rep1); - t1.start()?; - let t1 = t1.into_immut(); + rep1.sync(&mut serv1, false)?; + rep2.sync(&mut serv2, false)?; - rep1.sync(&mut serv1, false)?; - rep2.sync(&mut serv2, false)?; + // those tasks should exist on rep2 now + let t12 = rep2 + .get_task(t1.get_uuid())? + .expect("expected task 1 on rep2"); + let t22 = rep2 + .get_task(t2.get_uuid())? + .expect("expected task 2 on rep2"); - // those tasks should exist on rep2 now - let t12 = rep2 - .get_task(t1.get_uuid())? - .expect("expected task 1 on rep2"); - let t22 = rep2 - .get_task(t2.get_uuid())? - .expect("expected task 2 on rep2"); + assert_eq!(t12.get_description(), "test 1"); + assert_eq!(t12.is_active(), true); + assert_eq!(t22.get_description(), "test 2"); + assert_eq!(t22.is_active(), false); - assert_eq!(t12.get_description(), "test 1"); - assert_eq!(t12.is_active(), true); - assert_eq!(t22.get_description(), "test 2"); - assert_eq!(t22.is_active(), false); + // make non-conflicting changes on the two replicas + let mut t2 = t2.into_mut(&mut rep1); + t2.set_status(Status::Completed)?; + let t2 = t2.into_immut(); - // make non-conflicting changes on the two replicas - let mut t2 = t2.into_mut(&mut rep1); - t2.set_status(Status::Completed)?; - let t2 = t2.into_immut(); + let mut t12 = t12.into_mut(&mut rep2); + t12.set_status(Status::Completed)?; - let mut t12 = t12.into_mut(&mut rep2); - t12.set_status(Status::Completed)?; + // sync those changes back and forth + rep1.sync(&mut serv1, false)?; // rep1 -> server + rep2.sync(&mut serv2, false)?; // server -> rep2, rep2 -> server + rep1.sync(&mut serv1, false)?; // server -> rep1 - // sync those changes back and forth - rep1.sync(&mut serv1, false)?; // rep1 -> server - rep2.sync(&mut serv2, false)?; // server -> rep2, rep2 -> server - rep1.sync(&mut serv1, false)?; // server -> rep1 + let t1 = rep1 + .get_task(t1.get_uuid())? + .expect("expected task 1 on rep1"); + assert_eq!(t1.get_status(), Status::Completed); - let t1 = rep1 - .get_task(t1.get_uuid())? - .expect("expected task 1 on rep1"); - assert_eq!(t1.get_status(), Status::Completed); + let t22 = rep2 + .get_task(t2.get_uuid())? + .expect("expected task 2 on rep2"); + assert_eq!(t22.get_status(), Status::Completed); - let t22 = rep2 - .get_task(t2.get_uuid())? - .expect("expected task 2 on rep2"); - assert_eq!(t22.get_status(), Status::Completed); + Ok(()) + } - // note that we just drop the server here.. + let port = server().await?; + actix_rt::task::spawn_blocking(move || client(port)).await??; Ok(()) } diff --git a/taskchampion/integration-tests/tests/snapshots.rs b/taskchampion/integration-tests/tests/snapshots.rs index dbe889231..c21ba297d 100644 --- a/taskchampion/integration-tests/tests/snapshots.rs +++ b/taskchampion/integration-tests/tests/snapshots.rs @@ -14,81 +14,85 @@ async fn sync_with_snapshots() -> anyhow::Result<()> { .filter_level(log::LevelFilter::Trace) .try_init(); - let sync_server_config = SyncServerConfig { - snapshot_days: 100, - snapshot_versions: 3, - }; - let server = Server::new(sync_server_config, Box::new(InMemoryStorage::new())); - let httpserver = - HttpServer::new(move || App::new().configure(|sc| server.config(sc))).bind("0.0.0.0:0")?; + async fn server() -> anyhow::Result { + let sync_server_config = SyncServerConfig { + snapshot_days: 100, + snapshot_versions: 3, + }; + let server = Server::new(sync_server_config, Box::new(InMemoryStorage::new())); + let httpserver = HttpServer::new(move || App::new().configure(|sc| server.config(sc))) + .bind("0.0.0.0:0")?; - // bind was to :0, so the kernel will have selected an unused port - let port = httpserver.addrs()[0].port(); - - httpserver.run(); - - let client_key = Uuid::new_v4(); - let encryption_secret = b"abc123".to_vec(); - let make_server = || { - ServerConfig::Remote { - origin: format!("http://127.0.0.1:{}", port), - client_key, - encryption_secret: encryption_secret.clone(), - } - .into_server() - }; - - // first we set up a single replica and sync it a lot of times, to establish a sync history. - let mut rep1 = Replica::new(StorageConfig::InMemory.into_storage()?); - let mut serv1 = make_server()?; - - let mut t1 = rep1.new_task(Status::Pending, "test 1".into())?; - log::info!("Applying modifications on replica 1"); - for i in 0..=NUM_VERSIONS { - let mut t1m = t1.into_mut(&mut rep1); - t1m.start()?; - t1m.stop()?; - t1m.set_description(format!("revision {}", i))?; - t1 = t1m.into_immut(); - - rep1.sync(&mut serv1, false)?; + // bind was to :0, so the kernel will have selected an unused port + let port = httpserver.addrs()[0].port(); + actix_rt::spawn(httpserver.run()); + Ok(port) } - // now set up a second replica and sync it; it should catch up on that history, using a - // snapshot. Note that we can't verify that it used a snapshot, because the server currently - // keeps all versions (so rep2 could sync from the beginning of the version history). You can - // manually verify that it is applying a snapshot by adding `assert!(false)` below and skimming - // the logs. + fn client(port: u16) -> anyhow::Result<()> { + let client_key = Uuid::new_v4(); + let encryption_secret = b"abc123".to_vec(); + let make_server = || { + ServerConfig::Remote { + origin: format!("http://127.0.0.1:{}", port), + client_key, + encryption_secret: encryption_secret.clone(), + } + .into_server() + }; - let mut rep2 = Replica::new(StorageConfig::InMemory.into_storage()?); - let mut serv2 = make_server()?; + // first we set up a single replica and sync it a lot of times, to establish a sync history. + let mut rep1 = Replica::new(StorageConfig::InMemory.into_storage()?); + let mut serv1 = make_server()?; - log::info!("Syncing replica 2"); - rep2.sync(&mut serv2, false)?; + let mut t1 = rep1.new_task(Status::Pending, "test 1".into())?; + log::info!("Applying modifications on replica 1"); + for i in 0..=NUM_VERSIONS { + let mut t1m = t1.into_mut(&mut rep1); + t1m.start()?; + t1m.stop()?; + t1m.set_description(format!("revision {}", i))?; + t1 = t1m.into_immut(); - // those tasks should exist on rep2 now - let t12 = rep2 - .get_task(t1.get_uuid())? - .expect("expected task 1 on rep2"); + rep1.sync(&mut serv1, false)?; + } - assert_eq!(t12.get_description(), format!("revision {}", NUM_VERSIONS)); - assert_eq!(t12.is_active(), false); + // now set up a second replica and sync it; it should catch up on that history, using a + // snapshot. Note that we can't verify that it used a snapshot, because the server + // currently keeps all versions (so rep2 could sync from the beginning of the version + // history). You can manually verify that it is applying a snapshot by adding + // `assert!(false)` below and skimming the logs. - // sync that back to replica 1 - t12.into_mut(&mut rep2) - .set_description("sync-back".to_owned())?; - rep2.sync(&mut serv2, false)?; - rep1.sync(&mut serv1, false)?; + let mut rep2 = Replica::new(StorageConfig::InMemory.into_storage()?); + let mut serv2 = make_server()?; - let t11 = rep1 - .get_task(t1.get_uuid())? - .expect("expected task 1 on rep1"); + log::info!("Syncing replica 2"); + rep2.sync(&mut serv2, false)?; - assert_eq!(t11.get_description(), "sync-back"); + // those tasks should exist on rep2 now + let t12 = rep2 + .get_task(t1.get_uuid())? + .expect("expected task 1 on rep2"); - // uncomment this to force a failure and see the logs - // assert!(false); + assert_eq!(t12.get_description(), format!("revision {}", NUM_VERSIONS)); + assert_eq!(t12.is_active(), false); - // note that we just drop the server here.. + // sync that back to replica 1 + t12.into_mut(&mut rep2) + .set_description("sync-back".to_owned())?; + rep2.sync(&mut serv2, false)?; + rep1.sync(&mut serv1, false)?; + + let t11 = rep1 + .get_task(t1.get_uuid())? + .expect("expected task 1 on rep1"); + + assert_eq!(t11.get_description(), "sync-back"); + + Ok(()) + } + + let port = server().await?; + actix_rt::task::spawn_blocking(move || client(port)).await??; Ok(()) } diff --git a/taskchampion/sync-server/Cargo.toml b/taskchampion/sync-server/Cargo.toml index 56da321a4..1c76b09e5 100644 --- a/taskchampion/sync-server/Cargo.toml +++ b/taskchampion/sync-server/Cargo.toml @@ -9,7 +9,7 @@ publish = false [dependencies] uuid = { version = "^1.3.0", features = ["serde", "v4"] } -actix-web = "^3.3.2" +actix-web = "^4.3.1" anyhow = "1.0" thiserror = "1.0" futures = "^0.3.25" @@ -22,6 +22,6 @@ rusqlite = { version = "0.29", features = ["bundled"] } chrono = { version = "^0.4.22", features = ["serde"] } [dev-dependencies] -actix-rt = "^1.1.1" +actix-rt = "2" tempfile = "3" pretty_assertions = "1" diff --git a/taskchampion/sync-server/src/api/add_snapshot.rs b/taskchampion/sync-server/src/api/add_snapshot.rs index 5c47b6c38..da1443c73 100644 --- a/taskchampion/sync-server/src/api/add_snapshot.rs +++ b/taskchampion/sync-server/src/api/add_snapshot.rs @@ -19,9 +19,11 @@ const MAX_SIZE: usize = 100 * 1024 * 1024; pub(crate) async fn service( req: HttpRequest, server_state: web::Data>, - web::Path((version_id,)): web::Path<(VersionId,)>, + path: web::Path, mut payload: web::Payload, ) -> Result { + let version_id = path.into_inner(); + // check content-type if req.content_type() != SNAPSHOT_CONTENT_TYPE { return Err(error::ErrorBadRequest("Bad content-type")); @@ -100,8 +102,8 @@ mod test { let uri = format!("/v1/client/add-snapshot/{}", version_id); let req = test::TestRequest::post() .uri(&uri) - .header("Content-Type", "application/vnd.taskchampion.snapshot") - .header("X-Client-Key", client_key.to_string()) + .insert_header(("Content-Type", "application/vnd.taskchampion.snapshot")) + .insert_header(("X-Client-Key", client_key.to_string())) .set_payload(b"abcd".to_vec()) .to_request(); let resp = test::call_service(&mut app, req).await; @@ -111,14 +113,14 @@ mod test { let uri = "/v1/client/snapshot"; let req = test::TestRequest::get() .uri(uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); - let mut resp = test::call_service(&mut app, req).await; + let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::OK); - use futures::StreamExt; - let (bytes, _) = resp.take_body().into_future().await; - assert_eq!(bytes.unwrap().unwrap().as_ref(), b"abcd"); + use actix_web::body::MessageBody; + let bytes = resp.into_body().try_into_bytes().unwrap(); + assert_eq!(bytes.as_ref(), b"abcd"); Ok(()) } @@ -143,8 +145,8 @@ mod test { let uri = format!("/v1/client/add-snapshot/{}", version_id); let req = test::TestRequest::post() .uri(&uri) - .header("Content-Type", "application/vnd.taskchampion.snapshot") - .header("X-Client-Key", client_key.to_string()) + .append_header(("Content-Type", "application/vnd.taskchampion.snapshot")) + .append_header(("X-Client-Key", client_key.to_string())) .set_payload(b"abcd".to_vec()) .to_request(); let resp = test::call_service(&mut app, req).await; @@ -154,7 +156,7 @@ mod test { let uri = "/v1/client/snapshot"; let req = test::TestRequest::get() .uri(uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::NOT_FOUND); @@ -172,8 +174,8 @@ mod test { let uri = format!("/v1/client/add-snapshot/{}", version_id); let req = test::TestRequest::post() .uri(&uri) - .header("Content-Type", "not/correct") - .header("X-Client-Key", client_key.to_string()) + .append_header(("Content-Type", "not/correct")) + .append_header(("X-Client-Key", client_key.to_string())) .set_payload(b"abcd".to_vec()) .to_request(); let resp = test::call_service(&mut app, req).await; @@ -192,11 +194,11 @@ mod test { let uri = format!("/v1/client/add-snapshot/{}", version_id); let req = test::TestRequest::post() .uri(&uri) - .header( + .append_header(( "Content-Type", "application/vnd.taskchampion.history-segment", - ) - .header("X-Client-Key", client_key.to_string()) + )) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::BAD_REQUEST); diff --git a/taskchampion/sync-server/src/api/add_version.rs b/taskchampion/sync-server/src/api/add_version.rs index ecf8a18dc..157fbd779 100644 --- a/taskchampion/sync-server/src/api/add_version.rs +++ b/taskchampion/sync-server/src/api/add_version.rs @@ -27,9 +27,11 @@ const MAX_SIZE: usize = 100 * 1024 * 1024; pub(crate) async fn service( req: HttpRequest, server_state: web::Data>, - web::Path((parent_version_id,)): web::Path<(VersionId,)>, + path: web::Path, mut payload: web::Payload, ) -> Result { + let parent_version_id = path.into_inner(); + // check content-type if req.content_type() != HISTORY_SEGMENT_CONTENT_TYPE { return Err(error::ErrorBadRequest("Bad content-type")); @@ -80,21 +82,21 @@ pub(crate) async fn service( Ok(match result { AddVersionResult::Ok(version_id) => { let mut rb = HttpResponse::Ok(); - rb.header(VERSION_ID_HEADER, version_id.to_string()); + rb.append_header((VERSION_ID_HEADER, version_id.to_string())); match snap_urgency { SnapshotUrgency::None => {} SnapshotUrgency::Low => { - rb.header(SNAPSHOT_REQUEST_HEADER, "urgency=low"); + rb.append_header((SNAPSHOT_REQUEST_HEADER, "urgency=low")); } SnapshotUrgency::High => { - rb.header(SNAPSHOT_REQUEST_HEADER, "urgency=high"); + rb.append_header((SNAPSHOT_REQUEST_HEADER, "urgency=high")); } }; rb.finish() } AddVersionResult::ExpectedParentVersion(parent_version_id) => { let mut rb = HttpResponse::Conflict(); - rb.header(PARENT_VERSION_ID_HEADER, parent_version_id.to_string()); + rb.append_header((PARENT_VERSION_ID_HEADER, parent_version_id.to_string())); rb.finish() } }) @@ -128,11 +130,11 @@ mod test { let uri = format!("/v1/client/add-version/{}", parent_version_id); let req = test::TestRequest::post() .uri(&uri) - .header( + .append_header(( "Content-Type", "application/vnd.taskchampion.history-segment", - ) - .header("X-Client-Key", client_key.to_string()) + )) + .append_header(("X-Client-Key", client_key.to_string())) .set_payload(b"abcd".to_vec()) .to_request(); let resp = test::call_service(&mut app, req).await; @@ -170,11 +172,11 @@ mod test { let uri = format!("/v1/client/add-version/{}", parent_version_id); let req = test::TestRequest::post() .uri(&uri) - .header( + .append_header(( "Content-Type", "application/vnd.taskchampion.history-segment", - ) - .header("X-Client-Key", client_key.to_string()) + )) + .append_header(("X-Client-Key", client_key.to_string())) .set_payload(b"abcd".to_vec()) .to_request(); let resp = test::call_service(&mut app, req).await; @@ -198,8 +200,8 @@ mod test { let uri = format!("/v1/client/add-version/{}", parent_version_id); let req = test::TestRequest::post() .uri(&uri) - .header("Content-Type", "not/correct") - .header("X-Client-Key", client_key.to_string()) + .append_header(("Content-Type", "not/correct")) + .append_header(("X-Client-Key", client_key.to_string())) .set_payload(b"abcd".to_vec()) .to_request(); let resp = test::call_service(&mut app, req).await; @@ -218,11 +220,11 @@ mod test { let uri = format!("/v1/client/add-version/{}", parent_version_id); let req = test::TestRequest::post() .uri(&uri) - .header( + .append_header(( "Content-Type", "application/vnd.taskchampion.history-segment", - ) - .header("X-Client-Key", client_key.to_string()) + )) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::BAD_REQUEST); diff --git a/taskchampion/sync-server/src/api/get_child_version.rs b/taskchampion/sync-server/src/api/get_child_version.rs index 2c2f6651e..2ec4399bf 100644 --- a/taskchampion/sync-server/src/api/get_child_version.rs +++ b/taskchampion/sync-server/src/api/get_child_version.rs @@ -18,8 +18,10 @@ use std::sync::Arc; pub(crate) async fn service( req: HttpRequest, server_state: web::Data>, - web::Path((parent_version_id,)): web::Path<(VersionId,)>, + path: web::Path, ) -> Result { + let parent_version_id = path.into_inner(); + let mut txn = server_state.storage.txn().map_err(failure_to_ise)?; let client_key = client_key_header(&req)?; @@ -44,8 +46,8 @@ pub(crate) async fn service( history_segment, } => Ok(HttpResponse::Ok() .content_type(HISTORY_SEGMENT_CONTENT_TYPE) - .header(VERSION_ID_HEADER, version_id.to_string()) - .header(PARENT_VERSION_ID_HEADER, parent_version_id.to_string()) + .append_header((VERSION_ID_HEADER, version_id.to_string())) + .append_header((PARENT_VERSION_ID_HEADER, parent_version_id.to_string())) .body(history_segment)), GetVersionResult::NotFound => Err(error::ErrorNotFound("no such version")), GetVersionResult::Gone => Err(error::ErrorGone("version has been deleted")), @@ -83,9 +85,9 @@ mod test { let uri = format!("/v1/client/get-child-version/{}", parent_version_id); let req = test::TestRequest::get() .uri(&uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); - let mut resp = test::call_service(&mut app, req).await; + let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::OK); assert_eq!( resp.headers().get("X-Version-Id").unwrap(), @@ -100,9 +102,9 @@ mod test { &"application/vnd.taskchampion.history-segment".to_string() ); - use futures::StreamExt; - let (bytes, _) = resp.take_body().into_future().await; - assert_eq!(bytes.unwrap().unwrap().as_ref(), b"abcd"); + use actix_web::body::MessageBody; + let bytes = resp.into_body().try_into_bytes().unwrap(); + assert_eq!(bytes.as_ref(), b"abcd"); } #[actix_rt::test] @@ -117,7 +119,7 @@ mod test { let uri = format!("/v1/client/get-child-version/{}", parent_version_id); let req = test::TestRequest::get() .uri(&uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::NOT_FOUND); @@ -144,7 +146,7 @@ mod test { let uri = format!("/v1/client/get-child-version/{}", parent_version_id); let req = test::TestRequest::get() .uri(&uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::GONE); @@ -157,7 +159,7 @@ mod test { let uri = format!("/v1/client/get-child-version/{}", NIL_VERSION_ID); let req = test::TestRequest::get() .uri(&uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::NOT_FOUND); diff --git a/taskchampion/sync-server/src/api/get_snapshot.rs b/taskchampion/sync-server/src/api/get_snapshot.rs index cf76655c8..633d499bd 100644 --- a/taskchampion/sync-server/src/api/get_snapshot.rs +++ b/taskchampion/sync-server/src/api/get_snapshot.rs @@ -32,7 +32,7 @@ pub(crate) async fn service( { Ok(HttpResponse::Ok() .content_type(SNAPSHOT_CONTENT_TYPE) - .header(VERSION_ID_HEADER, version_id.to_string()) + .append_header((VERSION_ID_HEADER, version_id.to_string())) .body(data)) } else { Err(error::ErrorNotFound("no snapshot")) @@ -66,7 +66,7 @@ mod test { let uri = "/v1/client/snapshot"; let req = test::TestRequest::get() .uri(uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::NOT_FOUND); @@ -102,13 +102,13 @@ mod test { let uri = "/v1/client/snapshot"; let req = test::TestRequest::get() .uri(uri) - .header("X-Client-Key", client_key.to_string()) + .append_header(("X-Client-Key", client_key.to_string())) .to_request(); - let mut resp = test::call_service(&mut app, req).await; + let resp = test::call_service(&mut app, req).await; assert_eq!(resp.status(), StatusCode::OK); - use futures::StreamExt; - let (bytes, _) = resp.take_body().into_future().await; - assert_eq!(bytes.unwrap().unwrap().as_ref(), snapshot_data); + use actix_web::body::MessageBody; + let bytes = resp.into_body().try_into_bytes().unwrap(); + assert_eq!(bytes.as_ref(), snapshot_data); } } diff --git a/taskchampion/sync-server/src/lib.rs b/taskchampion/sync-server/src/lib.rs index 0ce33dbfe..5ba4658b1 100644 --- a/taskchampion/sync-server/src/lib.rs +++ b/taskchampion/sync-server/src/lib.rs @@ -34,10 +34,9 @@ impl Server { pub fn config(&self, cfg: &mut web::ServiceConfig) { cfg.service( web::scope("") - .data(self.server_state.clone()) + .app_data(web::Data::new(self.server_state.clone())) .wrap( - middleware::DefaultHeaders::new() - .header("Cache-Control", "no-store, max-age=0"), + middleware::DefaultHeaders::new().add(("Cache-Control", "no-store, max-age=0")), ) .service(index) .service(api_scope()),