1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use http2::kind::*;
use http2::flag::*;
use http2::payload::*;
use http2::Error;
use http2::ErrorCode;
use http2::SizeIncrement;
use http2::StreamIdentifier;
use http2::FRAME_HEADER_BYTES;
use http2::encode_u24;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct Frame<'a> {
pub header: FrameHeader,
pub payload: Payload<'a>
}
impl<'a> Frame<'a> {
pub fn parse(header: FrameHeader, buf: &[u8]) -> Result<Frame, Error> {
Ok(Frame {
header: header,
payload: try!(Payload::parse(header, buf))
})
}
pub fn encode(&self, buf: &mut [u8]) -> usize {
self.header.encode(buf);
self.payload.encode(&mut buf[FRAME_HEADER_BYTES..]) + FRAME_HEADER_BYTES
}
pub fn encoded_len(&self) -> usize {
FRAME_HEADER_BYTES + self.payload.encoded_len()
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct FrameHeader {
pub length: u32,
pub kind: Kind,
pub flag: Flag,
pub id: StreamIdentifier,
}
impl FrameHeader {
#[inline]
pub fn parse(buf: &[u8]) -> Result<FrameHeader, Error> {
if buf.len() < FRAME_HEADER_BYTES {
return Err(Error::Short);
}
Ok(FrameHeader {
length: ((buf[0] as u32) << 16) | ((buf[1] as u32) << 8) | buf[2] as u32,
kind: Kind::new(buf[3]),
flag: try!(Flag::new(buf[4]).map_err(|()| { Error::BadFlag(buf[4]) })),
id: StreamIdentifier::parse(&buf[5..])
})
}
#[inline]
pub fn encode(&self, buf: &mut [u8]) {
encode_u24(buf, self.length);
buf[3] = self.kind.encode();
buf[4] = self.flag.bits();
self.id.encode(&mut buf[5..]);
}
}