Skip to main content

ntex_h2/frame/
reset.rs

1use ntex_bytes::BufMut;
2
3use crate::frame::{Frame, FrameError, Head, Kind, Reason, StreamId};
4
5#[derive(Copy, Clone, Debug, Eq, PartialEq)]
6pub struct Reset {
7    stream_id: StreamId,
8    error_code: Reason,
9}
10
11impl Reset {
12    pub fn new(stream_id: StreamId, error: Reason) -> Reset {
13        Reset {
14            stream_id,
15            error_code: error,
16        }
17    }
18
19    #[must_use]
20    pub fn set_reason(mut self, error_code: Reason) -> Self {
21        self.error_code = error_code;
22        self
23    }
24
25    #[must_use]
26    pub fn stream_id(&self) -> StreamId {
27        self.stream_id
28    }
29
30    #[must_use]
31    pub fn reason(&self) -> Reason {
32        self.error_code
33    }
34
35    pub fn load(head: Head, payload: &[u8]) -> Result<Reset, FrameError> {
36        if payload.len() != 4 {
37            return Err(FrameError::InvalidPayloadLength);
38        }
39
40        let error_code = unpack_octets_4!(payload, 0, u32);
41
42        Ok(Reset {
43            stream_id: head.stream_id(),
44            error_code: error_code.into(),
45        })
46    }
47
48    pub fn encode<B: BufMut>(&self, dst: &mut B) {
49        log::trace!(
50            "encoding RESET; id={:?} code={:?}",
51            self.stream_id,
52            self.error_code
53        );
54        let head = Head::new(Kind::Reset, 0, self.stream_id);
55        head.encode(4, dst);
56        dst.put_u32(self.error_code.into());
57    }
58}
59
60impl From<Reset> for Frame {
61    fn from(src: Reset) -> Self {
62        Frame::Reset(src)
63    }
64}