Processing cancel messages

This commit is contained in:
Igor Katson 2023-12-06 23:25:52 +00:00
parent 9cbe16b387
commit d258a9afe2
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
2 changed files with 24 additions and 6 deletions

View file

@ -856,7 +856,10 @@ impl<'a> PeerConnectionHandler for &'a PeerHandler {
} }
Message::Have(h) => self.on_have(h), Message::Have(h) => self.on_have(h),
Message::NotInterested => { Message::NotInterested => {
debug!("received \"not interested\", but we don't care yet") debug!("received \"not interested\", but we don't process it yet")
}
Message::Cancel(_) => {
debug!("received \"cancel\", but we don't process it yet")
} }
message => { message => {
warn!("received unsupported message {:?}, ignoring", message); warn!("received unsupported message {:?}, ignoring", message);

View file

@ -40,6 +40,7 @@ const MSGID_HAVE: u8 = 4;
const MSGID_BITFIELD: u8 = 5; const MSGID_BITFIELD: u8 = 5;
const MSGID_REQUEST: u8 = 6; const MSGID_REQUEST: u8 = 6;
const MSGID_PIECE: u8 = 7; const MSGID_PIECE: u8 = 7;
const MSGID_CANCEL: u8 = 8;
const MSGID_EXTENDED: u8 = 20; const MSGID_EXTENDED: u8 = 20;
pub const MY_EXTENDED_UT_METADATA: u8 = 3; pub const MY_EXTENDED_UT_METADATA: u8 = 3;
@ -169,6 +170,7 @@ impl From<anyhow::Error> for MessageDeserializeError {
#[derive(Debug)] #[derive(Debug)]
pub enum Message<ByteBuf: std::hash::Hash + Eq> { pub enum Message<ByteBuf: std::hash::Hash + Eq> {
Request(Request), Request(Request),
Cancel(Request),
Bitfield(ByteBuf), Bitfield(ByteBuf),
KeepAlive, KeepAlive,
Have(u32), Have(u32),
@ -200,6 +202,7 @@ where
fn clone_to_owned(&self) -> Self::Target { fn clone_to_owned(&self) -> Self::Target {
match self { match self {
Message::Request(req) => Message::Request(*req), Message::Request(req) => Message::Request(*req),
Message::Cancel(req) => Message::Cancel(*req),
Message::Bitfield(b) => Message::Bitfield(b.clone_to_owned()), Message::Bitfield(b) => Message::Bitfield(b.clone_to_owned()),
Message::Choke => Message::Choke, Message::Choke => Message::Choke,
Message::Unchoke => Message::Unchoke, Message::Unchoke => Message::Unchoke,
@ -240,7 +243,7 @@ where
{ {
pub fn len_prefix_and_msg_id(&self) -> (u32, u8) { pub fn len_prefix_and_msg_id(&self) -> (u32, u8) {
match self { match self {
Message::Request(_) => (LEN_PREFIX_REQUEST, MSGID_REQUEST), Message::Request(_) | Message::Cancel(_) => (LEN_PREFIX_REQUEST, MSGID_REQUEST),
Message::Bitfield(b) => (1 + b.as_ref().len() as u32, MSGID_BITFIELD), Message::Bitfield(b) => (1 + b.as_ref().len() as u32, MSGID_BITFIELD),
Message::Choke => (LEN_PREFIX_CHOKE, MSGID_CHOKE), Message::Choke => (LEN_PREFIX_CHOKE, MSGID_CHOKE),
Message::Unchoke => (LEN_PREFIX_UNCHOKE, MSGID_UNCHOKE), Message::Unchoke => (LEN_PREFIX_UNCHOKE, MSGID_UNCHOKE),
@ -270,7 +273,7 @@ where
let ser = bopts(); let ser = bopts();
match self { match self {
Message::Request(request) => { Message::Request(request) | Message::Cancel(request) => {
const MSG_LEN: usize = PREAMBLE_LEN + 12; const MSG_LEN: usize = PREAMBLE_LEN + 12;
out.resize(MSG_LEN, 0); out.resize(MSG_LEN, 0);
debug_assert_eq!(out[PREAMBLE_LEN..].len(), 12); debug_assert_eq!(out[PREAMBLE_LEN..].len(), 12);
@ -411,16 +414,28 @@ where
} }
} }
} }
MSGID_REQUEST => { MSGID_REQUEST | MSGID_CANCEL => {
let expected_len = 12; let expected_len = 12;
match rest.get(..expected_len) { match rest.get(..expected_len) {
Some(b) => { Some(b) => {
let request = decoder_config.deserialize::<Request>(b).unwrap(); let request = decoder_config.deserialize::<Request>(b).unwrap();
Ok((Message::Request(request), PREAMBLE_LEN + expected_len)) let req = if msg_id == MSGID_REQUEST {
Message::Request(request)
} else {
Message::Cancel(request)
};
Ok((req, PREAMBLE_LEN + expected_len))
} }
None => { None => {
let missing = expected_len - rest.len(); let missing = expected_len - rest.len();
Err(MessageDeserializeError::NotEnoughData(missing, "request")) Err(MessageDeserializeError::NotEnoughData(
missing,
if msg_id == MSGID_REQUEST {
"request"
} else {
"cancel"
},
))
} }
} }
} }