mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 17:55:36 +00:00
bittorrent_udp: response_to_bytes: return Result<(), io:Error>
This commit is contained in:
parent
054d36b316
commit
9bf17b0ab4
5 changed files with 28 additions and 32 deletions
|
|
@ -209,7 +209,7 @@ fn handle_readable_socket(
|
||||||
for (response, src) in responses.drain(..) {
|
for (response, src) in responses.drain(..) {
|
||||||
cursor.set_position(0);
|
cursor.set_position(0);
|
||||||
|
|
||||||
response_to_bytes(&mut cursor, response, IpVersion::IPv4);
|
response_to_bytes(&mut cursor, response, IpVersion::IPv4).unwrap();
|
||||||
|
|
||||||
let amt = cursor.position() as usize;
|
let amt = cursor.position() as usize;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ pub fn bench(
|
||||||
|
|
||||||
cursor.set_position(0);
|
cursor.set_position(0);
|
||||||
|
|
||||||
response_to_bytes(&mut cursor, response, IpVersion::IPv4);
|
response_to_bytes(&mut cursor, response, IpVersion::IPv4).unwrap();
|
||||||
|
|
||||||
dummy ^= cursor.get_ref()[0];
|
dummy ^= cursor.get_ref()[0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ pub fn bench(
|
||||||
|
|
||||||
cursor.set_position(0);
|
cursor.set_position(0);
|
||||||
|
|
||||||
response_to_bytes(&mut cursor, response, IpVersion::IPv4);
|
response_to_bytes(&mut cursor, response, IpVersion::IPv4).unwrap();
|
||||||
|
|
||||||
dummy ^= cursor.get_ref()[0];
|
dummy ^= cursor.get_ref()[0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ pub fn bench(
|
||||||
|
|
||||||
cursor.set_position(0);
|
cursor.set_position(0);
|
||||||
|
|
||||||
response_to_bytes(&mut cursor, response, IpVersion::IPv4);
|
response_to_bytes(&mut cursor, response, IpVersion::IPv4).unwrap();
|
||||||
|
|
||||||
dummy ^= cursor.get_ref()[0];
|
dummy ^= cursor.get_ref()[0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,61 +12,57 @@ pub fn response_to_bytes(
|
||||||
bytes: &mut impl Write,
|
bytes: &mut impl Write,
|
||||||
response: Response,
|
response: Response,
|
||||||
ip_version: IpVersion
|
ip_version: IpVersion
|
||||||
){
|
) -> Result<(), io::Error> {
|
||||||
match response {
|
match response {
|
||||||
Response::Connect(r) => {
|
Response::Connect(r) => {
|
||||||
bytes.write_i32::<NetworkEndian>(0).unwrap();
|
bytes.write_i32::<NetworkEndian>(0)?;
|
||||||
bytes.write_i32::<NetworkEndian>(r.transaction_id.0).unwrap();
|
bytes.write_i32::<NetworkEndian>(r.transaction_id.0)?;
|
||||||
bytes.write_i64::<NetworkEndian>(r.connection_id.0).unwrap();
|
bytes.write_i64::<NetworkEndian>(r.connection_id.0)?;
|
||||||
},
|
},
|
||||||
|
|
||||||
Response::Announce(r) => {
|
Response::Announce(r) => {
|
||||||
bytes.write_i32::<NetworkEndian>(1).unwrap();
|
bytes.write_i32::<NetworkEndian>(1)?;
|
||||||
bytes.write_i32::<NetworkEndian>(r.transaction_id.0).unwrap();
|
bytes.write_i32::<NetworkEndian>(r.transaction_id.0)?;
|
||||||
bytes.write_i32::<NetworkEndian>(r.announce_interval.0).unwrap();
|
bytes.write_i32::<NetworkEndian>(r.announce_interval.0)?;
|
||||||
bytes.write_i32::<NetworkEndian>(r.leechers.0).unwrap();
|
bytes.write_i32::<NetworkEndian>(r.leechers.0)?;
|
||||||
bytes.write_i32::<NetworkEndian>(r.seeders.0).unwrap();
|
bytes.write_i32::<NetworkEndian>(r.seeders.0)?;
|
||||||
|
|
||||||
// Write peer IPs and ports. Silently ignore peers with wrong
|
// Write peer IPs and ports. Silently ignore peers with wrong
|
||||||
// IP version
|
// IP version
|
||||||
if ip_version == IpVersion::IPv4 {
|
if ip_version == IpVersion::IPv4 {
|
||||||
for peer in r.peers {
|
for peer in r.peers {
|
||||||
if let IpAddr::V4(ip) = peer.ip_address {
|
if let IpAddr::V4(ip) = peer.ip_address {
|
||||||
bytes.write_all(&ip.octets()).unwrap();
|
bytes.write_all(&ip.octets())?;
|
||||||
bytes.write_u16::<NetworkEndian>(peer.port.0).unwrap();
|
bytes.write_u16::<NetworkEndian>(peer.port.0)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for peer in r.peers {
|
for peer in r.peers {
|
||||||
if let IpAddr::V6(ip) = peer.ip_address {
|
if let IpAddr::V6(ip) = peer.ip_address {
|
||||||
bytes.write_all(&ip.octets()).unwrap();
|
bytes.write_all(&ip.octets())?;
|
||||||
bytes.write_u16::<NetworkEndian>(peer.port.0).unwrap();
|
bytes.write_u16::<NetworkEndian>(peer.port.0)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
Response::Scrape(r) => {
|
Response::Scrape(r) => {
|
||||||
bytes.write_i32::<NetworkEndian>(2).unwrap();
|
bytes.write_i32::<NetworkEndian>(2)?;
|
||||||
bytes.write_i32::<NetworkEndian>(r.transaction_id.0).unwrap();
|
bytes.write_i32::<NetworkEndian>(r.transaction_id.0)?;
|
||||||
|
|
||||||
for torrent_stat in r.torrent_stats {
|
for torrent_stat in r.torrent_stats {
|
||||||
bytes.write_i32::<NetworkEndian>(torrent_stat.seeders.0)
|
bytes.write_i32::<NetworkEndian>(torrent_stat.seeders.0)?;
|
||||||
.unwrap();
|
bytes.write_i32::<NetworkEndian>(torrent_stat.completed.0)?;
|
||||||
bytes.write_i32::<NetworkEndian>(torrent_stat.completed.0)
|
bytes.write_i32::<NetworkEndian>(torrent_stat.leechers.0)?;
|
||||||
.unwrap();
|
|
||||||
bytes.write_i32::<NetworkEndian>(torrent_stat.leechers.0)
|
|
||||||
.unwrap();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
Response::Error(r) => {
|
Response::Error(r) => {
|
||||||
bytes.write_i32::<NetworkEndian>(3).unwrap();
|
bytes.write_i32::<NetworkEndian>(3)?;
|
||||||
bytes.write_i32::<NetworkEndian>(r.transaction_id.0).unwrap();
|
bytes.write_i32::<NetworkEndian>(r.transaction_id.0)?;
|
||||||
|
|
||||||
bytes.write_all(r.message.as_bytes()).unwrap();
|
bytes.write_all(r.message.as_bytes())?;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -186,7 +182,7 @@ mod tests {
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut buf = Vec::new();
|
let mut buf = Vec::new();
|
||||||
|
|
||||||
response_to_bytes(&mut buf, response.clone(), ip_version);
|
response_to_bytes(&mut buf, response.clone(), ip_version).unwrap();
|
||||||
let r2 = response_from_bytes(&buf[..], ip_version).unwrap();
|
let r2 = response_from_bytes(&buf[..], ip_version).unwrap();
|
||||||
|
|
||||||
let success = response == r2;
|
let success = response == r2;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue