feat(protocol): carry complete encoded media frames
This commit is contained in:
+25
-11
@@ -189,36 +189,50 @@ fn classify_datagram(encoded: &str) -> &'static str {
|
||||
Some(raw) => raw,
|
||||
None => return "invalid:hex",
|
||||
};
|
||||
if raw.len() < 21 {
|
||||
if raw.len() < 3 {
|
||||
return "invalid:truncated";
|
||||
}
|
||||
if raw[0..2] != *b"VD" {
|
||||
return "invalid:magic";
|
||||
}
|
||||
if raw[2] != 1 {
|
||||
if raw[2] != 1 && raw[2] != 2 {
|
||||
return "invalid:unsupported_version";
|
||||
}
|
||||
let limit = match raw[3] {
|
||||
1 => 1024,
|
||||
2 => 2048,
|
||||
3 => 65515,
|
||||
10 | 11 | 12 => 1179,
|
||||
let header_bytes = if raw[2] == 1 { 21 } else { 23 };
|
||||
if raw.len() < header_bytes {
|
||||
return "invalid:truncated";
|
||||
}
|
||||
let limit = match (raw[2], raw[3]) {
|
||||
(1, 1) => 1024,
|
||||
(1, 2) => 2048,
|
||||
(1, 3) => 65515,
|
||||
(1, 10 | 11 | 12) => 1179,
|
||||
(2, 10 | 11) => 1177,
|
||||
_ => return "invalid:unknown_channel",
|
||||
};
|
||||
if raw[4] != 0 {
|
||||
return "invalid:flags";
|
||||
}
|
||||
if raw[18] == 0 || raw[17] >= raw[18] {
|
||||
let (fragment_index, fragment_count, payload_offset) = if raw[2] == 1 {
|
||||
(raw[17] as usize, raw[18] as usize, 19)
|
||||
} else {
|
||||
let count = ((raw[19] as usize) << 8) | raw[20] as usize;
|
||||
if count > 891 {
|
||||
return "invalid:fragment_limit";
|
||||
}
|
||||
((((raw[17] as usize) << 8) | raw[18] as usize), count, 21)
|
||||
};
|
||||
if fragment_count == 0 || fragment_index >= fragment_count {
|
||||
return "invalid:fragment";
|
||||
}
|
||||
let payload_length = ((raw[19] as usize) << 8) | raw[20] as usize;
|
||||
let payload_length = ((raw[payload_offset] as usize) << 8) | raw[payload_offset + 1] as usize;
|
||||
if payload_length > limit {
|
||||
return "invalid:payload_limit";
|
||||
}
|
||||
if raw.len() != 21 + payload_length {
|
||||
if raw.len() != header_bytes + payload_length {
|
||||
return "invalid:length_mismatch";
|
||||
}
|
||||
if raw.len() > 65536 {
|
||||
if raw[2] == 1 && raw.len() > 65536 || raw[2] == 2 && raw.len() > 1200 {
|
||||
return "invalid:frame_limit";
|
||||
}
|
||||
"valid"
|
||||
|
||||
Reference in New Issue
Block a user