///|
pub fn decode_datagram(
datagram : Bytes,
policy : DecodePolicy,
) -> Result[DecodedFrame, ProxyError] {
let decoded = if datagram.length() >= 12 &&
bytes_equal_constant_time(
Bytes::from_array(datagram.to_array()[0:12]),
v2_signature(),
) {
decode_v2(datagram, policy)
} else {
decode_v1(datagram, policy)
}
match decoded {
Err(err) =>
if err.kind == NeedMoreData {
Err(
proxy_error(
InvalidLength,
err.offset,
"a UDP datagram cannot be completed by a later datagram",
),
)
} else {
Err(err)
}
Ok(frame) => Ok(frame)
}
}