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    pub fn set_reason(mut self, error_code: Reason) -> Self {
20        self.error_code = error_code;
21        self
22    }
23
24    pub fn stream_id(&self) -> StreamId {
25        self.stream_id
26    }
27
28    pub fn reason(&self) -> Reason {
29        self.error_code
30    }
31
32    pub fn load(head: Head, payload: &[u8]) -> Result<Reset, FrameError> {
33        if payload.len() != 4 {
34            return Err(FrameError::InvalidPayloadLength);
35        }
36
37        let error_code = unpack_octets_4!(payload, 0, u32);
38
39        Ok(Reset {
40            stream_id: head.stream_id(),
41            error_code: error_code.into(),
42        })
43    }
44
45    pub fn encode<B: BufMut>(&self, dst: &mut B) {
46        log::trace!(
47            "encoding RESET; id={:?} code={:?}",
48            self.stream_id,
49            self.error_code
50        );
51        let head = Head::new(Kind::Reset, 0, self.stream_id);
52        head.encode(4, dst);
53        dst.put_u32(self.error_code.into());
54    }
55}
56
57impl From<Reset> for Frame {
58    fn from(src: Reset) -> Self {
59        Frame::Reset(src)
60    }
61}