1use std::borrow::Cow;
4
5use crate::{
6 coding::*,
7 ietf::{Message, Version},
8};
9
10#[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}