bittorrent_udp: response_to_bytes: return Result<(), io:Error>

This commit is contained in:
Joakim Frostegård 2020-04-11 15:03:50 +02:00
parent 054d36b316
commit 9bf17b0ab4
5 changed files with 28 additions and 32 deletions

View file

@ -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;

View file

@ -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];
} }

View file

@ -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];
} }

View file

@ -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];
} }

View file

@ -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;