From 13e7ef6b578ec1d595108ac1ee85a772ade691f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Thu, 9 Apr 2020 20:43:42 +0200 Subject: [PATCH] bittorrent_udp: response_from_bytes: more fixes --- aquatic_bench/src/bin/bench_handlers/main.rs | 2 +- bittorrent_udp/src/converters/responses.rs | 31 ++++++++------------ 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/aquatic_bench/src/bin/bench_handlers/main.rs b/aquatic_bench/src/bin/bench_handlers/main.rs index 8e08f84..5e92e23 100644 --- a/aquatic_bench/src/bin/bench_handlers/main.rs +++ b/aquatic_bench/src/bin/bench_handlers/main.rs @@ -53,7 +53,7 @@ fn print_results( fn main(){ - let num_rounds = 10; + let num_rounds = 1; let mut connect_data = (0.0, 0.0); let mut announce_data = (0.0, 0.0); diff --git a/bittorrent_udp/src/converters/responses.rs b/bittorrent_udp/src/converters/responses.rs index 6df923c..d78400f 100644 --- a/bittorrent_udp/src/converters/responses.rs +++ b/bittorrent_udp/src/converters/responses.rs @@ -173,21 +173,20 @@ pub fn response_from_bytes( // Scrape 2 => { - let mut stats = Vec::new(); + let position = bytes.position() as usize; + let inner = bytes.into_inner(); - let mut buf = [0u8; 12]; + let stats = inner[position..].chunks_exact(12).map(|chunk| { + let seeders = (&chunk[0..4]).read_i32::().unwrap(); + let downloads = (&chunk[4..8]).read_i32::().unwrap(); + let leechers = (&chunk[8..12]).read_i32::().unwrap(); - while let Ok(()) = bytes.read_exact(&mut buf){ - let seeders = (&buf[0..4]).read_i32::().unwrap(); - let downloads = (&buf[4..8]).read_i32::().unwrap(); - let leechers = (&buf[8..12]).read_i32::().unwrap(); - - stats.push(types::TorrentScrapeStatistics { + types::TorrentScrapeStatistics { seeders: types::NumberOfPeers(seeders), completed: types::NumberOfDownloads(downloads), leechers:types::NumberOfPeers(leechers) - }) - } + } + }).collect(); Ok(types::Response::Scrape(types::ScrapeResponse { transaction_id: types::TransactionId(transaction_id), @@ -197,18 +196,12 @@ pub fn response_from_bytes( // Error 3 => { - let mut message_bytes = Vec::new(); - - bytes.read_to_end(&mut message_bytes)?; - - let message = match String::from_utf8(message_bytes) { - Ok(message) => message, - Err(_) => "".to_string() - }; + let position = bytes.position() as usize; + let inner = bytes.into_inner(); Ok(types::Response::Error(types::ErrorResponse { transaction_id: types::TransactionId(transaction_id), - message + message: String::from_utf8_lossy(&inner[position..]).into() })) },