From 87d6fe27ce21533dead7903d963e485f49e324a2 Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Fri, 25 Jun 2021 13:47:51 +0100 Subject: [PATCH] Initial commit --- .gitignore | 1 + Cargo.lock | 1403 +++++++++++++++++ Cargo.toml | 25 + crates/librqbit/Cargo.toml | 33 + .../ubuntu-21.04-desktop-amd64.iso.torrent | Bin 0 -> 215416 bytes ...ubuntu-21.04-live-server-amd64.iso.torrent | Bin 0 -> 89959 bytes crates/librqbit/src/buffers.rs | 112 ++ crates/librqbit/src/chunk_tracker.rs | 71 + crates/librqbit/src/clone_to_owned.rs | 27 + crates/librqbit/src/constants.rs | 1 + crates/librqbit/src/lengths.rs | 268 ++++ crates/librqbit/src/lib.rs | 12 + crates/librqbit/src/peer_comms.rs | 454 ++++++ crates/librqbit/src/peer_id.rs | 45 + crates/librqbit/src/serde_bencode.rs | 663 ++++++++ crates/librqbit/src/torrent_manager.rs | 1112 +++++++++++++ crates/librqbit/src/torrent_metainfo.rs | 253 +++ crates/librqbit/src/tracker_comms.rs | 228 +++ crates/librqbit/src/type_aliases.rs | 1 + src/main.rs | 71 + 20 files changed, 4780 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 crates/librqbit/Cargo.toml create mode 100644 crates/librqbit/resources/ubuntu-21.04-desktop-amd64.iso.torrent create mode 100644 crates/librqbit/resources/ubuntu-21.04-live-server-amd64.iso.torrent create mode 100644 crates/librqbit/src/buffers.rs create mode 100644 crates/librqbit/src/chunk_tracker.rs create mode 100644 crates/librqbit/src/clone_to_owned.rs create mode 100644 crates/librqbit/src/constants.rs create mode 100644 crates/librqbit/src/lengths.rs create mode 100644 crates/librqbit/src/lib.rs create mode 100644 crates/librqbit/src/peer_comms.rs create mode 100644 crates/librqbit/src/peer_id.rs create mode 100644 crates/librqbit/src/serde_bencode.rs create mode 100644 crates/librqbit/src/torrent_manager.rs create mode 100644 crates/librqbit/src/torrent_metainfo.rs create mode 100644 crates/librqbit/src/tracker_comms.rs create mode 100644 crates/librqbit/src/type_aliases.rs create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..992e9c1 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1403 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "bitvec" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" + +[[package]] +name = "cc" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "3.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "indexmap", + "lazy_static", + "os_str_bytes", + "strsim", + "termcolor", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap_derive" +version = "3.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "core-foundation" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" + +[[package]] +name = "encoding_rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "funty" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e" + +[[package]] +name = "futures" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" + +[[package]] +name = "futures-executor" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" + +[[package]] +name = "futures-macro" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121" +dependencies = [ + "autocfg", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" + +[[package]] +name = "futures-task" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" + +[[package]] +name = "futures-util" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" +dependencies = [ + "autocfg", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "h2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" + +[[package]] +name = "httpdate" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "hyper" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07d6baa1b441335f3ce5098ac421fb6547c46dda735ca1bc6d0153c838f9dd83" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" + +[[package]] +name = "librqbit" +version = "0.1.0" +dependencies = [ + "anyhow", + "bincode", + "bitvec", + "byteorder", + "futures", + "log", + "parking_lot", + "reqwest", + "serde", + "sha1", + "tokio", + "urlencoding", + "uuid", +] + +[[package]] +name = "lock_api" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mio" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "native-tls" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "openssl" +version = "0.10.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "549430950c79ae24e6d02e0b7404534ecf311d94cc9f861e9e4020187d13d885" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" + +[[package]] +name = "openssl-sys" +version = "0.9.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "os_str_bytes" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" + +[[package]] +name = "parking_lot" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project-lite" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "pretty_env_logger" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +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 = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rqbit" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "futures", + "librqbit", + "log", + "pretty_env_logger", + "reqwest", + "tokio", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "security-framework" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" + +[[package]] +name = "slab" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" + +[[package]] +name = "smallvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "socket2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "tinyvec" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fb2ed024293bb19f7a5dc54fe83bf86532a44c12a2bb8ba40d64a4509395ca2" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "pin-project-lite", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c49e3df43841dafb86046472506755d8501c5615673955f6aa17181125d13c37" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "unicode-bidi" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a1f0175e03a0973cf4afd476bef05c26e228520400eb1fd473ad417b1c00ffb" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + +[[package]] +name = "web-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "wyz" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188" +dependencies = [ + "tap", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d10cb58 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "rqbit" +version = "0.1.0" +authors = ["Igor Katson "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +librqbit = {path="./crates/librqbit"} +tokio = {version = "1", features = ["macros", "rt-multi-thread"]} +anyhow = "1" +clap = "3.0.0-beta.2" +log = "0.4" +pretty_env_logger = "0.4" +reqwest = "0.11" + +[dev-dependencies] +futures = {version = "0.3"} + +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" \ No newline at end of file diff --git a/crates/librqbit/Cargo.toml b/crates/librqbit/Cargo.toml new file mode 100644 index 0000000..4ef96de --- /dev/null +++ b/crates/librqbit/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "librqbit" +version = "0.1.0" +authors = ["Igor Katson "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +tokio = {version = "1", features = ["macros", "rt-multi-thread"]} +serde = {version = "1", features=["derive"]} +anyhow = "1" +sha1 = "0.6" +reqwest = "0.11" +urlencoding = "1" +byteorder = "1" +bincode = "1" +bitvec = "0.22" +parking_lot = "0.11" +log = "0.4" + +uuid = {version = "0.8", features = ["v4"]} +futures = "0.3" + +[dev-dependencies] +futures = {version = "0.3"} +pretty_env_logger = "0.4" + +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" \ No newline at end of file diff --git a/crates/librqbit/resources/ubuntu-21.04-desktop-amd64.iso.torrent b/crates/librqbit/resources/ubuntu-21.04-desktop-amd64.iso.torrent new file mode 100644 index 0000000000000000000000000000000000000000..ba26dc9e895ea563ef56ddc10926239bae6dd0a2 GIT binary patch literal 215416 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

3`@!P(dt6f7n%LI)y#Y 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

f-XHW{|djq@0hqKV4WxSdm+(>e?@GV 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 F{{V}2zES`H literal 0 HcmV?d00001 diff --git a/crates/librqbit/src/buffers.rs b/crates/librqbit/src/buffers.rs new file mode 100644 index 0000000..1ffa1a4 --- /dev/null +++ b/crates/librqbit/src/buffers.rs @@ -0,0 +1,112 @@ +use serde::Deserialize; + +use crate::clone_to_owned::CloneToOwned; + +#[derive(PartialEq, Eq, Hash, Clone)] +pub struct ByteString(pub Vec); + +impl std::fmt::Debug for ByteString { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if self.0.iter().all(|b| *b == 0) { + return write!(f, "<{} bytes, all zeroes>", self.0.len()); + } + match std::str::from_utf8(self.0.as_slice()) { + Ok(bytes) => bytes.fmt(f), + Err(_e) => write!(f, "<{} bytes>", self.0.len()), + } + } +} + +#[derive(Deserialize, PartialEq, Eq, Hash, Clone)] +#[serde(transparent)] +pub struct ByteBuf<'a>(pub &'a [u8]); + +impl<'a> ByteBuf<'a> { + pub fn as_bytes(&'a self) -> &'a [u8] { + self.0 + } +} + +fn debug_raw_bytes(b: &[u8], f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "<{} bytes>", b.len()) +} + +impl<'a> std::fmt::Debug for ByteBuf<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if self.0.iter().all(|b| *b == 0) { + return write!(f, "<{} bytes, all zeroes>", self.0.len()); + } + match std::str::from_utf8(self.0) { + Ok(bytes) => bytes.fmt(f), + Err(_e) => debug_raw_bytes(&self.0, f), + } + } +} + +impl<'a> std::fmt::Display for ByteBuf<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if self.0.iter().all(|b| *b == 0) { + return write!(f, "<{} bytes, all zeroes>", self.0.len()); + } + match std::str::from_utf8(self.0) { + Ok(bytes) => f.write_str(bytes), + Err(_e) => debug_raw_bytes(&self.0, f), + } + } +} + +impl<'a> CloneToOwned for ByteBuf<'a> { + type Target = ByteString; + + fn clone_to_owned(&self) -> Self::Target { + ByteString(self.0.into()) + } +} + +impl CloneToOwned for ByteString { + type Target = ByteString; + + fn clone_to_owned(&self) -> Self::Target { + self.clone() + } +} + +impl<'a> std::convert::AsRef<[u8]> for ByteBuf<'a> { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl std::convert::AsRef<[u8]> for ByteString { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl<'a> std::ops::Deref for ByteBuf<'a> { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl std::ops::Deref for ByteString { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'a> From<&'a [u8]> for ByteBuf<'a> { + fn from(b: &'a [u8]) -> Self { + Self(b) + } +} + +impl<'a> From<&'a [u8]> for ByteString { + fn from(b: &'a [u8]) -> Self { + Self(b.into()) + } +} diff --git a/crates/librqbit/src/chunk_tracker.rs b/crates/librqbit/src/chunk_tracker.rs new file mode 100644 index 0000000..24e47a7 --- /dev/null +++ b/crates/librqbit/src/chunk_tracker.rs @@ -0,0 +1,71 @@ +use log::{debug, info}; + +use crate::{ + buffers::ByteString, + lengths::{Lengths, ValidPieceIndex}, + peer_comms::Piece, + type_aliases::BF, +}; + +pub struct ChunkTracker { + needed_pieces: BF, + chunk_status: BF, + lengths: Lengths, +} + +fn compute_chunk_status(lengths: &Lengths, needed_pieces: &BF) -> BF { + let required_bits = lengths.total_chunks(); + let required_size = (required_bits as usize + 1) / 8; + let vec = vec![0u8; required_size]; + let mut chunk_bf = BF::from_vec(vec); + for bit in needed_pieces.iter_zeros() { + let offset = bit * 8; + for i in 0..8 { + chunk_bf.set(offset + i, true); + } + } + chunk_bf +} + +impl ChunkTracker { + pub fn new(needed_pieces: BF, lengths: Lengths) -> Self { + Self { + chunk_status: compute_chunk_status(&lengths, &needed_pieces), + needed_pieces, + lengths, + } + } + pub fn get_needed_pieces(&self) -> &BF { + &self.needed_pieces + } + pub fn reserve_needed_piece(&mut self, index: ValidPieceIndex) { + self.needed_pieces.set(index.get() as usize, false) + } + pub fn mark_piece_needed(&mut self, index: ValidPieceIndex) -> bool { + info!("remarking piece={} as needed", index); + self.needed_pieces.set(index.get() as usize, true); + self.chunk_status + .get_mut(self.lengths.chunk_range(index)) + .map(|s| { + s.set_all(false); + true + }) + .unwrap_or_default() + } + + // return true if the whole piece is marked downloaded + pub fn mark_chunk_downloaded(&mut self, piece: &Piece) -> Option { + let chunk_info = self.lengths.chunk_info_from_received_piece_data(piece)?; + self.chunk_status + .set(chunk_info.absolute_index as usize, true); + let chunk_range = self.lengths.chunk_range(chunk_info.piece_index); + let chunk_range = self.chunk_status.get(chunk_range).unwrap(); + let all = chunk_range.all(); + + debug!( + "piece={}, chunk_info={:?}, bits={:?}", + piece.index, chunk_info, chunk_range, + ); + Some(all) + } +} diff --git a/crates/librqbit/src/clone_to_owned.rs b/crates/librqbit/src/clone_to_owned.rs new file mode 100644 index 0000000..36b76c2 --- /dev/null +++ b/crates/librqbit/src/clone_to_owned.rs @@ -0,0 +1,27 @@ +pub trait CloneToOwned { + type Target; + + fn clone_to_owned(&self) -> Self::Target; +} + +impl CloneToOwned for Option +where + T: CloneToOwned, +{ + type Target = Option<::Target>; + + fn clone_to_owned(&self) -> Self::Target { + self.as_ref().map(|i| i.clone_to_owned()) + } +} + +impl CloneToOwned for Vec +where + T: CloneToOwned, +{ + type Target = Vec<::Target>; + + fn clone_to_owned(&self) -> Self::Target { + self.iter().map(|i| i.clone_to_owned()).collect() + } +} diff --git a/crates/librqbit/src/constants.rs b/crates/librqbit/src/constants.rs new file mode 100644 index 0000000..e0ad7b2 --- /dev/null +++ b/crates/librqbit/src/constants.rs @@ -0,0 +1 @@ +pub const CHUNK_SIZE: u32 = 16384; diff --git a/crates/librqbit/src/lengths.rs b/crates/librqbit/src/lengths.rs new file mode 100644 index 0000000..3e7c8dd --- /dev/null +++ b/crates/librqbit/src/lengths.rs @@ -0,0 +1,268 @@ +use crate::{buffers::ByteString, constants::CHUNK_SIZE, peer_comms::Piece}; + +const fn is_power_of_two(x: u64) -> bool { + (x != 0) && ((x & (x - 1)) == 0) +} + +pub const fn ceil_div_u64(a: u64, b: u64) -> u64 { + (a + b - 1) / b +} + +pub const fn last_element_size_u64(total: u64, chunk_size: u64) -> u64 { + let rem = total % chunk_size; + if rem == 0 { + return chunk_size; + } + rem +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ChunkInfo { + pub piece_index: ValidPieceIndex, + pub chunk_index: u32, + pub absolute_index: u32, + pub size: u32, + pub offset: u32, +} + +#[derive(Debug, Clone, Copy)] +pub struct Lengths { + chunk_length: u32, + total_length: u64, + piece_length: u32, + last_piece_id: u32, + last_piece_length: u32, + chunks_per_piece: u32, +} + +#[derive(Clone, Copy, PartialEq, Eq, Hash)] +pub struct ValidPieceIndex(u32); +impl std::fmt::Display for ValidPieceIndex { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} +impl std::fmt::Debug for ValidPieceIndex { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } +} + +impl ValidPieceIndex { + pub fn get(&self) -> u32 { + self.0 + } +} + +impl Lengths { + pub fn new( + total_length: u64, + piece_length: u32, + chunk_length: Option, + ) -> anyhow::Result { + let chunk_length = chunk_length.unwrap_or(CHUNK_SIZE); + if !(is_power_of_two(piece_length as u64)) { + anyhow::bail!("piece length {} is not a power of 2", piece_length); + } + if !(is_power_of_two(chunk_length as u64)) { + anyhow::bail!("chunk length {} is not a power of 2", chunk_length); + } + if chunk_length >= piece_length { + anyhow::bail!( + "chunk length {} should be smaller than pice length {}", + chunk_length, + piece_length + ); + } + Ok(Self { + chunk_length, + piece_length, + total_length, + chunks_per_piece: piece_length / chunk_length, + last_piece_id: ((total_length + 1) / piece_length as u64) as u32, + last_piece_length: last_element_size_u64(total_length, piece_length as u64) as u32, + }) + } + pub const fn piece_bitfield_bytes(&self) -> usize { + ceil_div_u64(self.total_pieces() as u64, 8) as usize + } + pub const fn total_length(&self) -> u64 { + self.total_length + } + pub const fn validate_piece_index(&self, index: u32) -> Option { + if index > self.last_piece_id { + return None; + } + Some(ValidPieceIndex(index)) + } + pub const fn default_piece_length(&self) -> u32 { + self.piece_length + } + pub const fn default_chunk_length(&self) -> u32 { + self.chunk_length + } + pub const fn total_chunks(&self) -> u32 { + ceil_div_u64(self.total_length, self.chunk_length as u64) as u32 + } + pub const fn total_pieces(&self) -> u32 { + self.last_piece_id + 1 + } + pub const fn piece_length(&self, index: ValidPieceIndex) -> u32 { + if index.0 == self.last_piece_id { + return self.last_piece_length; + } + self.piece_length + } + pub const fn piece_offset(&self, index: ValidPieceIndex) -> u64 { + index.0 as u64 * self.piece_length as u64 + } + pub fn iter_chunk_infos(&self, index: ValidPieceIndex) -> impl Iterator { + let mut remaining = self.piece_length(index); + let chunk_size = self.chunk_length; + let absolute_offset = index.0 * self.chunks_per_piece; + (0u32..).scan(0, move |offset, idx| { + if remaining == 0 { + return None; + } + let s = std::cmp::min(remaining, chunk_size); + let result = ChunkInfo { + piece_index: index, + chunk_index: idx, + absolute_index: absolute_offset + idx, + size: s, + offset: *offset, + }; + *offset += s; + remaining -= s; + Some(result) + }) + } + + pub fn chunk_info_from_received_piece_data( + &self, + piece: &Piece, + ) -> Option { + let piece_index = self.validate_piece_index(piece.index)?; + let index = piece.begin / self.chunk_length; + let chunk_size = self.chunk_size(piece_index, index)?; + let offset = self.chunk_offset_in_piece(piece_index, index)?; + if offset != piece.begin { + return None; + } + if chunk_size as usize != piece.block.len() { + return None; + } + let absolute_index = self.chunks_per_piece * piece_index.get() + index; + Some(ChunkInfo { + piece_index, + chunk_index: index, + size: chunk_size, + offset, + absolute_index, + }) + } + pub const fn chunk_range(&self, index: ValidPieceIndex) -> std::ops::Range { + let start = index.0 * self.chunks_per_piece; + let end = start + self.chunks_per_piece(index); + start as usize..end as usize + } + pub const fn chunks_per_piece(&self, index: ValidPieceIndex) -> u32 { + if index.0 == self.last_piece_id { + return (self.last_piece_length + self.chunk_length - 1) / self.chunk_length; + } + self.chunks_per_piece + } + pub const fn chunk_offset_in_piece( + &self, + piece_index: ValidPieceIndex, + chunk_index: u32, + ) -> Option { + if chunk_index >= self.chunks_per_piece(piece_index) { + return None; + } + Some(chunk_index * self.chunk_length) + } + pub fn chunk_size(&self, piece_index: ValidPieceIndex, chunk_index: u32) -> Option { + let chunks_per_piece = self.chunks_per_piece(piece_index); + let pl = self.piece_length(piece_index); + if chunk_index >= chunks_per_piece { + return None; + } + let offset = chunk_index * self.chunk_length; + Some(std::cmp::min(self.chunk_length, pl - offset)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn make_lengths() -> Lengths { + Lengths::new(1174243328, 262144, None).unwrap() + } + + #[test] + fn test_total_pieces() { + let l = make_lengths(); + assert_eq!(l.total_pieces(), 4480); + } + + #[test] + fn test_piece_length() { + let l = make_lengths(); + let p = l.validate_piece_index(4479).unwrap(); + + assert_eq!(l.piece_length(l.validate_piece_index(0).unwrap()), 262144); + assert_eq!(l.piece_length(p), 100352); + } + + #[test] + fn test_chunks_in_piece() { + let l = make_lengths(); + let p = l.validate_piece_index(4479).unwrap(); + + assert_eq!(l.chunks_per_piece(l.validate_piece_index(0).unwrap()), 16); + assert_eq!(l.chunks_per_piece(p), 7); + } + + #[test] + fn test_chunk_size() { + let l = make_lengths(); + let p = l.validate_piece_index(4479).unwrap(); + + assert_eq!(l.chunk_size(p, 0), Some(16384)); + assert_eq!(l.chunk_size(p, 6), Some(2048)); + } + + #[test] + fn test_chunk_infos() { + let l = make_lengths(); + let p = l.validate_piece_index(4479).unwrap(); + + let mut it = l.iter_chunk_infos(p); + let first = it.next().unwrap(); + let last = it.last().unwrap(); + + assert_eq!( + first, + ChunkInfo { + piece_index: p, + chunk_index: 0, + absolute_index: 71664, + size: 16384, + offset: 0, + } + ); + + assert_eq!( + last, + ChunkInfo { + piece_index: p, + chunk_index: 6, + absolute_index: 71670, + size: 2048, + offset: 98304, + } + ); + } +} diff --git a/crates/librqbit/src/lib.rs b/crates/librqbit/src/lib.rs new file mode 100644 index 0000000..1267243 --- /dev/null +++ b/crates/librqbit/src/lib.rs @@ -0,0 +1,12 @@ +pub mod buffers; +pub mod chunk_tracker; +pub mod clone_to_owned; +pub mod constants; +pub mod lengths; +pub mod peer_comms; +pub mod peer_id; +pub mod serde_bencode; +pub mod torrent_manager; +pub mod torrent_metainfo; +pub mod tracker_comms; +pub mod type_aliases; diff --git a/crates/librqbit/src/peer_comms.rs b/crates/librqbit/src/peer_comms.rs new file mode 100644 index 0000000..bde0409 --- /dev/null +++ b/crates/librqbit/src/peer_comms.rs @@ -0,0 +1,454 @@ +use bincode::Options; +use byteorder::ByteOrder; +use serde::{Deserialize, Serialize}; + +use crate::{ + buffers::{ByteBuf, ByteString}, + clone_to_owned::CloneToOwned, +}; + +const PREAMBLE_LEN: usize = 5; +const NO_PAYLOAD_MSG_LEN: usize = PREAMBLE_LEN; + +const PSTR_BT1: &str = "BitTorrent protocol"; + +const LEN_PREFIX_KEEPALIVE: u32 = 0; +const LEN_PREFIX_CHOKE: u32 = 1; +const LEN_PREFIX_UNCHOKE: u32 = 1; +const LEN_PREFIX_INTERESTED: u32 = 1; +const LEN_PREFIX_NOT_INTERESTED: u32 = 1; +const LEN_PREFIX_HAVE: u32 = 5; +const LEN_PREFIX_REQUEST: u32 = 13; + +const MSGID_CHOKE: u8 = 0; +const MSGID_UNCHOKE: u8 = 1; +const MSGID_INTERESTED: u8 = 2; +const MSGID_NOT_INTERESTED: u8 = 3; +const MSGID_HAVE: u8 = 4; +const MSGID_BITFIELD: u8 = 5; +const MSGID_REQUEST: u8 = 6; +const MSGID_PIECE: u8 = 7; + +#[derive(Debug)] +pub enum MessageDeserializeError { + NotEnoughData(usize, &'static str), + UnsupportedMessageId(u8), + IncorrectLenPrefix { + received: u32, + expected: u32, + msg_id: u8, + }, + OtherBincode { + error: bincode::Error, + msg_id: u8, + len_prefix: u32, + name: &'static str, + }, +} + +#[derive(Debug)] +pub struct Piece { + pub index: u32, + pub begin: u32, + pub block: ByteBuf, +} + +impl Piece +where + ByteBuf: AsRef<[u8]>, +{ + pub fn serialize(&self, buf: &mut [u8]) -> usize { + byteorder::BigEndian::write_u32(&mut buf[0..4], self.index); + byteorder::BigEndian::write_u32(&mut buf[4..8], self.begin); + (&mut buf[8..8 + self.block.as_ref().len()]).copy_from_slice(self.block.as_ref()); + self.block.as_ref().len() + 8 + } + pub fn deserialize<'a>(buf: &'a [u8]) -> Piece + where + ByteBuf: From<&'a [u8]> + 'a, + { + let index = byteorder::BigEndian::read_u32(&buf[0..4]); + let begin = byteorder::BigEndian::read_u32(&buf[4..8]); + let block = ByteBuf::from(&buf[8..]); + Piece { + index, + begin, + block, + } + } +} + +impl std::fmt::Display for MessageDeserializeError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + MessageDeserializeError::NotEnoughData(b, name) => { + write!( + f, + "not enough data to deserialize {}: expected at least {} more bytes", + name, b + ) + } + MessageDeserializeError::UnsupportedMessageId(msg_id) => { + write!(f, "unsupported message id {}", msg_id) + } + MessageDeserializeError::IncorrectLenPrefix { + received, + expected, + msg_id, + } => write!( + f, + "incorrect len prefix for message id {}, expected {}, received {}", + msg_id, expected, received + ), + MessageDeserializeError::OtherBincode { + error, + msg_id, + name, + len_prefix, + } => write!( + f, + "error deserializing {} (msg_id={}, len_prefix={}): {:?}", + name, msg_id, len_prefix, error + ), + } + } +} + +impl std::error::Error for MessageDeserializeError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + MessageDeserializeError::OtherBincode { error, .. } => Some(error), + _ => None, + } + } +} + +#[derive(Debug)] +pub enum Message { + Request(Request), + Bitfield(ByteBuf), + KeepAlive, + Have(u32), + Choke, + Unchoke, + Interested, + NotInterested, + Piece(Piece), +} + +pub type MessageBorrowed<'a> = Message>; +pub type MessageOwned = Message; + +pub type BitfieldBorrowed<'a> = &'a bitvec::slice::BitSlice; +pub type BitfieldOwned = bitvec::vec::BitVec; + +pub struct Bitfield<'a> { + pub data: BitfieldBorrowed<'a>, +} + +impl CloneToOwned for Message { + type Target = Message<::Target>; + + fn clone_to_owned(&self) -> Self::Target { + match self { + Message::Request(req) => Message::Request(*req), + Message::Bitfield(b) => Message::Bitfield(b.clone_to_owned()), + Message::Choke => Message::Choke, + Message::Unchoke => Message::Unchoke, + Message::Interested => Message::Interested, + Message::Piece(piece) => Message::Piece(Piece { + index: piece.index, + begin: piece.begin, + block: piece.block.clone_to_owned(), + }), + Message::KeepAlive => Message::KeepAlive, + Message::Have(v) => Message::Have(*v), + Message::NotInterested => Message::NotInterested, + } + } +} + +impl<'a> Bitfield<'a> { + pub fn new_from_slice(buf: &'a [u8]) -> anyhow::Result { + Ok(Self { + data: bitvec::slice::BitSlice::from_slice(buf)?, + }) + } +} + +impl<'a> std::fmt::Debug for Bitfield<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Bitfield") + .field("_ones", &self.data.count_ones()) + .field("_len", &self.data.len()) + .finish() + } +} + +impl Message +where + ByteBuf: AsRef<[u8]>, +{ + pub fn len_prefix_and_msg_id(&self) -> (u32, u8) { + match self { + Message::Request(_) => (LEN_PREFIX_REQUEST, MSGID_REQUEST), + Message::Bitfield(b) => (1 + b.as_ref().len() as u32, MSGID_BITFIELD), + Message::Choke => (LEN_PREFIX_CHOKE, MSGID_CHOKE), + Message::Unchoke => (LEN_PREFIX_UNCHOKE, MSGID_UNCHOKE), + Message::Interested => (LEN_PREFIX_INTERESTED, MSGID_INTERESTED), + Message::NotInterested => (LEN_PREFIX_NOT_INTERESTED, MSGID_NOT_INTERESTED), + Message::Piece(p) => (9 + p.block.as_ref().len() as u32, MSGID_PIECE), + Message::KeepAlive => (LEN_PREFIX_KEEPALIVE, 0), + Message::Have(_) => (LEN_PREFIX_HAVE, MSGID_HAVE), + } + } + pub fn serialize(&self, out: &mut Vec) -> usize { + let (lp, msg_id) = self.len_prefix_and_msg_id(); + + out.resize(PREAMBLE_LEN, 0); + + byteorder::BigEndian::write_u32(&mut out[..4], lp); + out[4] = msg_id; + + let ser = bopts(); + + match self { + Message::Request(request) => { + const MSG_LEN: usize = PREAMBLE_LEN + 12; + out.resize(MSG_LEN, 0); + debug_assert_eq!((&out[PREAMBLE_LEN..]).len(), 12); + ser.serialize_into(&mut out[PREAMBLE_LEN..], request) + .unwrap(); + MSG_LEN + } + Message::Bitfield(_) => todo!(), + Message::Choke | Message::Unchoke | Message::Interested => PREAMBLE_LEN, + Message::Piece(p) => { + let msg_len = PREAMBLE_LEN + 8 + p.block.as_ref().len(); + out.resize(msg_len, 0); + p.serialize(&mut out[PREAMBLE_LEN..(8 + p.block.as_ref().len())]); + msg_len + } + Message::KeepAlive => 4, + Message::Have(v) => { + let msg_len = PREAMBLE_LEN + 4; + out.resize(msg_len, 0); + byteorder::BE::write_u32(&mut out[PREAMBLE_LEN..], *v); + msg_len + } + Message::NotInterested => todo!(), + } + } + pub fn deserialize<'a>( + buf: &'a [u8], + ) -> Result<(Message, usize), MessageDeserializeError> + where + ByteBuf: From<&'a [u8]> + 'a, + { + let len_prefix = match buf.get(0..4) { + Some(bytes) => byteorder::BigEndian::read_u32(bytes), + None => return Err(MessageDeserializeError::NotEnoughData(4, "message")), + }; + if len_prefix == 0 { + return Ok((Message::KeepAlive, 4)); + } + + let msg_id = match buf.get(4) { + Some(msg_id) => *msg_id, + None => return Err(MessageDeserializeError::NotEnoughData(1, "message")), + }; + let rest = &buf[5..]; + let decoder_config = bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_big_endian(); + + match msg_id { + MSGID_CHOKE => { + if len_prefix != LEN_PREFIX_CHOKE { + return Err(MessageDeserializeError::IncorrectLenPrefix { + received: len_prefix, + expected: LEN_PREFIX_CHOKE, + msg_id, + }); + } + Ok((Message::Choke, NO_PAYLOAD_MSG_LEN)) + } + MSGID_UNCHOKE => { + if len_prefix != LEN_PREFIX_UNCHOKE { + return Err(MessageDeserializeError::IncorrectLenPrefix { + received: len_prefix, + expected: LEN_PREFIX_UNCHOKE, + msg_id, + }); + } + Ok((Message::Unchoke, NO_PAYLOAD_MSG_LEN)) + } + MSGID_INTERESTED => { + if len_prefix != LEN_PREFIX_INTERESTED { + return Err(MessageDeserializeError::IncorrectLenPrefix { + received: len_prefix, + expected: LEN_PREFIX_INTERESTED, + msg_id, + }); + } + Ok((Message::Interested, NO_PAYLOAD_MSG_LEN)) + } + MSGID_NOT_INTERESTED => { + if len_prefix != LEN_PREFIX_NOT_INTERESTED { + return Err(MessageDeserializeError::IncorrectLenPrefix { + received: len_prefix, + expected: LEN_PREFIX_NOT_INTERESTED, + msg_id, + }); + } + Ok((Message::NotInterested, NO_PAYLOAD_MSG_LEN)) + } + MSGID_HAVE => { + let expected_len = 4; + match rest.get(..expected_len as usize) { + Some(h) => Ok(( + Message::Have(byteorder::BE::read_u32(&h)), + PREAMBLE_LEN + expected_len, + )), + None => { + let missing = expected_len - rest.len(); + Err(MessageDeserializeError::NotEnoughData(missing, "have")) + } + } + } + MSGID_BITFIELD => { + if len_prefix <= 1 { + return Err(MessageDeserializeError::IncorrectLenPrefix { + expected: 2, + received: len_prefix, + msg_id, + }); + } + let expected_len = len_prefix as usize - 1; + match rest.get(..expected_len as usize) { + Some(bitfield) => Ok(( + Message::Bitfield(ByteBuf::from(bitfield)), + PREAMBLE_LEN + expected_len, + )), + None => { + let missing = expected_len - rest.len(); + Err(MessageDeserializeError::NotEnoughData(missing, "bitfield")) + } + } + } + MSGID_REQUEST => { + let expected_len = 12; + match rest.get(..expected_len as usize) { + Some(b) => { + let request = decoder_config.deserialize::(&b).unwrap(); + Ok((Message::Request(request), PREAMBLE_LEN + expected_len)) + } + None => { + let missing = expected_len - rest.len(); + Err(MessageDeserializeError::NotEnoughData(missing, "request")) + } + } + } + MSGID_PIECE => { + if len_prefix <= 9 { + return Err(MessageDeserializeError::IncorrectLenPrefix { + expected: 10, + received: len_prefix, + msg_id, + }); + } + // is for "9", "8" is for 2 integer fields in the piece. + let expected_len = len_prefix as usize - 9 + 8; + match rest.get(..expected_len) { + Some(b) => Ok(( + Message::Piece(Piece::deserialize(&b)), + PREAMBLE_LEN + expected_len, + )), + None => Err(MessageDeserializeError::NotEnoughData( + expected_len - rest.len(), + "piece", + )), + } + } + msg_id => Err(MessageDeserializeError::UnsupportedMessageId(msg_id)), + } + } +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Handshake<'a> { + pub pstr: &'a str, + pub reserved: [u8; 8], + pub info_hash: [u8; 20], + pub peer_id: [u8; 20], +} + +fn bopts() -> impl bincode::Options { + bincode::DefaultOptions::new() + .with_fixint_encoding() + .with_big_endian() +} + +impl<'a> Handshake<'a> { + pub fn new(info_hash: [u8; 20], peer_id: [u8; 20]) -> Handshake<'static> { + debug_assert_eq!(PSTR_BT1.len(), 19); + Handshake { + pstr: PSTR_BT1, + reserved: [0; 8], + info_hash, + peer_id, + } + } + fn bopts() -> impl bincode::Options { + bincode::DefaultOptions::new() + } + pub fn deserialize(b: &[u8]) -> Result<(Handshake<'_>, usize), MessageDeserializeError> { + let pstr_len = *b + .get(0) + .ok_or(MessageDeserializeError::NotEnoughData(1, "handshake"))?; + let expected_len = 1usize + pstr_len as usize + 48; + let hbuf = b + .get(..expected_len) + .ok_or(MessageDeserializeError::NotEnoughData( + expected_len, + "handshake", + ))?; + Ok((Self::bopts().deserialize(&hbuf).unwrap(), expected_len)) + } + pub fn serialize(&self) -> Vec { + Self::bopts().serialize(&self).unwrap() + } +} + +#[derive(Serialize, Deserialize, Debug, Clone, Copy)] +pub struct Request { + pub index: u32, + pub begin: u32, + pub length: u32, +} + +impl Request { + pub fn new(index: u32, begin: u32, length: u32) -> Self { + Self { + index, + begin, + length, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_handshake_serialize() { + let info_hash = [ + 1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + ]; + let peer_id = [ + 1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + ]; + let b = dbg!(Handshake::new(info_hash, peer_id).serialize()); + assert_eq!(b.len(), 20 + 20 + 8 + 19 + 1); + } +} diff --git a/crates/librqbit/src/peer_id.rs b/crates/librqbit/src/peer_id.rs new file mode 100644 index 0000000..a519965 --- /dev/null +++ b/crates/librqbit/src/peer_id.rs @@ -0,0 +1,45 @@ +#[derive(Debug)] +pub enum AzureusStyleKind { + Deluge, + LibTorrent, + Transmission, + Other([char; 2]), +} + +#[derive(Debug)] +pub struct AzureusStyle { + pub kind: AzureusStyleKind, + pub version: [char; 4], +} + +impl AzureusStyleKind { + pub const fn from_bytes(b1: u8, b2: u8) -> Self { + match &[b1, b2] { + b"DE" => AzureusStyleKind::Deluge, + b"lt" | b"LT" => AzureusStyleKind::LibTorrent, + b"TR" => AzureusStyleKind::Transmission, + _ => AzureusStyleKind::Other([b1 as char, b2 as char]), + } + } +} + +fn try_decode_azureus_style(p: &[u8; 20]) -> Option { + if !(p[0] == b'-' && p[7] == b'-') { + return None; + } + let mut version = ['0'; 4]; + for (i, c) in (&p[3..7]).iter().copied().enumerate() { + version[i] = c as char; + } + let kind = AzureusStyleKind::from_bytes(p[1], p[2]); + Some(AzureusStyle { kind, version }) +} + +#[derive(Debug)] +pub enum PeerId { + AzureusStyle(AzureusStyle), +} + +pub fn try_decode_peer_id(p: [u8; 20]) -> Option { + Some(PeerId::AzureusStyle(try_decode_azureus_style(&p)?)) +} diff --git a/crates/librqbit/src/serde_bencode.rs b/crates/librqbit/src/serde_bencode.rs new file mode 100644 index 0000000..48f01e1 --- /dev/null +++ b/crates/librqbit/src/serde_bencode.rs @@ -0,0 +1,663 @@ +use serde::de::Deserializer; +use serde::de::Error as DeError; +use std::collections::HashMap; + +use crate::buffers::ByteBuf; +use crate::buffers::ByteString; + +pub struct BencodeDeserializer<'de> { + buf: &'de [u8], + field_context: Vec>, + parsing_key: bool, + pub(crate) is_torrent_info: bool, + pub(crate) torrent_info_digest: Option<[u8; 20]>, +} + +impl<'de> BencodeDeserializer<'de> { + pub fn new_from_buf(buf: &'de [u8]) -> BencodeDeserializer<'de> { + Self { + buf, + field_context: Default::default(), + parsing_key: false, + is_torrent_info: false, + torrent_info_digest: None, + } + } + fn parse_integer(&mut self) -> Result { + match self.buf.iter().copied().position(|e| e == b'e') { + Some(end) => { + let intbytes = &self.buf[1..end]; + let value: i64 = std::str::from_utf8(intbytes) + .map_err(|e| Error::new_from_err(e).set_context(self))? + .parse() + .map_err(|e| Error::new_from_err(e).set_context(self))?; + let rem = self.buf.get(end + 1..).unwrap_or_default(); + self.buf = rem; + Ok(value) + } + None => Err(Error::custom("cannot parse integer, unexpected EOF").set_context(self)), + } + } + + fn parse_bytes(&mut self) -> Result<&'de [u8], Error> { + match self.buf.iter().copied().position(|e| e == b':') { + Some(length_delim) => { + let lenbytes = &self.buf[..length_delim]; + let length: usize = std::str::from_utf8(lenbytes) + .map_err(|e| Error::new_from_err(e).set_context(self))? + .parse() + .map_err(|e| Error::new_from_err(e).set_context(self))?; + let bytes_start = length_delim + 1; + let bytes_end = bytes_start + length; + let bytes = &self.buf[bytes_start..bytes_end]; + let rem = self.buf.get(bytes_end..).unwrap_or_default(); + self.buf = rem; + Ok(bytes) + } + None => Err(Error::custom("cannot parse bytes, unexpected EOF").set_context(self)), + } + } + + fn parse_bytes_checked(&mut self) -> Result<&'de [u8], Error> { + let first = match self.buf.first().copied() { + Some(first) => first, + None => return Err(Error::custom("expected bencode bytes, got EOF").set_context(self)), + }; + match first { + b'0'..=b'9' => {} + _ => return Err(Error::custom("expected bencode bytes").set_context(self)), + } + let b = self.parse_bytes()?; + if self.parsing_key { + self.field_context.push(ByteBuf(b)); + } + Ok(b) + } +} + +pub fn from_bytes<'a, T>(buf: &'a [u8]) -> anyhow::Result +where + T: serde::de::Deserialize<'a>, +{ + let mut de = BencodeDeserializer::new_from_buf(buf); + Ok(T::deserialize(&mut de)?) +} + +pub fn dyn_from_bytes(buf: &[u8]) -> anyhow::Result> { + from_bytes(buf) +} + +#[derive(Debug)] +enum ErrorKind { + Other(anyhow::Error), + NotSupported(&'static str), +} + +#[derive(Debug, Default)] +pub struct ErrorContext { + field_stack: Vec, +} + +impl std::fmt::Display for ErrorContext { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut it = self.field_stack.iter(); + if let Some(field) = it.next() { + write!(f, "\"{}\"", field)?; + } else { + return Ok(()); + } + for field in self.field_stack.iter().skip(1) { + write!(f, " -> \"{}\"", field)?; + } + f.write_str(": ") + } +} + +#[derive(Debug)] +pub struct Error { + kind: ErrorKind, + context: ErrorContext, +} + +impl std::fmt::Display for ErrorKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ErrorKind::Other(err) => err.fmt(f), + ErrorKind::NotSupported(s) => write!(f, "{} is not supported by bencode", s), + } + } +} + +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}{}", self.context, self.kind) + } +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match &self.kind { + ErrorKind::Other(err) => err.source(), + _ => None, + } + } +} + +impl Error { + fn new_from_err(e: E) -> Self + where + E: std::error::Error + Send + Sync + 'static, + { + Error { + kind: ErrorKind::Other(anyhow::Error::new(e)), + context: Default::default(), + } + } + + fn new_from_kind(kind: ErrorKind) -> Self { + Self { + kind, + context: Default::default(), + } + } + + fn new_from_anyhow(e: anyhow::Error) -> Self { + Error { + kind: ErrorKind::Other(e), + context: Default::default(), + } + } + fn custom_with_de(msg: M, de: &BencodeDeserializer<'_>) -> Self { + Self::custom(msg).set_context(de) + } + fn set_context(mut self, de: &BencodeDeserializer<'_>) -> Self { + self.context = ErrorContext { + field_stack: de.field_context.iter().map(|s| format!("{}", s)).collect(), + }; + self + } +} + +impl serde::de::Error for Error { + fn custom(msg: T) -> Self + where + T: std::fmt::Display, + { + Self { + kind: ErrorKind::Other(anyhow::anyhow!("{}", msg)), + context: Default::default(), + } + } +} + +impl<'de, 'a> serde::de::Deserializer<'de> for &'a mut BencodeDeserializer<'de> { + type Error = Error; + + fn deserialize_any(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + match self.buf.first().copied() { + Some(b'd') => self.deserialize_map(visitor), + Some(b'i') => self.deserialize_u64(visitor), + Some(b'l') => self.deserialize_seq(visitor), + Some(_) => self.deserialize_bytes(visitor), + None => Err(Error::custom_with_de("empty input", self)), + } + } + + fn deserialize_bool(self, _visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + Err( + Error::new_from_kind(ErrorKind::NotSupported("bencode doesn't support booleans")) + .set_context(self), + ) + } + + fn deserialize_i8(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_i64(visitor) + } + + fn deserialize_i16(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_i64(visitor) + } + + fn deserialize_i32(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_i64(visitor) + } + + fn deserialize_i64(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + if !self.buf.starts_with(b"i") { + return Err(Error::custom_with_de("expected bencode int", self)); + } + visitor + .visit_i64(self.parse_integer()?) + .map_err(|e: Self::Error| e.set_context(self)) + } + + fn deserialize_u8(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_i64(visitor) + } + + fn deserialize_u16(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_i64(visitor) + } + + fn deserialize_u32(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_i64(visitor) + } + + fn deserialize_u64(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_i64(visitor) + } + + fn deserialize_f32(self, _visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + Err( + Error::new_from_kind(ErrorKind::NotSupported("bencode doesn't support floats")) + .set_context(self), + ) + } + + fn deserialize_f64(self, _visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + Err( + Error::new_from_kind(ErrorKind::NotSupported("bencode doesn't support floats")) + .set_context(self), + ) + } + + fn deserialize_char(self, _visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + Err( + Error::new_from_kind(ErrorKind::NotSupported("bencode doesn't support chars")) + .set_context(self), + ) + } + + fn deserialize_str(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + let first = match self.buf.first().copied() { + Some(first) => first, + None => { + return Err(Error::custom_with_de( + "expected bencode string, got EOF", + self, + )) + } + }; + match first { + b'0'..=b'9' => {} + _ => return Err(Error::custom_with_de("expected bencode string", self)), + } + let b = self.parse_bytes()?; + let s = std::str::from_utf8(b).map_err(|e| { + Error::new_from_anyhow(anyhow::anyhow!("error reading utf-8: {}", e)).set_context(self) + })?; + visitor + .visit_borrowed_str(s) + .map_err(|e: Self::Error| e.set_context(self)) + } + + fn deserialize_string(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_str(visitor) + } + + fn deserialize_bytes(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + let b = self.parse_bytes_checked()?; + visitor + .visit_borrowed_bytes(b) + .map_err(|e: Self::Error| e.set_context(self)) + } + + fn deserialize_byte_buf(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_bytes(visitor) + } + + fn deserialize_option(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + visitor + .visit_some(&mut *self) + .map_err(|e: Self::Error| e.set_context(self)) + } + + fn deserialize_unit(self, _visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + Err(Error::new_from_kind(ErrorKind::NotSupported( + "bencode doesn't support unit types", + )) + .set_context(self)) + } + + fn deserialize_unit_struct( + self, + _name: &'static str, + _visitor: V, + ) -> Result + where + V: serde::de::Visitor<'de>, + { + Err(Error::new_from_kind(ErrorKind::NotSupported( + "bencode doesn't support unit structs", + )) + .set_context(self)) + } + + fn deserialize_newtype_struct( + self, + _name: &'static str, + _visitor: V, + ) -> Result + where + V: serde::de::Visitor<'de>, + { + Err( + Error::new_from_kind(ErrorKind::NotSupported("bencode doesn't newtype structs")) + .set_context(self), + ) + } + + fn deserialize_seq(mut self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + if !self.buf.starts_with(b"l") { + return Err(Error::custom(format!( + "expected bencode list, but got {}", + self.buf[0] as char, + ))); + } + self.buf = self.buf.get(1..).unwrap_or_default(); + visitor + .visit_seq(SeqAccess { de: &mut self }) + .map_err(|e: Self::Error| e.set_context(self)) + } + + fn deserialize_tuple(self, _len: usize, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_seq(visitor) + } + + fn deserialize_tuple_struct( + self, + _name: &'static str, + _len: usize, + visitor: V, + ) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_seq(visitor) + } + + fn deserialize_map(mut self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + if !self.buf.starts_with(b"d") { + return Err(Error::custom("expected bencode dict")); + } + self.buf = self.buf.get(1..).unwrap_or_default(); + visitor + .visit_map(MapAccess { de: &mut self }) + .map_err(|e: Self::Error| e.set_context(self)) + } + + fn deserialize_struct( + self, + _name: &'static str, + _fields: &'static [&'static str], + visitor: V, + ) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_map(visitor) + } + + fn deserialize_enum( + self, + _name: &'static str, + _variants: &'static [&'static str], + _visitor: V, + ) -> Result + where + V: serde::de::Visitor<'de>, + { + Err( + Error::new_from_kind(ErrorKind::NotSupported("deserializing enums not supported")) + .set_context(self), + ) + } + + fn deserialize_identifier(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + let name = self.parse_bytes_checked()?; + visitor + .visit_borrowed_bytes(name) + .map_err(|e: Self::Error| e.set_context(self)) + } + + fn deserialize_ignored_any(self, visitor: V) -> Result + where + V: serde::de::Visitor<'de>, + { + self.deserialize_any(visitor) + } +} + +struct MapAccess<'a, 'de> { + de: &'a mut BencodeDeserializer<'de>, +} + +struct SeqAccess<'a, 'de> { + de: &'a mut BencodeDeserializer<'de>, +} + +impl<'a, 'de> serde::de::MapAccess<'de> for MapAccess<'a, 'de> { + type Error = Error; + + fn next_key_seed(&mut self, seed: K) -> Result, Self::Error> + where + K: serde::de::DeserializeSeed<'de>, + { + if self.de.buf.starts_with(b"e") { + self.de.buf = self.de.buf.get(1..).unwrap_or_default(); + return Ok(None); + } + self.de.parsing_key = true; + let retval = seed.deserialize(&mut *self.de)?; + self.de.parsing_key = false; + Ok(Some(retval)) + } + + fn next_value_seed(&mut self, seed: V) -> Result + where + V: serde::de::DeserializeSeed<'de>, + { + let buf_before = self.de.buf; + let value = seed.deserialize(&mut *self.de)?; + if self.de.is_torrent_info && self.de.field_context.as_slice() == [ByteBuf(b"info")] { + let len = self.de.buf.as_ptr() as usize - buf_before.as_ptr() as usize; + let mut hash = sha1::Sha1::new(); + hash.update(&buf_before[..len]); + let digest = hash.digest().bytes(); + self.de.torrent_info_digest = Some(digest) + } + self.de.field_context.pop(); + Ok(value) + } +} + +impl<'a, 'de> serde::de::SeqAccess<'de> for SeqAccess<'a, 'de> { + type Error = Error; + + fn next_element_seed(&mut self, seed: T) -> Result, Self::Error> + where + T: serde::de::DeserializeSeed<'de>, + { + if self.de.buf.starts_with(b"e") { + self.de.buf = self.de.buf.get(1..).unwrap_or_default(); + return Ok(None); + } + Ok(Some(seed.deserialize(&mut *self.de)?)) + } +} + +impl<'de> serde::de::Deserialize<'de> for DynBencodeNode<'de> { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct Visitor; + + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = DynBencodeNode<'de>; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(formatter, "a bencode value") + } + + fn visit_i64(self, v: i64) -> Result + where + E: serde::de::Error, + { + Ok(DynBencodeNode::Integer(v)) + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: serde::de::SeqAccess<'de>, + { + let mut v = Vec::new(); + while let Some(value) = seq.next_element()? { + v.push(value); + } + Ok(DynBencodeNode::List(v)) + } + + fn visit_borrowed_bytes(self, v: &'de [u8]) -> Result + where + E: serde::de::Error, + { + Ok(DynBencodeNode::Bytes(ByteBuf(v))) + } + + fn visit_map(self, mut map: A) -> Result + where + A: serde::de::MapAccess<'de>, + { + let mut hmap = HashMap::new(); + while let Some(key) = map.next_key()? { + let value = map.next_value()?; + hmap.insert(key, value); + } + Ok(DynBencodeNode::Dict(hmap)) + } + } + + deserializer.deserialize_any(Visitor {}) + } +} + +impl<'de> serde::de::Deserialize<'de> for ByteString { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct Visitor; + + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = Vec; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("bencode byte string") + } + fn visit_bytes(self, v: &[u8]) -> Result + where + E: serde::de::Error, + { + Ok(v.to_owned()) + } + } + Ok(ByteString(deserializer.deserialize_byte_buf(Visitor {})?)) + } +} + +#[derive(Debug)] +pub enum DynBencodeNode<'a> { + Bytes(ByteBuf<'a>), + Integer(i64), + List(Vec>), + Dict(HashMap, DynBencodeNode<'a>>), +} + +#[cfg(test)] +mod tests { + use super::*; + use std::io::Read; + + #[test] + fn test_deserialize_torrent_dyn() { + let mut buf = Vec::new(); + let filename = "resources/ubuntu-21.04-desktop-amd64.iso.torrent"; + std::fs::File::open(filename) + .unwrap() + .read_to_end(&mut buf) + .unwrap(); + + let torrent: DynBencodeNode = from_bytes(&buf).unwrap(); + dbg!(torrent); + } +} diff --git a/crates/librqbit/src/torrent_manager.rs b/crates/librqbit/src/torrent_manager.rs new file mode 100644 index 0000000..1462297 --- /dev/null +++ b/crates/librqbit/src/torrent_manager.rs @@ -0,0 +1,1112 @@ +use std::{ + collections::{HashMap, HashSet}, + fmt::Display, + fs::{File, OpenOptions}, + io::{Read, Seek, Write}, + net::SocketAddr, + path::{Path, PathBuf}, + sync::{ + atomic::{AtomicU64, Ordering}, + Arc, + }, + time::Duration, +}; + +use anyhow::Context; +use futures::{stream::FuturesUnordered, StreamExt}; +use log::{debug, error, info, trace, warn}; +use parking_lot::{Mutex, RwLock}; +use reqwest::Url; +use tokio::sync::{mpsc::Sender, Notify, Semaphore}; + +use crate::{ + buffers::ByteString, + chunk_tracker::ChunkTracker, + clone_to_owned::CloneToOwned, + lengths::{Lengths, ValidPieceIndex}, + peer_comms::{ + Handshake, Message, MessageBorrowed, MessageDeserializeError, MessageOwned, Piece, Request, + }, + peer_id::try_decode_peer_id, + torrent_metainfo::TorrentMetaV1Owned, + tracker_comms::{CompactTrackerResponse, TrackerRequest, TrackerRequestEvent}, +}; +pub struct TorrentManagerBuilder { + torrent: TorrentMetaV1Owned, + overwrite: bool, + output_folder: PathBuf, +} + +impl TorrentManagerBuilder { + pub fn new>(torrent: TorrentMetaV1Owned, output_folder: P) -> Self { + Self { + torrent, + overwrite: false, + output_folder: output_folder.as_ref().into(), + } + } + + pub fn overwrite(mut self, overwrite: bool) -> Self { + self.overwrite = overwrite; + self + } + + pub async fn start_manager(self) -> anyhow::Result { + TorrentManager::start(self.torrent, self.output_folder, self.overwrite) + } +} + +#[derive(Clone)] +pub struct TorrentManagerHandle { + manager: TorrentManager, +} + +impl TorrentManagerHandle { + pub async fn cancel(&self) -> anyhow::Result<()> { + todo!() + } + pub async fn wait_until_completed(&self) -> anyhow::Result<()> { + loop { + tokio::time::sleep(Duration::from_secs(60)).await; + } + } +} + +type PeerHandle = SocketAddr; + +enum PeerState { + Connecting(SocketAddr), + Live(LivePeerState), +} + +type BF = bitvec::vec::BitVec; + +struct LivePeerState { + #[allow(unused)] + peer_id: [u8; 20], + i_am_choked: bool, + #[allow(unused)] + peer_choked: bool, + #[allow(unused)] + peer_interested: bool, + outstanding_requests: Arc, + have_notify: Arc, + bitfield: Option, + requested_pieces: HashSet, +} + +#[derive(Default)] +struct PeerStates { + states: HashMap, + seen_peers: HashSet, + tx: HashMap>>, +} + +impl PeerStates { + fn add_if_not_seen( + &mut self, + addr: SocketAddr, + tx: tokio::sync::mpsc::Sender, + ) -> Option { + if self.seen_peers.contains(&addr) { + return None; + } + let handle = self.add(addr, tx)?; + self.seen_peers.insert(addr); + Some(handle) + } + fn get_live(&self, handle: PeerHandle) -> Option<&LivePeerState> { + if let PeerState::Live(ref l) = self.states.get(&handle)? { + return Some(l); + } + None + } + fn get_live_mut(&mut self, handle: PeerHandle) -> Option<&mut LivePeerState> { + if let PeerState::Live(ref mut l) = self.states.get_mut(&handle)? { + return Some(l); + } + None + } + fn add( + &mut self, + addr: SocketAddr, + tx: tokio::sync::mpsc::Sender, + ) -> Option { + let handle = addr; + if self.states.contains_key(&addr) { + return None; + } + self.states.insert(handle, PeerState::Connecting(addr)); + self.tx.insert(handle, Arc::new(tx)); + Some(handle) + } + fn drop_peer(&mut self, handle: PeerHandle) -> Option { + let result = self.states.remove(&handle); + self.tx.remove(&handle); + result + } + fn mark_i_am_choked(&mut self, handle: PeerHandle, is_choked: bool) -> Option { + match self.states.get_mut(&handle) { + Some(PeerState::Live(live)) => { + let prev = live.i_am_choked; + live.i_am_choked = is_choked; + return Some(prev); + } + _ => return None, + } + } + fn mark_peer_choked(&mut self, handle: PeerHandle, is_choked: bool) -> Option { + match self.states.get_mut(&handle) { + Some(PeerState::Live(live)) => { + let prev = live.peer_choked; + live.peer_choked = is_choked; + return Some(prev); + } + _ => return None, + } + } + fn update_bitfield_from_vec( + &mut self, + handle: PeerHandle, + bitfield: Vec, + ) -> Option> { + match self.states.get_mut(&handle) { + Some(PeerState::Live(live)) => { + let bitfield = BF::from_vec(bitfield); + let prev = live.bitfield.take(); + live.bitfield = Some(bitfield); + Some(prev) + } + _ => None, + } + } + fn get_tx(&self, handle: PeerHandle) -> Option<&Sender> { + self.tx.get(&handle).map(|v| v.as_ref()) + } + fn clone_tx(&self, handle: PeerHandle) -> Option>> { + Some(self.tx.get(&handle)?.clone()) + } +} + +struct TorrentManagerInnerLocked { + peers: PeerStates, + chunks: ChunkTracker, +} + +impl TorrentManagerInnerLocked {} + +struct TorrentManagerInner { + torrent: TorrentMetaV1Owned, + locked: Arc>, + files: Vec>>, + info_hash: [u8; 20], + peer_id: [u8; 20], + incoming_tx: tokio::sync::mpsc::Sender<(PeerHandle, MessageOwned)>, + downloaded: AtomicU64, + uploaded: AtomicU64, + fetched_bytes: AtomicU64, + lengths: Lengths, +} + +#[derive(Clone)] +struct TorrentManager { + inner: Arc, +} + +fn generate_peer_id() -> [u8; 20] { + let mut peer_id = [0u8; 20]; + let u = uuid::Uuid::new_v4(); + (&mut peer_id[..16]).copy_from_slice(&u.as_bytes()[..]); + peer_id +} + +fn spawn( + name: N, + fut: impl std::future::Future> + Send + 'static, +) { + debug!("starting task \"{}\"", name); + tokio::spawn(async move { + match fut.await { + Ok(_) => { + debug!("task \"{}\" finished", name); + } + Err(e) => { + error!("error in task \"{}\": {:#}", name, e) + } + } + }); +} + +fn spawn_blocking( + name: N, + f: impl FnOnce() -> anyhow::Result<()> + Send + 'static, +) { + debug!("starting blocking task \"{}\"", name); + tokio::task::spawn_blocking(move || match f() { + Ok(_) => { + debug!("blocking task \"{}\" finished", name); + } + Err(e) => { + error!("error in blocking task \"{}\": {:#}", name, e) + } + }); +} + +fn make_lengths(torrent: &TorrentMetaV1Owned) -> anyhow::Result { + let total_length = torrent.info.iter_file_lengths().sum(); + Lengths::new(total_length, torrent.info.piece_length, None) +} + +fn compute_needed_pieces( + torrent: &TorrentMetaV1Owned, + files: &mut [Arc>], + lengths: &Lengths, +) -> anyhow::Result { + let needed_pieces = vec![u8::MAX; lengths.piece_bitfield_bytes()]; + let needed_pieces = BF::from_vec(needed_pieces); + + // TODO: read and validate existing files + Ok(needed_pieces) +} + +impl TorrentManager { + pub fn start>( + torrent: TorrentMetaV1Owned, + out: P, + overwrite: bool, + ) -> anyhow::Result { + let mut files = { + let mut files = + Vec::>>::with_capacity(torrent.info.iter_file_lengths().count()); + + for (path_bits, _) in torrent.info.iter_filenames_and_lengths() { + let mut full_path = out.as_ref().to_owned(); + for bit in path_bits.iter_components() { + full_path.push( + bit.as_ref() + .map(|b| std::str::from_utf8(b.as_ref())) + .unwrap_or(Ok("output"))?, + ); + } + + std::fs::create_dir_all(full_path.parent().unwrap())?; + let file = if overwrite { + OpenOptions::new() + .create(true) + .read(true) + .write(true) + .open(&full_path)? + } else { + // TODO: create_new does not seem to work with read(true), so calling this twice. + OpenOptions::new() + .create_new(true) + .write(true) + .open(&full_path) + .with_context(|| format!("error creating {:?}", &full_path))?; + OpenOptions::new().read(true).write(true).open(&full_path)? + }; + files.push(Arc::new(Mutex::new(file))) + } + files + }; + + let peer_id = generate_peer_id(); + let lengths = make_lengths(&torrent).context("unable to compute Lengths from torrent")?; + let needed_pieces = compute_needed_pieces(&torrent, &mut files, &lengths)?; + debug!("computed lengths: {:?}", &lengths); + let chunk_tracker = ChunkTracker::new(needed_pieces, lengths); + + let (incoming_tx, incoming_rx) = + tokio::sync::mpsc::channel::<(PeerHandle, MessageOwned)>(1); + + let mgr = Self { + inner: Arc::new(TorrentManagerInner { + info_hash: torrent.info_hash, + torrent, + peer_id, + locked: Arc::new(RwLock::new(TorrentManagerInnerLocked { + peers: Default::default(), + chunks: chunk_tracker, + })), + files, + incoming_tx, + downloaded: Default::default(), + fetched_bytes: Default::default(), + uploaded: Default::default(), + lengths, + }), + }; + + spawn("tracker_monitor", mgr.clone().task_tracker_monitor()); + spawn( + "incoming_rx_handler", + mgr.clone().task_incoming_rx_handler(incoming_rx), + ); + spawn("Stats printer", mgr.clone().stats_printer()); + Ok(mgr.into_handle()) + } + + async fn stats_printer(self) -> anyhow::Result<()> { + loop { + let live_peers = self.inner.locked.read().peers.states.len(); + let downloaded_bytes = self.inner.downloaded.load(Ordering::Relaxed); + let downloaded = self.inner.downloaded.load(Ordering::Relaxed) / 1024 / 1024; + let fetched = self.inner.fetched_bytes.load(Ordering::Relaxed) / 1024 / 1024; + let total_length = self.inner.lengths.total_length(); + let pct = if total_length == downloaded { + 100f64 + } else { + (downloaded_bytes as f64 / self.inner.lengths.total_length() as f64) * 100f64 + }; + info!( + "Total downloaded and checked {}MiB ({:.2}%), fetched {}MiB, live peers={}", + downloaded, pct, fetched, live_peers + ); + tokio::time::sleep(Duration::from_secs(1)).await; + } + } + + async fn task_tracker_monitor(self) -> anyhow::Result<()> { + let mut seen_trackers = HashSet::new(); + let mut tracker_futures = FuturesUnordered::new(); + let parse_url = |url: &[u8]| -> anyhow::Result { + let url = std::str::from_utf8(url).context("error parsing tracker URL")?; + let url = Url::parse(url).context("error parsing tracker URL")?; + Ok(url) + }; + for tracker in self.inner.torrent.iter_announce() { + if seen_trackers.contains(&tracker) { + continue; + } + seen_trackers.insert(tracker); + let tracker_url = match parse_url(tracker) { + Ok(url) => url, + Err(e) => { + warn!("ignoring tracker: {:#}", e); + continue; + } + }; + tracker_futures.push(self.clone().single_tracker_monitor(tracker_url)); + } + + while tracker_futures.next().await.is_some() {} + Ok(()) + } + async fn task_incoming_rx_handler( + self, + mut incoming_tx: tokio::sync::mpsc::Receiver<(PeerHandle, MessageOwned)>, + ) -> anyhow::Result<()> { + loop { + let (peer_handle, message): (PeerHandle, MessageOwned) = match incoming_tx.recv().await + { + Some(msg) => msg, + None => { + return Ok(()); + } + }; + + match message { + Message::Request(request) => { + warn!( + "{}: received {:?} , but download requests not implemented", + peer_handle, request + ) + } + Message::Bitfield(b) => self.on_bitfield(peer_handle, b), + Message::Choke => self.on_i_am_choked(peer_handle), + Message::Unchoke => self.on_i_am_unchoked(peer_handle), + Message::Interested => { + warn!( + "{} is interested, but support for interested messages not implemented", + peer_handle + ) + } + Message::Piece(piece) => { + self.on_received_piece(peer_handle, piece); + } + Message::KeepAlive => { + debug!("keepalive received from {}", peer_handle); + } + Message::Have(h) => self.on_have(peer_handle, h), + Message::NotInterested => { + info!("received \"not interested\", but we don't care yet") + } + } + } + } + fn am_i_interested_in_peer(&self, handle: PeerHandle) -> bool { + self.get_next_needed_piece(handle).is_some() + } + + fn on_have(&self, handle: PeerHandle, have: u32) { + if let Some(bitfield) = self + .inner + .locked + .write() + .peers + .get_live_mut(handle) + .and_then(|l| l.bitfield.as_mut()) + { + debug!("{}: updated bitfield with have={}", handle, have); + bitfield.set(have as usize, true) + } + } + + fn on_bitfield(&self, handle: PeerHandle, bitfield: ByteString) { + if bitfield.len() != self.inner.lengths.piece_bitfield_bytes() as usize { + warn!( + "dropping {} as its bitfield has unexpected size. Got {}, expected {}", + handle, + bitfield.len(), + self.inner.lengths.piece_bitfield_bytes(), + ); + self.inner.locked.write().peers.drop_peer(handle); + return; + } + self.inner + .locked + .write() + .peers + .update_bitfield_from_vec(handle, bitfield.0); + if !self.am_i_interested_in_peer(handle) { + self.inner.locked.write().peers.drop_peer(handle); + return; + } + + // Additional spawn per peer. + spawn( + format!("peer_chunk_requester({})", handle), + self.clone().task_peer_chunk_requester(handle), + ); + } + + async fn task_peer_chunk_requester(self, handle: PeerHandle) -> anyhow::Result<()> { + let tx = match self.inner.locked.read().peers.clone_tx(handle) { + Some(tx) => tx, + None => return Ok(()), + }; + tx.send(MessageOwned::Unchoke) + .await + .context("peer dropped")?; + tx.send(MessageOwned::Interested) + .await + .context("peer dropped")?; + + self.requester(handle).await?; + Ok::<_, anyhow::Error>(()) + } + + fn on_i_am_choked(&self, handle: PeerHandle) { + warn!("we are choked by {}", handle); + self.inner + .locked + .write() + .peers + .mark_i_am_choked(handle, true); + } + fn am_i_choked(&self, peer_handle: PeerHandle) -> Option { + self.inner + .locked + .read() + .peers + .states + .get(&peer_handle) + .and_then(|s| match s { + PeerState::Live(l) => Some(l.i_am_choked), + _ => None, + }) + } + + async fn requester(self, handle: PeerHandle) -> anyhow::Result<()> { + let notify = match self.inner.locked.read().peers.get_live(handle) { + Some(l) => l.have_notify.clone(), + None => return Ok(()), + }; + // TODO: this might dangle + tokio::time::timeout(Duration::from_secs(60), notify.notified()).await; + + loop { + let next = match self.reserve_next_needed_piece(handle) { + Some(next) => next, + None => { + info!("no pieces to request from {}", handle); + let notify = match self.inner.locked.read().peers.get_live(handle) { + Some(l) => l.have_notify.clone(), + None => return Ok(()), + }; + // TODO: this might dangle + tokio::time::timeout(Duration::from_secs(60), notify.notified()).await; + continue; + } + }; + let tx = match self.inner.locked.read().peers.clone_tx(handle) { + Some(tx) => tx, + None => return Ok(()), + }; + let sem = match self.inner.locked.read().peers.get_live(handle) { + Some(live) => live.outstanding_requests.clone(), + None => return Ok(()), + }; + for chunk in self.inner.lengths.iter_chunk_infos(next) { + let request = Request { + index: next.get(), + begin: chunk.offset, + length: chunk.size, + }; + sem.acquire().await?.forget(); + tx.send(MessageOwned::Request(request)) + .await + .context("peer dropped")?; + } + } + } + fn on_i_am_unchoked(&self, handle: PeerHandle) { + debug!("we are unchoked by {}", handle); + let mut g = self.inner.locked.write(); + let live = match g.peers.get_live_mut(handle) { + Some(live) => live, + None => return, + }; + live.i_am_choked = false; + live.have_notify.notify_waiters(); + live.outstanding_requests.add_permits(16); + } + fn get_next_needed_piece(&self, peer_handle: PeerHandle) -> Option { + let g = self.inner.locked.read(); + let bf = match g.peers.states.get(&peer_handle)? { + PeerState::Live(l) => l.bitfield.as_ref()?, + _ => return None, + }; + for n in g.chunks.get_needed_pieces().iter_ones() { + if bf.get(n).map(|v| *v) == Some(true) { + // in theory it should be safe without validation, but whatever. + return self.inner.lengths.validate_piece_index(n as u32); + } + } + None + } + + fn reserve_next_needed_piece(&self, peer_handle: PeerHandle) -> Option { + if self.am_i_choked(peer_handle)? { + warn!("we are choked by {}, can't reserve next piece", peer_handle); + return None; + } + let mut g = self.inner.locked.write(); + let n = { + let mut n_opt = None; + let bf = g.peers.get_live(peer_handle)?.bitfield.as_ref()?; + for n in g.chunks.get_needed_pieces().iter_ones() { + if bf.get(n).map(|v| *v) == Some(true) { + n_opt = Some(n); + break; + } + } + self.inner.lengths.validate_piece_index(n_opt? as u32)? + }; + + g.peers + .get_live_mut(peer_handle)? + .requested_pieces + .insert(n); + g.chunks.reserve_needed_piece(n); + Some(n) + } + + fn check_piece_blocking( + &self, + who_sent: PeerHandle, + index: ValidPieceIndex, + ) -> anyhow::Result { + let mut h = sha1::Sha1::new(); + let piece_length = self.inner.lengths.piece_length(index); + let mut absolute_offset = self.inner.lengths.piece_offset(index); + let mut buf = vec![0; std::cmp::min(8192, piece_length as usize)]; + + let mut left_to_read = piece_length as usize; + + for (file_idx, file_len) in self.inner.torrent.info.iter_file_lengths().enumerate() { + if absolute_offset > file_len { + absolute_offset -= file_len; + continue; + } + let file_remaining_len = file_len - absolute_offset; + + let mut left_to_read_in_file = + std::cmp::min(file_remaining_len, left_to_read as u64) as usize; + let mut file_g = self.inner.files[file_idx].lock(); + trace!("piece={}, seeking to {}", index, absolute_offset); + file_g + .seek(std::io::SeekFrom::Start(absolute_offset)) + .with_context(|| { + format!( + "error seeking to {}, file id: {}", + absolute_offset, file_idx + ) + })?; + while left_to_read_in_file > 0 { + let chunk_length = std::cmp::min(buf.len(), left_to_read_in_file); + file_g + .read_exact(&mut buf[..chunk_length]) + .with_context(|| { + format!( + "error reading {} bytes, file_id: {}, left_to_read_in_file: {}", + chunk_length, file_idx, left_to_read_in_file + ) + })?; + h.update(&buf[..chunk_length]); + left_to_read_in_file -= chunk_length; + } + + match self.inner.torrent.info.compare_hash(index.get(), &h) { + Some(true) => { + debug!("piece={} hash matches", index); + } + Some(false) => { + warn!("the piece={} hash does not match", index); + return Ok(false); + } + None => { + // this is probably a bug? + warn!("compare_hash() did not find the piece"); + anyhow::bail!("compare_hash() did not find the piece"); + } + } + + left_to_read -= left_to_read_in_file; + + if left_to_read == 0 { + return Ok(true); + } + + absolute_offset = 0; + } + Ok(true) + } + + // TODO: this is a task per chunk, not good + async fn task_transmit_haves(self, index: u32) -> anyhow::Result<()> { + let mut unordered = FuturesUnordered::new(); + + for weak in self + .inner + .locked + .read() + .peers + .tx + .values() + .map(|v| Arc::downgrade(v)) + { + unordered.push(async move { + if let Some(tx) = weak.upgrade() { + if tx.send(Message::Have(index)).await.is_err() { + // whatever + } + } + }); + } + + while unordered.next().await.is_some() {} + Ok(()) + } + + fn write_chunk_blocking( + &self, + who_sent: PeerHandle, + chunk: &Piece, + ) -> anyhow::Result<()> { + let mut absolute_offset = + self.inner.torrent.info.piece_length as u64 * chunk.index as u64 + chunk.begin as u64; + + let mut buf = chunk.block.as_ref(); + + for (file_idx, file_len) in self.inner.torrent.info.iter_file_lengths().enumerate() { + if absolute_offset > file_len { + absolute_offset -= file_len; + continue; + } + + let remaining_len = file_len - absolute_offset; + let to_write = std::cmp::min(buf.len(), remaining_len as usize); + + let mut file_g = self.inner.files[file_idx].lock(); + debug!( + "piece={}, handle={}, writing {} bytes to file {} at offset {}", + chunk.index, who_sent, to_write, file_idx, absolute_offset + ); + debug!("piece={}, seeking to {}", chunk.index, absolute_offset); + file_g.seek(std::io::SeekFrom::Start(absolute_offset))?; + file_g.write_all(&buf[..to_write])?; + buf = &buf[to_write..]; + if buf.is_empty() { + break; + } + + absolute_offset = 0; + } + + Ok(()) + } + + fn on_received_piece(&self, handle: PeerHandle, piece: Piece) -> Option<()> { + let chunk_info = match self + .inner + .lengths + .chunk_info_from_received_piece_data(&piece) + { + Some(i) => i, + None => { + warn!( + "peer {} sent us a piece that is invalid {:?}, dropping", + handle, &piece, + ); + self.drop_peer(handle); + return None; + } + }; + + let mut g = self.inner.locked.write(); + let h = g.peers.get_live_mut(handle)?; + h.outstanding_requests.add_permits(1); + + self.inner + .fetched_bytes + .fetch_add(piece.block.len() as u64, Ordering::Relaxed); + + if !h.requested_pieces.contains(&chunk_info.piece_index) { + warn!( + "peer {} sent us a piece that we did not ask for, dropping it. Requested pieces: {:?}. Got: {:?}", handle, &h.requested_pieces, &piece, + ); + self.drop_peer(handle); + return None; + } + + let this = self.clone(); + spawn_blocking( + format!("write_and_check(piece={}, block={:?})", piece.index, &piece), + move || { + let index = piece.index; + this.write_chunk_blocking(handle, &piece)?; + + let piece_done = match this + .inner + .locked + .write() + .chunks + .mark_chunk_downloaded(&piece) + { + Some(true) => { + debug!( + "piece={} done, requesting a piece from {}", + piece.index, handle + ); + true + } + Some(false) => false, + None => { + warn!( + "bogus data received from {}: {:?}, cannot map this to a chunk, dropping peer", + handle, piece + ); + this.drop_peer(handle); + return Ok(()); + } + }; + + if !piece_done { + return Ok(()); + } + // Ignore responses about this piece from now on. + this.inner + .locked + .write() + .peers + .get_live_mut(handle) + .map(|l| l.requested_pieces.remove(&chunk_info.piece_index)); + + let clone = this.clone(); + match clone + .check_piece_blocking(handle, chunk_info.piece_index) + .with_context(|| format!("error checking piece={}", index))? + { + true => { + this.inner.downloaded.fetch_add( + this.inner.lengths.piece_length(chunk_info.piece_index) as u64, + Ordering::Relaxed, + ); + debug!( + "piece={} successfully downloaded and verified from {}", + index, handle + ); + spawn( + "transmit haves", + this.clone().task_transmit_haves(piece.index), + ); + } + false => { + warn!( + "checksum for piece={} did not validate, came from {}", + index, handle + ); + this.inner + .locked + .write() + .chunks + .mark_piece_needed(chunk_info.piece_index); + // this.drop_peer(handle); + } + }; + Ok::<_, anyhow::Error>(()) + }, + ); + Some(()) + } + fn into_handle(self) -> TorrentManagerHandle { + TorrentManagerHandle { manager: self } + } + fn get_uploaded(&self) -> u64 { + self.inner.uploaded.load(Ordering::Relaxed) + } + fn get_downloaded(&self) -> u64 { + self.inner.downloaded.load(Ordering::Relaxed) + } + async fn tracker_one_request(&self, tracker_url: Url) -> anyhow::Result { + let response: reqwest::Response = reqwest::get(tracker_url).await?; + let bytes = response.bytes().await?; + let response = crate::serde_bencode::from_bytes::(&bytes)?; + + for peer in response.peers.iter_sockaddrs() { + self.add_peer(peer); + } + Ok(response.interval) + } + fn get_total(&self) -> u64 { + if let Some(length) = self.inner.torrent.info.length { + return length; + } + self.inner + .torrent + .info + .files + .as_ref() + .map(|files| files.iter().map(|f| f.length).sum()) + .unwrap_or_default() + } + fn get_left_to_download(&self) -> u64 { + self.get_total() - self.get_downloaded() + } + + async fn single_tracker_monitor(self, mut tracker_url: Url) -> anyhow::Result<()> { + let mut event = Some(TrackerRequestEvent::Started); + loop { + let request = TrackerRequest { + info_hash: self.inner.torrent.info_hash, + peer_id: self.inner.peer_id, + port: 6778, + uploaded: self.get_uploaded(), + downloaded: self.get_downloaded(), + left: self.get_left_to_download(), + compact: true, + no_peer_id: false, + event, + ip: None, + numwant: None, + key: None, + trackerid: None, + }; + + let request_query = request.as_querystring(); + tracker_url.set_query(Some(&request_query)); + + let this = self.clone(); + match this.tracker_one_request(tracker_url.clone()).await { + Ok(interval) => { + event = None; + let duration = Duration::from_secs(interval); + debug!( + "sleeping for {:?} after calling tracker {}", + duration, + tracker_url.host().unwrap() + ); + tokio::time::sleep(duration).await; + } + Err(e) => { + error!("error calling the tracker {}: {:#}", tracker_url, e); + tokio::time::sleep(Duration::from_secs(60)).await; + } + }; + } + } + fn set_peer_live(&self, handle: PeerHandle, addr: SocketAddr, h: Handshake) { + let mut g = self.inner.locked.write(); + match g.peers.states.get_mut(&handle) { + Some(s @ &mut PeerState::Connecting(_)) => { + *s = PeerState::Live(LivePeerState { + peer_id: h.peer_id, + i_am_choked: true, + peer_choked: true, + peer_interested: false, + bitfield: None, + have_notify: Arc::new(Notify::new()), + outstanding_requests: Arc::new(Semaphore::new(0)), + requested_pieces: Default::default(), + }); + } + _ => { + warn!("peer {} was in wrong state", handle); + } + } + } + async fn manage_peer( + &self, + addr: SocketAddr, + handle: PeerHandle, + incoming_chan: tokio::sync::mpsc::Sender<(PeerHandle, MessageOwned)>, + // outgoing_chan_tx: tokio::sync::mpsc::Sender, + mut outgoing_chan: tokio::sync::mpsc::Receiver, + ) -> anyhow::Result<()> { + use tokio::io::AsyncReadExt; + use tokio::io::AsyncWriteExt; + let mut conn = tokio::net::TcpStream::connect(addr).await?; + let handshake = Handshake::new(self.inner.info_hash, self.inner.peer_id); + conn.write_all(&handshake.serialize()).await?; + let mut read_buf = vec![0u8; 16384 * 2]; + let read_bytes = conn.read(&mut read_buf).await?; + if read_bytes == 0 { + anyhow::bail!("bad handshake"); + } + let (h, hlen) = Handshake::deserialize(&read_buf[..read_bytes]) + .map_err(|e| anyhow::anyhow!("error deserializing handshake: {:?}", e))?; + + let mut read_so_far = 0usize; + debug!( + "connected peer {}: {:?}", + addr, + try_decode_peer_id(h.peer_id) + ); + if h.info_hash != self.inner.info_hash { + anyhow::bail!("info hash does not match"); + } + + self.set_peer_live(handle, addr, h); + + if read_bytes > hlen { + read_buf.copy_within(hlen..read_bytes, 0); + read_so_far = read_bytes - hlen; + } + + let (mut read_half, mut write_half) = tokio::io::split(conn); + + let writer = async move { + let mut buf = vec![0u8; 1024]; + let keep_alive_interval = Duration::from_secs(120); + loop { + let msg = + match tokio::time::timeout(keep_alive_interval, outgoing_chan.recv()).await { + Ok(Some(msg)) => msg, + Ok(None) => return Err(anyhow::anyhow!("torrent manager closed")), + Err(_) => MessageOwned::KeepAlive, + }; + + let len = msg.serialize(&mut buf); + debug!("sending to {}: {:?}, length={}", handle, &msg, len); + + write_half + .write_all(&buf[..len]) + .await + .context("error writing")?; + } + + // For type inference. + #[allow(unreachable_code)] + Ok::<_, anyhow::Error>(()) + }; + + let reader = async move { + loop { + let (message, size) = loop { + match MessageBorrowed::deserialize(&read_buf[..read_so_far]) { + Ok((msg, size)) => break (msg.clone_to_owned(), size), + Err(MessageDeserializeError::NotEnoughData(d, _)) => { + if read_buf.len() < read_so_far + d { + read_buf.reserve(d); + read_buf.resize(read_buf.capacity(), 0); + } + } + Err(e) => return Err(e.into()), + } + + let size = read_half + .read(&mut read_buf[read_so_far..]) + .await + .context("error reading from peer")?; + if size == 0 { + anyhow::bail!("disconnected while reading, read so far: {}", read_so_far) + } + read_so_far += size; + }; + + if read_so_far > size { + read_buf.copy_within(size..read_so_far, 0); + } + read_so_far -= size; + + incoming_chan + .send((handle, message)) + .await + .context("error sending received message")?; + } + + // For type inference. + #[allow(unreachable_code)] + Ok::<_, anyhow::Error>(()) + }; + + let r = tokio::select! { + r = reader => {r} + r = writer => {r} + }; + debug!("{}: either reader or writer are done, exiting", handle); + r + } + fn drop_peer(&self, handle: PeerHandle) -> bool { + let mut g = self.inner.locked.write(); + let peer = match g.peers.drop_peer(handle) { + Some(peer) => peer, + None => return false, + }; + match peer { + PeerState::Connecting(_) => {} + PeerState::Live(l) => { + for piece in l.requested_pieces { + g.chunks.mark_piece_needed(piece); + } + } + } + true + } + fn add_peer(&self, addr: SocketAddr) { + let (out_tx, out_rx) = tokio::sync::mpsc::channel::(1); + let handle = match self + .inner + .locked + .write() + .peers + .add_if_not_seen(addr, out_tx) + { + Some(handle) => handle, + None => return, + }; + + let this = self.clone(); + spawn(format!("manage_peer({})", handle), async move { + if let Err(e) = this + .manage_peer(addr, handle, this.inner.incoming_tx.clone(), out_rx) + .await + { + error!("error managing peer, will drop {}: {:#}", handle, e) + }; + this.drop_peer(handle); + Ok::<_, anyhow::Error>(()) + }); + } +} diff --git a/crates/librqbit/src/torrent_metainfo.rs b/crates/librqbit/src/torrent_metainfo.rs new file mode 100644 index 0000000..c348dbd --- /dev/null +++ b/crates/librqbit/src/torrent_metainfo.rs @@ -0,0 +1,253 @@ +use std::{fs::File, ops::Deref, path::PathBuf}; + +use serde::Deserialize; + +use crate::{ + buffers::{ByteBuf, ByteString}, + clone_to_owned::CloneToOwned, + serde_bencode::BencodeDeserializer, +}; + +pub type TorrentMetaV1Borrowed<'a> = TorrentMetaV1>; +pub type TorrentMetaV1Owned = TorrentMetaV1; + +pub fn torrent_from_bytes(buf: &[u8]) -> anyhow::Result> { + let mut de = BencodeDeserializer::new_from_buf(buf); + de.is_torrent_info = true; + let mut t = TorrentMetaV1::deserialize(&mut de)?; + t.info_hash = de.torrent_info_digest.unwrap(); + Ok(t) +} + +pub fn torrent_from_bytes_owned(buf: &[u8]) -> anyhow::Result { + let mut de = BencodeDeserializer::new_from_buf(buf); + de.is_torrent_info = true; + let mut t = TorrentMetaV1Owned::deserialize(&mut de)?; + t.info_hash = de.torrent_info_digest.unwrap(); + Ok(t) +} + +#[derive(Deserialize, Debug, Clone)] +pub struct TorrentMetaV1 { + pub announce: BufType, + #[serde(rename = "announce-list")] + pub announce_list: Vec>, + pub info: TorrentMetaV1Info, + pub comment: Option, + #[serde(rename = "created by")] + pub created_by: Option, + pub encoding: Option, + pub publisher: Option, + #[serde(rename = "publisher-url")] + pub publisher_url: Option, + #[serde(rename = "creation date")] + pub creation_date: Option, + + #[serde(skip)] + pub info_hash: [u8; 20], +} + +impl TorrentMetaV1 { + pub fn iter_announce(&self) -> impl Iterator { + std::iter::once(&self.announce).chain(self.announce_list.iter().flatten()) + } +} + +#[derive(Deserialize, Debug, Clone)] +pub struct TorrentMetaV1Info { + pub name: Option, + pub pieces: BufType, + #[serde(rename = "piece length")] + pub piece_length: u32, + + // Single-file mode + pub length: Option, + pub md5sum: Option, + + // Multi-file mode + pub files: Option>>, +} + +pub enum FileIteratorName<'a, ByteBuf> { + Single(Option<&'a ByteBuf>), + Tree(&'a [ByteBuf]), +} + +impl<'a, ByteBuf> FileIteratorName<'a, ByteBuf> { + pub fn iter_components(&self) -> impl Iterator> { + let single_it = std::iter::once(match self { + FileIteratorName::Single(n) => Some(*n), + FileIteratorName::Tree(_) => None, + }); + let multi_it = match self { + FileIteratorName::Single(_) => &[], + FileIteratorName::Tree(t) => *t, + } + .iter() + .map(|p| Some(Some(p))); + + single_it.chain(multi_it).flatten() + } +} + +impl> TorrentMetaV1Info { + pub fn compare_hash(&self, piece: u32, hash: &sha1::Sha1) -> Option { + let start = piece as usize * 20; + let end = start + 20; + let expected_hash = self.pieces.deref().get(start..end)?; + Some(expected_hash == hash.digest().bytes()) + } + pub fn iter_filenames_and_lengths( + &self, + ) -> impl Iterator, u64)> { + let single_it = std::iter::once(match (self.name.as_ref(), self.length) { + (Some(n), Some(l)) => Some((FileIteratorName::Single(Some(n)), l)), + _ => None, + }); + let multi_it = self + .files + .as_deref() + .unwrap_or_default() + .iter() + .map(|f| Some((FileIteratorName::Tree(&f.path), f.length))); + single_it.chain(multi_it).flatten() + } + pub fn iter_file_lengths(&self) -> impl Iterator + '_ { + std::iter::once(self.length) + .chain( + self.files + .as_deref() + .unwrap_or_default() + .iter() + .map(|f| Some(f.length)), + ) + .flatten() + } +} + +#[derive(Deserialize, Debug, Clone)] +pub struct TorrentMetaV1File { + pub length: u64, + pub path: Vec, +} + +impl TorrentMetaV1File +where + BufType: Clone + AsRef<[u8]>, +{ + pub fn full_path(&self, parent: &mut PathBuf) -> anyhow::Result<()> { + for p in self.path.iter() { + let bit = std::str::from_utf8(p.as_ref())?; + parent.push(bit); + } + Ok(()) + } +} + +impl CloneToOwned for TorrentMetaV1File +where + ByteBuf: CloneToOwned + Clone, + ::Target: Clone, +{ + type Target = TorrentMetaV1File<::Target>; + + fn clone_to_owned(&self) -> Self::Target { + TorrentMetaV1File { + length: self.length, + path: self.path.clone_to_owned(), + } + } +} + +impl CloneToOwned for TorrentMetaV1Info +where + ByteBuf: CloneToOwned + Clone, + ::Target: Clone, +{ + type Target = TorrentMetaV1Info<::Target>; + + fn clone_to_owned(&self) -> Self::Target { + TorrentMetaV1Info { + name: self.name.clone_to_owned(), + pieces: self.pieces.clone_to_owned(), + piece_length: self.piece_length, + length: self.length, + md5sum: self.md5sum.clone_to_owned(), + files: self.files.clone_to_owned(), + } + } +} + +impl CloneToOwned for TorrentMetaV1 +where + ByteBuf: CloneToOwned + Clone, + ::Target: Clone, +{ + type Target = TorrentMetaV1<::Target>; + + fn clone_to_owned(&self) -> Self::Target { + TorrentMetaV1 { + announce: self.announce.clone_to_owned(), + announce_list: self.announce_list.clone_to_owned(), + info: self.info.clone_to_owned(), + comment: self.comment.clone_to_owned(), + created_by: self.created_by.clone_to_owned(), + encoding: self.encoding.clone_to_owned(), + publisher: self.publisher.clone_to_owned(), + publisher_url: self.publisher_url.clone_to_owned(), + creation_date: self.creation_date, + info_hash: self.info_hash, + } + } +} + +#[cfg(test)] +mod tests { + use std::io::Read; + + use crate::serde_bencode::from_bytes; + + use super::*; + + #[test] + fn test_deserialize_torrent_owned() { + let mut buf = Vec::new(); + let filename = "resources/ubuntu-21.04-desktop-amd64.iso.torrent"; + std::fs::File::open(filename) + .unwrap() + .read_to_end(&mut buf) + .unwrap(); + + let torrent: TorrentMetaV1Owned = from_bytes(&buf).unwrap(); + dbg!(torrent); + } + + #[test] + fn test_deserialize_torrent_borrowed() { + let mut buf = Vec::new(); + let filename = "resources/ubuntu-21.04-desktop-amd64.iso.torrent"; + std::fs::File::open(filename) + .unwrap() + .read_to_end(&mut buf) + .unwrap(); + + let torrent: TorrentMetaV1Borrowed = from_bytes(&buf).unwrap(); + dbg!(torrent); + } + + #[test] + fn test_deserialize_torrent_with_info_hash() { + let mut buf = Vec::new(); + let filename = "resources/ubuntu-21.04-desktop-amd64.iso.torrent"; + std::fs::File::open(filename) + .unwrap() + .read_to_end(&mut buf) + .unwrap(); + + let torrent = torrent_from_bytes(&buf).unwrap(); + assert_eq!( + torrent.info_hash, + *b"\x64\xa9\x80\xab\xe6\xe4\x48\x22\x6b\xb9\x30\xba\x06\x15\x92\xe4\x4c\x37\x81\xa1" + ); + } +} diff --git a/crates/librqbit/src/tracker_comms.rs b/crates/librqbit/src/tracker_comms.rs new file mode 100644 index 0000000..18de7a9 --- /dev/null +++ b/crates/librqbit/src/tracker_comms.rs @@ -0,0 +1,228 @@ +use byteorder::ByteOrder; +use serde::{Deserialize, Deserializer}; +use std::{ + fmt::Write, + marker::PhantomData, + net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}, + str::FromStr, +}; + +use crate::buffers::ByteBuf; + +#[derive(Clone, Copy)] +pub enum TrackerRequestEvent { + Started, + Stopped, + Completed, +} + +pub struct TrackerRequest { + pub info_hash: [u8; 20], + pub peer_id: [u8; 20], + pub event: Option, + pub port: u16, + pub uploaded: u64, + pub downloaded: u64, + pub left: u64, + pub compact: bool, + pub no_peer_id: bool, + + pub ip: Option, + pub numwant: Option, + pub key: Option, + pub trackerid: Option, +} + +#[derive(Deserialize, Debug)] +pub struct TrackerError<'a> { + #[serde(rename = "failure reason", borrow)] + failure_reason: ByteBuf<'a>, +} + +#[derive(Deserialize, Debug)] +pub struct DictPeer<'a> { + #[serde(deserialize_with = "deserialize_ip_string")] + ip: IpAddr, + #[serde(borrow)] + peer_id: Option>, + port: u16, +} + +impl<'a> DictPeer<'a> { + fn as_sockaddr(&self) -> SocketAddr { + SocketAddr::new(self.ip, self.port) + } +} + +#[derive(Debug)] +pub enum Peers<'a> { + Full(Vec>), + Compact(Vec), +} + +impl<'a> Peers<'a> { + pub fn iter_sockaddrs(&self) -> Box + '_> { + match self { + Peers::Full(d) => Box::new(d.iter().map(DictPeer::as_sockaddr)), + Peers::Compact(c) => Box::new(c.iter().copied().map(SocketAddr::V4)), + } + } +} + +impl<'de: 'a, 'a> serde::de::Deserialize<'de> for Peers<'a> { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct Visitor<'de> { + phantom: std::marker::PhantomData<&'de ()>, + } + impl<'de> serde::de::Visitor<'de> for Visitor<'de> { + type Value = Peers<'de>; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a list of peers in dict or binary format") + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: serde::de::SeqAccess<'de>, + { + let mut peers = Vec::new(); + while let Some(peer) = seq.next_element::()? { + peers.push(peer) + } + Ok(Peers::Full(peers)) + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: serde::de::Error, + { + Ok(Peers::Compact(parse_compact_peers(v))) + } + } + deserializer.deserialize_any(Visitor { + phantom: PhantomData, + }) + } +} + +fn deserialize_ip_string<'de, D>(de: D) -> Result +where + D: Deserializer<'de>, +{ + struct Visitor; + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = IpAddr; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("expecting an IPv4 address") + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + IpAddr::from_str(v).map_err(|e| E::custom(format!("cannot parse ip: {}", e))) + } + } + de.deserialize_str(Visitor {}) +} + +fn parse_compact_peers(b: &[u8]) -> Vec { + let mut ips = Vec::new(); + for chunk in b.chunks_exact(6) { + let ip_chunk = &chunk[..4]; + let port_chunk = &chunk[4..6]; + let ipaddr = Ipv4Addr::new(ip_chunk[0], ip_chunk[1], ip_chunk[2], ip_chunk[3]); + let port = byteorder::BigEndian::read_u16(port_chunk); + ips.push(SocketAddrV4::new(ipaddr, port)); + } + ips +} + +#[derive(Deserialize, Debug)] +pub struct CompactTrackerResponse<'a> { + #[serde(rename = "warning message", borrow)] + pub warning_message: Option>, + pub complete: u64, + pub interval: u64, + #[serde(rename = "min interval")] + pub min_interval: Option, + pub tracker_id: Option>, + pub incomplete: u64, + pub peers: Peers<'a>, +} + +impl TrackerRequest { + pub fn as_querystring(&self) -> String { + use urlencoding as u; + let mut s = String::new(); + s.push_str("info_hash="); + s.push_str(u::encode_binary(&self.info_hash).as_ref()); + s.push_str("&peer_id="); + s.push_str(u::encode_binary(&self.peer_id).as_ref()); + if let Some(event) = self.event { + write!( + s, + "&event={}", + match event { + TrackerRequestEvent::Started => "started", + TrackerRequestEvent::Stopped => "stopped", + TrackerRequestEvent::Completed => "completed", + } + ) + .unwrap(); + } + write!(s, "&port={}", self.port).unwrap(); + write!(s, "&uploaded={}", self.uploaded).unwrap(); + write!(s, "&downloaded={}", self.downloaded).unwrap(); + write!(s, "&left={}", self.left).unwrap(); + write!(s, "&compact={}", if self.compact { 1 } else { 0 }).unwrap(); + write!(s, "&no_peer_id={}", if self.no_peer_id { 1 } else { 0 }).unwrap(); + if let Some(ip) = &self.ip { + write!(s, "&ip={}", ip).unwrap(); + } + if let Some(numwant) = &self.numwant { + write!(s, "&numwant={}", numwant).unwrap(); + } + if let Some(key) = &self.key { + write!(s, "&key={}", key).unwrap(); + } + if let Some(trackerid) = &self.trackerid { + write!(s, "&trackerid={}", trackerid).unwrap(); + } + s + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_serialize() { + let info_hash = [ + 1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + ]; + let peer_id = [ + 1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + ]; + let request = TrackerRequest { + info_hash, + peer_id, + port: 6881, + uploaded: 0, + downloaded: 0, + left: 1024 * 1024, + compact: true, + no_peer_id: false, + event: Some(TrackerRequestEvent::Started), + ip: Some("127.0.0.1".parse().unwrap()), + numwant: None, + key: None, + trackerid: None, + }; + dbg!(request.as_querystring()); + } +} diff --git a/crates/librqbit/src/type_aliases.rs b/crates/librqbit/src/type_aliases.rs new file mode 100644 index 0000000..2dfc5b9 --- /dev/null +++ b/crates/librqbit/src/type_aliases.rs @@ -0,0 +1 @@ +pub type BF = bitvec::vec::BitVec; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..fea5d8a --- /dev/null +++ b/src/main.rs @@ -0,0 +1,71 @@ +use std::{fs::File, io::Read}; + +use anyhow::Context; +use clap::Clap; +use librqbit::{ + clone_to_owned::CloneToOwned, torrent_manager::TorrentManagerBuilder, + torrent_metainfo::torrent_from_bytes, +}; +use log::info; + +#[derive(Clap)] +#[clap(version = "1.0", author = "Igor Katson ")] +struct Opts { + /// The filename or URL of the .torrent file. + torrent_path: String, + + /// The filename of the .torrent file. + output_folder: String, + + /// Set if you are ok to write on top of existing files + #[clap(long)] + overwrite: bool, +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + pretty_env_logger::init(); + + let opts = Opts::parse(); + + let torrent = + if opts.torrent_path.starts_with("http://") || opts.torrent_path.starts_with("https://") { + let response = reqwest::get(&opts.torrent_path).await.with_context(|| { + format!( + "error downloading torrent metadata from {}", + &opts.torrent_path + ) + })?; + if !response.status().is_success() { + anyhow::bail!("GET {} returned {}", &opts.torrent_path, response.status()) + } + let b = response.bytes().await.with_context(|| { + format!("error reading repsonse body from {}", &opts.torrent_path) + })?; + torrent_from_bytes(&b) + .context("error decoding torrent")? + .clone_to_owned() + } else { + let mut buf = Vec::new(); + if opts.torrent_path == "-" { + std::io::stdin() + .read_to_end(&mut buf) + .context("error reading stdin")?; + } else { + File::open(&opts.torrent_path) + .with_context(|| format!("error opening {}", &opts.torrent_path))? + .read_to_end(&mut buf) + .with_context(|| format!("error reading {}", &opts.torrent_path))?; + } + torrent_from_bytes(&buf) + .context("error decoding torrent")? + .clone_to_owned() + }; + + info!("Torrent metadata: {:#?}", &torrent); + + let builder = TorrentManagerBuilder::new(torrent, opts.output_folder).overwrite(opts.overwrite); + let manager_handle = builder.start_manager().await?; + manager_handle.wait_until_completed().await?; + Ok(()) +}