mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 17:55:36 +00:00
bittorrent_udp: response_from_bytes: improve announce part
This commit is contained in:
parent
13e7ef6b57
commit
928a82e4dc
1 changed files with 38 additions and 51 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
use byteorder::{ReadBytesExt, WriteBytesExt, NetworkEndian};
|
use byteorder::{ReadBytesExt, WriteBytesExt, NetworkEndian};
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::{Read, Write};
|
use std::io::{Cursor, Write};
|
||||||
use std::net::{IpAddr, Ipv6Addr, Ipv4Addr};
|
use std::net::{IpAddr, Ipv6Addr, Ipv4Addr};
|
||||||
|
|
||||||
use crate::types;
|
use crate::types;
|
||||||
|
|
@ -108,64 +108,51 @@ pub fn response_from_bytes(
|
||||||
let leechers = bytes.read_i32::<NetworkEndian>()?;
|
let leechers = bytes.read_i32::<NetworkEndian>()?;
|
||||||
let seeders = bytes.read_i32::<NetworkEndian>()?;
|
let seeders = bytes.read_i32::<NetworkEndian>()?;
|
||||||
|
|
||||||
let mut peers = Vec::new();
|
let position = bytes.position() as usize;
|
||||||
|
let inner = bytes.into_inner();
|
||||||
|
|
||||||
loop {
|
let peers = if ip_version == types::IpVersion::IPv4 {
|
||||||
let mut opt_ip_address = None;
|
inner[position..].chunks_exact(6).map(|chunk| {
|
||||||
|
let ip_address = IpAddr::V4(
|
||||||
|
Ipv4Addr::new(chunk[0], chunk[1], chunk[2], chunk[3])
|
||||||
|
);
|
||||||
|
|
||||||
match ip_version {
|
let port = (&chunk[4..]).read_u16::<NetworkEndian>().unwrap();
|
||||||
types::IpVersion::IPv4 => {
|
|
||||||
let mut ip_bytes = [0; 4];
|
|
||||||
|
|
||||||
if bytes.read_exact(&mut ip_bytes).is_ok() {
|
types::ResponsePeer {
|
||||||
opt_ip_address = Some(IpAddr::V4(Ipv4Addr::new(
|
ip_address,
|
||||||
ip_bytes[0],
|
port: types::Port(port),
|
||||||
ip_bytes[1],
|
|
||||||
ip_bytes[2],
|
|
||||||
ip_bytes[3],
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
types::IpVersion::IPv6 => {
|
|
||||||
let mut ip_bytes = [0; 16];
|
|
||||||
|
|
||||||
if bytes.read_exact(&mut ip_bytes).is_ok() {
|
|
||||||
let mut ip_bytes_ref = &ip_bytes[..];
|
|
||||||
|
|
||||||
opt_ip_address = Some(IpAddr::V6(Ipv6Addr::new(
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
ip_bytes_ref.read_u16::<NetworkEndian>()?,
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
if let Some(ip_address) = opt_ip_address {
|
|
||||||
if let Ok(port) = bytes.read_u16::<NetworkEndian>() {
|
|
||||||
peers.push(types::ResponsePeer {
|
|
||||||
ip_address,
|
|
||||||
port: types::Port(port),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else {
|
}).collect()
|
||||||
break;
|
} else {
|
||||||
|
inner[position..].chunks_exact(18).map(|chunk| {
|
||||||
|
let mut cursor: Cursor<&[u8]> = Cursor::new(&chunk[..]);
|
||||||
|
|
||||||
|
let ip_address = IpAddr::V6(Ipv6Addr::new(
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
cursor.read_u16::<NetworkEndian>().unwrap(),
|
||||||
|
));
|
||||||
|
|
||||||
|
let port = cursor.read_u16::<NetworkEndian>().unwrap();
|
||||||
|
|
||||||
|
types::ResponsePeer {
|
||||||
|
ip_address,
|
||||||
|
port: types::Port(port),
|
||||||
}
|
}
|
||||||
}
|
}).collect()
|
||||||
else {
|
};
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(types::Response::Announce(types::AnnounceResponse {
|
Ok(types::Response::Announce(types::AnnounceResponse {
|
||||||
transaction_id: types::TransactionId(transaction_id),
|
transaction_id: types::TransactionId(transaction_id),
|
||||||
announce_interval: types::AnnounceInterval(announce_interval),
|
announce_interval: types::AnnounceInterval(announce_interval),
|
||||||
leechers: types::NumberOfPeers(leechers),
|
leechers: types::NumberOfPeers(leechers),
|
||||||
seeders: types::NumberOfPeers(seeders),
|
seeders: types::NumberOfPeers(seeders),
|
||||||
peers
|
peers
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue