http_box/http2/
frame_type.rs1use std::fmt;
18
19pub const FR_CONTINUATION: u8 = 0x9;
21
22pub const FR_DATA: u8 = 0x0;
24
25pub const FR_GO_AWAY: u8 = 0x7;
27
28pub const FR_HEADERS: u8 = 0x1;
30
31pub const FR_PING: u8 = 0x6;
33
34pub const FR_PRIORITY: u8 = 0x2;
36
37pub const FR_PUSH_PROMISE: u8 = 0x5;
39
40pub const FR_RST_STREAM: u8 = 0x3;
42
43pub const FR_SETTINGS: u8 = 0x4;
45
46pub const FR_WINDOW_UPDATE: u8 = 0x8;
48
49pub const FR_UNSUPPORTED: u8 = 0xFF;
51
52#[derive(Clone,Copy,PartialEq)]
54#[repr(u8)]
55pub enum FrameType {
56 Continuation = FR_CONTINUATION,
58
59 Data = FR_DATA,
61
62 GoAway = FR_GO_AWAY,
64
65 Headers = FR_HEADERS,
67
68 Ping = FR_PING,
70
71 Priority = FR_PRIORITY,
73
74 PushPromise = FR_PUSH_PROMISE,
76
77 RstStream = FR_RST_STREAM,
79
80 Settings = FR_SETTINGS,
82
83 WindowUpdate = FR_WINDOW_UPDATE,
85
86 Unsupported = FR_UNSUPPORTED
88}
89
90impl FrameType {
91 pub fn from_u8(byte: u8) -> FrameType {
93 match byte {
94 FR_DATA => FrameType::Data,
95 FR_HEADERS => FrameType::Headers,
96 FR_PRIORITY => FrameType::Priority,
97 FR_RST_STREAM => FrameType::RstStream,
98 FR_SETTINGS => FrameType::Settings,
99 FR_PUSH_PROMISE => FrameType::PushPromise,
100 FR_PING => FrameType::Ping,
101 FR_GO_AWAY => FrameType::GoAway,
102 FR_WINDOW_UPDATE => FrameType::WindowUpdate,
103 FR_CONTINUATION => FrameType::Continuation,
104 _ => FrameType::Unsupported
105 }
106 }
107
108 pub fn as_byte(&self) -> u8 {
110 match *self {
111 FrameType::Continuation => FR_CONTINUATION,
112 FrameType::Data => FR_DATA,
113 FrameType::GoAway => FR_GO_AWAY,
114 FrameType::Headers => FR_HEADERS,
115 FrameType::Ping => FR_PING,
116 FrameType::PushPromise => FR_PUSH_PROMISE,
117 FrameType::Priority => FR_PRIORITY,
118 FrameType::RstStream => FR_RST_STREAM,
119 FrameType::Settings => FR_SETTINGS,
120 FrameType::WindowUpdate => FR_WINDOW_UPDATE,
121 _ => FR_UNSUPPORTED
122 }
123 }
124
125 fn format(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
127 match *self {
128 FrameType::Continuation => {
129 write!(formatter, "<FrameType::Continuation>")
130 },
131 FrameType::Data => {
132 write!(formatter, "<FrameType::Data>")
133 },
134 FrameType::GoAway => {
135 write!(formatter, "<FrameType::GoAway>")
136 },
137 FrameType::Headers => {
138 write!(formatter, "<FrameType::Headers>")
139 },
140 FrameType::Ping => {
141 write!(formatter, "<FrameType::Ping>")
142 },
143 FrameType::Priority => {
144 write!(formatter, "<FrameType::Priority>")
145 },
146 FrameType::PushPromise => {
147 write!(formatter, "<FrameType::PushPromise>")
148 },
149 FrameType::RstStream => {
150 write!(formatter, "<FrameType::RstStream>")
151 },
152 FrameType::Settings => {
153 write!(formatter, "<FrameType::Settings>")
154 },
155 FrameType::WindowUpdate => {
156 write!(formatter, "<FrameType::WindowUpdate>")
157 },
158 FrameType::Unsupported => {
159 write!(formatter, "<FrameType::Unsupported>")
160 }
161 }
162 }
163
164 pub fn is_continuation(&self) -> bool {
166 match *self {
167 FrameType::Continuation => true,
168 _ => false
169 }
170 }
171
172 pub fn is_data(&self) -> bool {
174 match *self {
175 FrameType::Data => true,
176 _ => false
177 }
178 }
179
180 pub fn is_go_away(&self) -> bool {
182 match *self {
183 FrameType::GoAway => true,
184 _ => false
185 }
186 }
187
188 pub fn is_headers(&self) -> bool {
190 match *self {
191 FrameType::Headers => true,
192 _ => false
193 }
194 }
195
196 pub fn is_push_ping(&self) -> bool {
198 match *self {
199 FrameType::Ping => true,
200 _ => false
201 }
202 }
203
204 pub fn is_priority(&self) -> bool {
206 match *self {
207 FrameType::Priority => true,
208 _ => false
209 }
210 }
211
212 pub fn is_push_promise(&self) -> bool {
214 match *self {
215 FrameType::PushPromise => true,
216 _ => false
217 }
218 }
219
220 pub fn is_rst_stream(&self) -> bool {
222 match *self {
223 FrameType::RstStream => true,
224 _ => false
225 }
226 }
227
228 pub fn is_settings(&self) -> bool {
230 match *self {
231 FrameType::Settings => true,
232 _ => false
233 }
234 }
235
236 pub fn is_unsupported(&self) -> bool {
238 match *self {
239 FrameType::Unsupported => true,
240 _ => false
241 }
242 }
243
244 pub fn is_window_update(&self) -> bool {
246 match *self {
247 FrameType::WindowUpdate => true,
248 _ => false
249 }
250 }
251}
252
253impl fmt::Debug for FrameType {
254 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
255 self.format(formatter)
256 }
257}
258
259impl fmt::Display for FrameType {
260 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
261 self.format(formatter)
262 }
263}