Skip to content
Snippets Groups Projects
Commit e8905188 authored by Covertness's avatar Covertness
Browse files

Merge pull request #3 from jamesmunns/fix-option-parse

Options should be parsed even if there is no token
parents 670c3aae a6ce7689
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -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
......@@ -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
}
......@@ -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());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment