moq_lite/ietf/
goaway.rs

1//! IETF moq-transport-14 goaway message
2
3use std::borrow::Cow;
4
5use crate::{
6	coding::*,
7	ietf::{Message, Version},
8};
9
10/// GoAway message (0x10)
11#[derive(Clone, Debug)]
12pub struct GoAway<'a> {
13	pub new_session_uri: Cow<'a, str>,
14}
15
16impl<'a> Message for GoAway<'a> {
17	const ID: u64 = 0x10;
18
19	fn encode_msg<W: bytes::BufMut>(&self, w: &mut W, version: Version) {
20		self.new_session_uri.encode(w, version);
21	}
22
23	fn decode_msg<R: bytes::Buf>(r: &mut R, version: Version) -> Result<Self, DecodeError> {
24		let new_session_uri = Cow::<str>::decode(r, version)?;
25		Ok(Self { new_session_uri })
26	}
27}
28
29#[cfg(test)]
30mod tests {
31	use super::*;
32	use bytes::BytesMut;
33
34	fn encode_message<M: Message>(msg: &M) -> Vec<u8> {
35		let mut buf = BytesMut::new();
36		msg.encode_msg(&mut buf, Version::Draft14);
37		buf.to_vec()
38	}
39
40	fn decode_message<M: Message>(bytes: &[u8]) -> Result<M, DecodeError> {
41		let mut buf = bytes::Bytes::from(bytes.to_vec());
42		M::decode_msg(&mut buf, Version::Draft14)
43	}
44
45	#[test]
46	fn test_goaway_with_url() {
47		let msg = GoAway {
48			new_session_uri: "https://example.com/new".into(),
49		};
50
51		let encoded = encode_message(&msg);
52		let decoded: GoAway = decode_message(&encoded).unwrap();
53
54		assert_eq!(decoded.new_session_uri, "https://example.com/new");
55	}
56
57	#[test]
58	fn test_goaway_empty() {
59		let msg = GoAway {
60			new_session_uri: "".into(),
61		};
62
63		let encoded = encode_message(&msg);
64		let decoded: GoAway = decode_message(&encoded).unwrap();
65
66		assert_eq!(decoded.new_session_uri, "");
67	}
68}