Read a framed message: `[discriminant u8][len u32 BE][payload bytes]`.
(reader: &mut R)
| 196 | |
| 197 | /// Read a framed message: `[discriminant u8][len u32 BE][payload bytes]`. |
| 198 | async fn read_framed<R: AsyncRead + Unpin>(reader: &mut R) -> Result<(u8, Vec<u8>), MirrorError> { |
| 199 | let mut header = [0u8; 5]; |
| 200 | reader |
| 201 | .read_exact(&mut header) |
| 202 | .await |
| 203 | .map_err(|e| MirrorError::Transport { |
| 204 | detail: format!("read framed header: {e}"), |
| 205 | })?; |
| 206 | let discriminant = header[0]; |
| 207 | let len = u32::from_be_bytes([header[1], header[2], header[3], header[4]]) as usize; |
| 208 | |
| 209 | if len > MAX_HANDSHAKE_PAYLOAD { |
| 210 | return Err(MirrorError::HandshakeCodec { |
| 211 | detail: format!("handshake payload {len} bytes exceeds max {MAX_HANDSHAKE_PAYLOAD}"), |
| 212 | }); |
| 213 | } |
| 214 | |
| 215 | let mut payload = vec![0u8; len]; |
| 216 | reader |
| 217 | .read_exact(&mut payload) |
| 218 | .await |
| 219 | .map_err(|e| MirrorError::Transport { |
| 220 | detail: format!("read framed payload: {e}"), |
| 221 | })?; |
| 222 | Ok((discriminant, payload)) |
| 223 | } |
| 224 | |
| 225 | #[cfg(test)] |
| 226 | mod tests { |
no test coverage detected