From 8dc8c1e35dcbe1944cad73d4c6ef375adfa11933 Mon Sep 17 00:00:00 2001 From: Ivan Date: Sun, 18 Aug 2024 11:40:04 +0200 Subject: [PATCH 1/2] Implement Borrow<[u8]> for ByteBuf types so they can be properly used in hashmaps --- crates/buffers/src/lib.rs | 12 ++++++++++ crates/librqbit/src/peer_info_reader/mod.rs | 2 +- .../src/extended/handshake.rs | 23 ++++++------------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/crates/buffers/src/lib.rs b/crates/buffers/src/lib.rs index 2561678..e62510c 100644 --- a/crates/buffers/src/lib.rs +++ b/crates/buffers/src/lib.rs @@ -131,6 +131,18 @@ impl std::convert::AsRef<[u8]> for ByteBufOwned { } } +impl std::borrow::Borrow<[u8]> for ByteBufOwned { + fn borrow(&self) -> &[u8] { + &self.0 + } +} + +impl<'a> std::borrow::Borrow<[u8]> for ByteBuf<'a> { + fn borrow(&self) -> &[u8] { + self.0 + } +} + impl<'a> std::ops::Deref for ByteBuf<'a> { type Target = [u8]; diff --git a/crates/librqbit/src/peer_info_reader/mod.rs b/crates/librqbit/src/peer_info_reader/mod.rs index 9815f5e..6485cd0 100644 --- a/crates/librqbit/src/peer_info_reader/mod.rs +++ b/crates/librqbit/src/peer_info_reader/mod.rs @@ -215,7 +215,7 @@ impl PeerConnectionHandler for Handler { None => anyhow::bail!("peer does not have metadata_size"), }; - if extended_handshake.get_msgid(b"ut_metadata").is_none() { + if extended_handshake.ut_metadata().is_none() { anyhow::bail!("peer does not support ut_metadata"); } diff --git a/crates/peer_binary_protocol/src/extended/handshake.rs b/crates/peer_binary_protocol/src/extended/handshake.rs index e9a686f..e6d4d8a 100644 --- a/crates/peer_binary_protocol/src/extended/handshake.rs +++ b/crates/peer_binary_protocol/src/extended/handshake.rs @@ -47,24 +47,15 @@ impl ExtendedHandshake> { } } -impl ExtendedHandshake { - pub fn get_msgid(&self, msg_type: &[u8]) -> Option - where - ByteBuf: AsRef<[u8]>, - { - self.m.iter().find_map(|(k, v)| { - if k.as_ref() == msg_type { - Some(*v) - } else { - None - } - }) +impl<'a, ByteBuf> ExtendedHandshake +where + ByteBuf: Eq + std::hash::Hash + std::borrow::Borrow<[u8]>, +{ + fn get_msgid(&self, msg_type: &'a [u8]) -> Option { + self.m.get(msg_type).map(|v| *v) } - pub fn ut_metadata(&self) -> Option - where - ByteBuf: AsRef<[u8]>, - { + pub fn ut_metadata(&self) -> Option { self.get_msgid(b"ut_metadata") } } From 19e944a697c0a740c983117230d1cf1ad802a4e3 Mon Sep 17 00:00:00 2001 From: Ivan Date: Sun, 18 Aug 2024 11:59:39 +0200 Subject: [PATCH 2/2] Create constant for ut_metadata --- crates/peer_binary_protocol/src/extended/handshake.rs | 6 +++--- crates/peer_binary_protocol/src/lib.rs | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/peer_binary_protocol/src/extended/handshake.rs b/crates/peer_binary_protocol/src/extended/handshake.rs index e6d4d8a..e3cd460 100644 --- a/crates/peer_binary_protocol/src/extended/handshake.rs +++ b/crates/peer_binary_protocol/src/extended/handshake.rs @@ -10,7 +10,7 @@ use bytes::Bytes; use clone_to_owned::CloneToOwned; use serde::{Deserialize, Deserializer, Serialize}; -use crate::MY_EXTENDED_UT_METADATA; +use crate::{EXTENDED_UT_METADATA_KEY, MY_EXTENDED_UT_METADATA}; #[derive(Deserialize, Serialize, Debug, Default)] pub struct ExtendedHandshake { @@ -39,7 +39,7 @@ pub struct ExtendedHandshake { impl ExtendedHandshake> { pub fn new() -> Self { let mut features = HashMap::new(); - features.insert(ByteBuf(b"ut_metadata"), MY_EXTENDED_UT_METADATA); + features.insert(ByteBuf(EXTENDED_UT_METADATA_KEY), MY_EXTENDED_UT_METADATA); Self { m: features, ..Default::default() @@ -56,7 +56,7 @@ where } pub fn ut_metadata(&self) -> Option { - self.get_msgid(b"ut_metadata") + self.get_msgid(EXTENDED_UT_METADATA_KEY) } } diff --git a/crates/peer_binary_protocol/src/lib.rs b/crates/peer_binary_protocol/src/lib.rs index b187072..a6b2e7a 100644 --- a/crates/peer_binary_protocol/src/lib.rs +++ b/crates/peer_binary_protocol/src/lib.rs @@ -44,6 +44,7 @@ const MSGID_PIECE: u8 = 7; const MSGID_CANCEL: u8 = 8; const MSGID_EXTENDED: u8 = 20; +pub const EXTENDED_UT_METADATA_KEY: &[u8] = b"ut_metadata"; pub const MY_EXTENDED_UT_METADATA: u8 = 3; #[derive(Debug)]