diff --git a/.travis.yml b/.travis.yml index a392a526d0620eab656396d8f3a7522d3453232c..dc78028717733a6e398cbb8ad601fef40f58db75 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,4 +28,5 @@ after_success: env: global: - - secure: "Azb2kN3sVX4KYy4LCrqUqmvCOoePRfDcq9EVfPuJxexrKbkubU4WRxay13ZwGKLvdiL6MXeGYdaNdULDDoxFdREid6T8ZwXdVgEYRg6RanBXs4PME8PNAk3sr0vX92jUpPe6uiLTi3HFilD96IXM/QuPgmjaTUGlxg/tNqVvMO1MnVhSZw8nbC3GRX8K/iMzBE1J0bbYc0nQ5KR2QDLuUPl7ddYzA/OeXxkOdGc3oPAXL3JveRvKRN6WfCbtzn31AYPba2h3LQ6r4XzwL4ZGU1Kpvm/CWsNGtRhZHJ5fh5TFZzVKlK8ndEM747ApdiyYkbpSUCFqkU6W8MP2fwSBH9HK4n6MKY/JZUFc6D0HhDpfgOcRrvRgydkHR5ubQx/+PRfvh3jxDaMGizlxiKGlKaFctxkB2JZCGFm+kGnKNRhxj7ibsDVDn2Mx72x0wE5LAybqsx3eoBno/DPU04YeGCVuA9BIzLQunCa051sxH1/UPUe2tE0cios2SUVLKtCDgawLohWwWDrBQU4hk6ZepZlYY2jo/vRq+xYkYH1ISUDNacu6lu8vfkFBOZBfDmIQQK0+fHnZI7TLeLfbW0iR7Ep9dgbAkw829OpMUof9Kk1YPfIlJ4CUkFKtKH2vP15+QRyDt6oDzSHlmpJLNQECoTG7gMsxsRRBrr5gI5eYtqI=" \ No newline at end of file + - secure: "Azb2kN3sVX4KYy4LCrqUqmvCOoePRfDcq9EVfPuJxexrKbkubU4WRxay13ZwGKLvdiL6MXeGYdaNdULDDoxFdREid6T8ZwXdVgEYRg6RanBXs4PME8PNAk3sr0vX92jUpPe6uiLTi3HFilD96IXM/QuPgmjaTUGlxg/tNqVvMO1MnVhSZw8nbC3GRX8K/iMzBE1J0bbYc0nQ5KR2QDLuUPl7ddYzA/OeXxkOdGc3oPAXL3JveRvKRN6WfCbtzn31AYPba2h3LQ6r4XzwL4ZGU1Kpvm/CWsNGtRhZHJ5fh5TFZzVKlK8ndEM747ApdiyYkbpSUCFqkU6W8MP2fwSBH9HK4n6MKY/JZUFc6D0HhDpfgOcRrvRgydkHR5ubQx/+PRfvh3jxDaMGizlxiKGlKaFctxkB2JZCGFm+kGnKNRhxj7ibsDVDn2Mx72x0wE5LAybqsx3eoBno/DPU04YeGCVuA9BIzLQunCa051sxH1/UPUe2tE0cios2SUVLKtCDgawLohWwWDrBQU4hk6ZepZlYY2jo/vRq+xYkYH1ISUDNacu6lu8vfkFBOZBfDmIQQK0+fHnZI7TLeLfbW0iR7Ep9dgbAkw829OpMUof9Kk1YPfIlJ4CUkFKtKH2vP15+QRyDt6oDzSHlmpJLNQECoTG7gMsxsRRBrr5gI5eYtqI=" + - RUST_TEST_THREADS=1 diff --git a/appveyor.yml b/appveyor.yml index 070c05d64e5b5196cf4b6670b9d0f7da08fe82eb..ec22c1b4e6999701df7261af4a97a9e063eb30c5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,5 +8,8 @@ install: build: false +environment: + RUST_TEST_THREADS: 1 + test_script: - - cargo test --verbose \ No newline at end of file + - cargo test --verbose diff --git a/src/packet.rs b/src/packet.rs index 51d19235c882f00d0bad075a867ee17613151b78..c2a8b09dd2b570c4c641aef03aeaed6f8a9acbe6 100644 --- a/src/packet.rs +++ b/src/packet.rs @@ -199,95 +199,94 @@ impl Packet { match header_result { Ok(header) => { let token_length = header.get_token_length(); - let (mut token, mut payload) = (Vec::new(), Vec::new()); - let mut options: BTreeMap<usize, LinkedList<Vec<u8>>> = BTreeMap::new(); + let options_start: usize = 4 + token_length as usize; - if token_length > 0 { - if token_length > 8 { - return Err(ParseError::InvalidTokenLength); - } + if token_length > 8 { + return Err(ParseError::InvalidTokenLength); + } - let options_start: usize = 4 + token_length as usize; - if options_start > buf.len() { - return Err(ParseError::InvalidTokenLength); - } + if options_start > buf.len() { + return Err(ParseError::InvalidTokenLength); + } - token = buf[4..options_start].to_vec(); + let token = buf[4..options_start].to_vec(); - let mut idx = options_start; - let mut options_number = 0; - while idx < buf.len() { - let byte = buf[idx]; + let mut idx = options_start; + let mut options_number = 0; + let mut options: BTreeMap<usize, LinkedList<Vec<u8>>> = BTreeMap::new(); + while idx < buf.len() { + let byte = buf[idx]; - if byte == 255 || idx > buf.len() { - break; - } + if byte == 255 || idx > buf.len() { + break; + } - let mut delta = (byte >> 4) as usize; - let mut length = (byte & 0xF) as usize; + let mut delta = (byte >> 4) as usize; + let mut length = (byte & 0xF) as usize; - idx += 1; + idx += 1; - if delta == 13 { - if idx >= buf.len() { - return Err(ParseError::InvalidOptionLength); - } - delta = buf[idx] as usize + 13; - idx += 1; - } else if delta == 14 { - if idx + 1 >= buf.len() { - return Err(ParseError::InvalidOptionLength); - } - - delta = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize; - idx += 2; - } else if delta == 15 { - return Err(ParseError::InvalidOptionDelta); + if delta == 13 { + if idx >= buf.len() { + return Err(ParseError::InvalidOptionLength); } - - if length == 13 { - if idx >= buf.len() { - return Err(ParseError::InvalidOptionLength); - } - - length = buf[idx] as usize + 13; - idx += 1; - } else if length == 14 { - if idx + 1 >= buf.len() { - return Err(ParseError::InvalidOptionLength); - } - - length = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize; - idx += 2; - } else if length == 15 { + delta = buf[idx] as usize + 13; + idx += 1; + } else if delta == 14 { + if idx + 1 >= buf.len() { return Err(ParseError::InvalidOptionLength); } - options_number += delta; + delta = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize; + idx += 2; + } else if delta == 15 { + return Err(ParseError::InvalidOptionDelta); + } - let end = idx + length; - if end > buf.len() { + if length == 13 { + if idx >= buf.len() { return Err(ParseError::InvalidOptionLength); } - let options_value = buf[idx..end].to_vec(); - - if options.contains_key(&options_number) { - let mut options_list = options.get_mut(&options_number).unwrap(); - options_list.push_back(options_value); - } else { - let mut list = LinkedList::new(); - list.push_back(options_value); - options.insert(options_number, list); + + length = buf[idx] as usize + 13; + idx += 1; + } else if length == 14 { + if idx + 1 >= buf.len() { + return Err(ParseError::InvalidOptionLength); } - idx += length; + length = (u16::from_be(u8_to_unsigned_be!(buf, idx, idx + 1, u16)) + 269) as usize; + idx += 2; + } else if length == 15 { + return Err(ParseError::InvalidOptionLength); } - if idx < buf.len() { - payload = buf[(idx + 1)..buf.len()].to_vec(); + options_number += delta; + + let end = idx + length; + if end > buf.len() { + return Err(ParseError::InvalidOptionLength); + } + let options_value = buf[idx..end].to_vec(); + + if options.contains_key(&options_number) { + let mut options_list = options.get_mut(&options_number).unwrap(); + options_list.push_back(options_value); + } else { + let mut list = LinkedList::new(); + list.push_back(options_value); + options.insert(options_number, list); } + + idx += length; + } + + let mut payload = Vec::new(); + if idx < buf.len() { + payload = buf[(idx + 1)..buf.len()].to_vec(); } + Ok(Packet { header: header, token: token, @@ -508,4 +507,4 @@ mod test { } QuickCheck::new().tests(10000).gen(StdGen::new(rand::thread_rng(), 1500)).quickcheck(run as fn(Vec<u8>) -> TestResult) } -} \ No newline at end of file +} diff --git a/src/server.rs b/src/server.rs index 9bdb9e42b5b821332a68fad1ae4b6cef0204b30f..54514a8dcefdf98c07c82594c6eb8ebaf9377b7a 100644 --- a/src/server.rs +++ b/src/server.rs @@ -177,7 +177,7 @@ mod test { fn test_echo_server() { let mut server = CoAPServer::new("127.0.0.1:5683").unwrap(); server.handle(request_handler).unwrap(); - + let client = CoAPClient::new("127.0.0.1:5683").unwrap(); let mut packet = Packet::new(); packet.header.set_version(1); @@ -191,4 +191,22 @@ mod test { let recv_packet = client.receive().unwrap(); assert_eq!(recv_packet.payload, b"test-echo".to_vec()); } -} \ No newline at end of file + + #[test] + fn test_echo_server_no_token() { + let mut server = CoAPServer::new("127.0.0.1:5683").unwrap(); + server.handle(request_handler).unwrap(); + + let client = CoAPClient::new("127.0.0.1:5683").unwrap(); + let mut packet = Packet::new(); + packet.header.set_version(1); + packet.header.set_type(PacketType::Confirmable); + packet.header.set_code("0.01"); + packet.header.set_message_id(1); + packet.add_option(OptionType::UriPath, b"test-echo".to_vec()); + client.send(&packet).unwrap(); + + let recv_packet = client.receive().unwrap(); + assert_eq!(recv_packet.payload, b"test-echo".to_vec()); + } +}