1use std::mem;
4
5use http::StreamId;
6
7#[macro_escape]
19macro_rules! unpack_octets_4 {
20 ($buf:ident, $offset:expr, $tip:ty) => (
21 (($buf[$offset + 0] as $tip) << 24) |
22 (($buf[$offset + 1] as $tip) << 16) |
23 (($buf[$offset + 2] as $tip) << 8) |
24 (($buf[$offset + 3] as $tip) << 0)
25 );
26}
27
28pub mod data;
29pub mod headers;
30pub mod settings;
31
32pub use self::data::{DataFlag, DataFrame};
34pub use self::headers::{HeadersFlag, HeadersFrame};
36pub use self::settings::{SettingsFlag, SettingsFrame, HttpSetting};
38
39pub type FrameHeaderBuffer = [u8; 9];
42pub type FrameHeader = (u32, u8, u8, u32);
45
46pub fn unpack_header(header: &FrameHeaderBuffer) -> FrameHeader {
52 let length: u32 =
53 ((header[0] as u32) << 16) |
54 ((header[1] as u32) << 8) |
55 ((header[2] as u32) << 0);
56 let frame_type = header[3];
57 let flags = header[4];
58 let stream_id: u32 = unpack_octets_4!(header, 5, u32);
59
60 (length, frame_type, flags, stream_id)
61}
62
63pub fn pack_header(header: &FrameHeader) -> FrameHeaderBuffer {
65 let &(length, frame_type, flags, stream_id) = header;
66
67 [
68 (((length >> 16) & 0x000000FF) as u8),
69 (((length >> 8) & 0x000000FF) as u8),
70 (((length >> 0) & 0x000000FF) as u8),
71 frame_type,
72 flags,
73 (((stream_id >> 24) & 0x000000FF) as u8),
74 (((stream_id >> 16) & 0x000000FF) as u8),
75 (((stream_id >> 8) & 0x000000FF) as u8),
76 (((stream_id >> 0) & 0x000000FF) as u8),
77 ]
78}
79
80fn parse_padded_payload<'a>(payload: &'a [u8]) -> Option<(&'a [u8], u8)> {
93 if payload.len() == 0 {
94 return None;
100 }
101 let pad_len = payload[0] as usize;
102 if pad_len >= payload.len() {
103 return None;
106 }
107
108 Some((&payload[1..payload.len() - pad_len], pad_len as u8))
109}
110
111pub trait Flag {
113 fn bitmask(&self) -> u8;
115}
116
117pub trait Frame: Sized {
119 type FlagType: Flag;
122
123 fn from_raw(raw_frame: RawFrame) -> Option<Self>;
135
136 fn is_set(&self, flag: Self::FlagType) -> bool;
138 fn get_stream_id(&self) -> StreamId;
140 fn get_header(&self) -> FrameHeader;
142
143 fn set_flag(&mut self, flag: Self::FlagType);
145
146 fn serialize(&self) -> Vec<u8>;
148}
149
150#[derive(PartialEq)]
162#[derive(Debug)]
163#[derive(Clone)]
164pub struct RawFrame {
165 raw_content: Vec<u8>,
168}
169
170impl RawFrame {
171 pub fn new(header: FrameHeader) -> RawFrame {
174 RawFrame::with_payload(header, Vec::new())
175 }
176
177 pub fn with_payload(header: FrameHeader, payload: Vec<u8>) -> RawFrame {
181 let mut raw = Vec::new();
182 raw.extend(pack_header(&header).into_iter().map(|x| *x));
183 raw.extend(payload);
184
185 RawFrame {
186 raw_content: raw,
187 }
188 }
189
190 pub fn from_buf(buf: &[u8]) -> Option<RawFrame> {
200 if buf.len() < 9 {
201 return None;
202 }
203 let header = unpack_header(unsafe {
204 assert!(buf.len() >= 9);
205 mem::transmute(buf.as_ptr())
207 });
208 let payload_len = header.0 as usize;
209
210 if buf[9..].len() != payload_len {
211 return None;
212 }
213
214 Some(RawFrame {
215 raw_content: buf.to_vec(),
216 })
217 }
218
219 pub fn serialize(&self) -> Vec<u8> {
222 self.raw_content.clone()
223 }
224
225 pub fn header(&self) -> FrameHeader {
228 unpack_header(unsafe {
229 assert!(self.raw_content.len() >= 9);
230 mem::transmute(self.raw_content.as_ptr())
232 })
233 }
234
235 pub fn payload(&self) -> &[u8] {
237 &self.raw_content[9..]
238 }
239}
240
241impl Into<Vec<u8>> for RawFrame {
243 fn into(self) -> Vec<u8> { self.raw_content }
244}
245
246impl From<Vec<u8>> for RawFrame {
251 fn from(raw: Vec<u8>) -> RawFrame { RawFrame { raw_content: raw } }
252}
253
254#[cfg(test)]
255mod tests {
256 use super::{
257 unpack_header,
258 pack_header,
259 RawFrame,
260 FrameHeader,
261 Frame,
262 };
263
264 #[test]
267 fn test_unpack_header() {
268 {
269 let header = [0; 9];
270 assert_eq!((0, 0, 0, 0), unpack_header(&header));
271 }
272 {
273 let header = [0, 0, 1, 2, 3, 0, 0, 0, 4];
274 assert_eq!((1, 2, 3, 4), unpack_header(&header));
275 }
276 {
277 let header = [0, 0, 1, 200, 100, 0, 0, 0, 4];
278 assert_eq!((1, 200, 100, 4), unpack_header(&header));
279 }
280 {
281 let header = [0, 0, 1, 0, 0, 0, 0, 0, 0];
282 assert_eq!((1, 0, 0, 0), unpack_header(&header));
283 }
284 {
285 let header = [0, 1, 0, 0, 0, 0, 0, 0, 0];
286 assert_eq!((256, 0, 0, 0), unpack_header(&header));
287 }
288 {
289 let header = [1, 0, 0, 0, 0, 0, 0, 0, 0];
290 assert_eq!((256 * 256, 0, 0, 0), unpack_header(&header));
291 }
292 {
293 let header = [0, 0, 0, 0, 0, 0, 0, 0, 1];
294 assert_eq!((0, 0, 0, 1), unpack_header(&header));
295 }
296 {
297 let header = [0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 1];
298 assert_eq!(((1 << 24) - 1, 0, 0, 1), unpack_header(&header));
299 }
300 {
301 let header = [0xFF, 0xFF, 0xFF, 0, 0, 1, 1, 1, 1];
302 assert_eq!(
303 ((1 << 24) - 1, 0, 0, 1 + (1 << 8) + (1 << 16) + (1 << 24)),
304 unpack_header(&header));
305 }
306 }
307
308 #[test]
311 fn test_pack_header() {
312 {
313 let header = [0; 9];
314 assert_eq!(pack_header(&(0, 0, 0, 0)), header);
315 }
316 {
317 let header = [0, 0, 1, 2, 3, 0, 0, 0, 4];
318 assert_eq!(pack_header(&(1, 2, 3, 4)), header);
319 }
320 {
321 let header = [0, 0, 1, 200, 100, 0, 0, 0, 4];
322 assert_eq!(pack_header(&(1, 200, 100, 4)), header);
323 }
324 {
325 let header = [0, 0, 1, 0, 0, 0, 0, 0, 0];
326 assert_eq!(pack_header(&(1, 0, 0, 0)), header);
327 }
328 {
329 let header = [0, 1, 0, 0, 0, 0, 0, 0, 0];
330 assert_eq!(pack_header(&(256, 0, 0, 0)), header);
331 }
332 {
333 let header = [1, 0, 0, 0, 0, 0, 0, 0, 0];
334 assert_eq!(pack_header(&(256 * 256, 0, 0, 0)), header);
335 }
336 {
337 let header = [0, 0, 0, 0, 0, 0, 0, 0, 1];
338 assert_eq!(pack_header(&(0, 0, 0, 1)), header);
339 }
340 {
341 let header = [0xFF, 0xFF, 0xFF, 0, 0, 0, 0, 0, 1];
342 assert_eq!(pack_header(&((1 << 24) - 1, 0, 0, 1)), header);
343 }
344 {
345 let header = [0xFF, 0xFF, 0xFF, 0, 0, 1, 1, 1, 1];
346 let header_components = (
347 (1 << 24) - 1, 0, 0, 1 + (1 << 8) + (1 << 16) + (1 << 24)
348 );
349 assert_eq!(pack_header(&header_components), header);
350 }
351 }
352
353 pub fn build_test_frame<F: Frame>(header: &FrameHeader, payload: &[u8]) -> F {
356 let raw = RawFrame::with_payload(header.clone(), payload.to_vec());
357 Frame::from_raw(raw).unwrap()
358 }
359
360 pub fn build_padded_frame_payload(data: &[u8], pad_len: u8) -> Vec<u8> {
365 let sz = 1 + data.len() + pad_len as usize;
366 let mut payload: Vec<u8> = Vec::with_capacity(sz);
367 payload.push(pad_len);
368 payload.extend(data.to_vec().into_iter());
369 for _ in 0..pad_len { payload.push(0); }
370
371 payload
372 }
373
374 #[test]
377 fn test_raw_frame_with_payload() {
378 {
380 let data = b"123";
381 let header = (data.len() as u32, 0x1, 0, 1);
382
383 let raw = RawFrame::with_payload(header, data.to_vec());
384
385 assert_eq!(raw.header(), header);
386 assert_eq!(raw.payload(), data)
387 }
388 {
390 let data = b"123456";
391 let header = (3, 0x1, 0, 1);
392
393 let raw = RawFrame::with_payload(header, data.to_vec());
394
395 assert_eq!(raw.header(), header);
397 assert_eq!(raw.payload(), data)
398 }
399 {
401 let data = b"123";
402 let header = (6, 0x1, 0, 1);
403
404 let raw = RawFrame::with_payload(header, data.to_vec());
405
406 assert_eq!(raw.header(), header);
408 assert_eq!(raw.payload(), data)
409 }
410 }
411
412 #[test]
415 fn test_raw_frame_from_buffer() {
416 {
418 let data = b"123";
419 let header = (data.len() as u32, 0x1, 0, 1);
420 let buf = {
421 let mut buf = Vec::new();
422 buf.extend(pack_header(&header).to_vec().into_iter());
423 buf.extend(data.to_vec().into_iter());
424 buf
425 };
426
427 let raw = RawFrame::from_buf(&buf).unwrap();
428
429 assert_eq!(raw.header(), header);
430 assert_eq!(raw.payload(), data)
431 }
432 {
434 let data = b"123";
435 let header = (data.len() as u32, 0x1, 0, 1);
436 let buf = {
437 let mut buf = Vec::new();
438 buf.extend(pack_header(&header).to_vec().into_iter());
439 buf.extend(data.to_vec().into_iter());
440 buf.extend(vec![1, 2, 3, 4, 5].into_iter());
441 buf
442 };
443
444 assert!(RawFrame::from_buf(&buf).is_none());
445 }
446 {
448 let data = b"123";
449 let header = (data.len() as u32, 0x1, 0, 1);
450 let buf = {
451 let mut buf = Vec::new();
452 buf.extend(pack_header(&header).to_vec().into_iter());
453 buf.extend(data[..2].to_vec().into_iter());
454 buf
455 };
456
457 assert!(RawFrame::from_buf(&buf).is_none());
458 }
459 {
461 let header = (0, 0x1, 0, 1);
462 let buf = {
463 let mut buf = Vec::new();
464 buf.extend(pack_header(&header)[..5].to_vec().into_iter());
465 buf
466 };
467
468 assert!(RawFrame::from_buf(&buf).is_none());
469 }
470 {
472 assert!(RawFrame::from_buf(&[]).is_none());
473 }
474 }
475
476 #[test]
479 fn test_raw_frame_from_vec_buffer_unchecked() {
480 {
482 let data = b"123";
483 let header = (data.len() as u32, 0x1, 0, 1);
484 let buf = {
485 let mut buf = Vec::new();
486 buf.extend(pack_header(&header).to_vec().into_iter());
487 buf.extend(data.to_vec().into_iter());
488 buf
489 };
490 let buf_clone = buf.clone();
491
492 let raw = RawFrame::from(buf);
493
494 assert_eq!(raw.header(), header);
495 assert_eq!(raw.payload(), data);
496 assert_eq!(raw.serialize(), buf_clone);
497 }
498 {
500 let data = b"123";
501 let header = (data.len() as u32, 0x1, 0, 1);
502 let buf = {
503 let mut buf = Vec::new();
504 buf.extend(pack_header(&header).to_vec().into_iter());
505 buf.extend(data.to_vec().into_iter());
506 buf.extend(b"12345".to_vec().into_iter());
507 buf
508 };
509 let buf_clone = buf.clone();
510
511 let raw = RawFrame::from(buf);
512
513 assert_eq!(raw.header(), header);
514 assert_eq!(raw.payload(), b"12312345");
515 assert_eq!(raw.serialize(), buf_clone);
516 }
517 {
519 let data = b"123";
520 let header = (data.len() as u32, 0x1, 0, 1);
521 let buf = {
522 let mut buf = Vec::new();
523 buf.extend(pack_header(&header).to_vec().into_iter());
524 buf.extend(data[..2].to_vec().into_iter());
525 buf
526 };
527 let buf_clone = buf.clone();
528
529 let raw = RawFrame::from(buf);
530
531 assert_eq!(raw.header(), header);
532 assert_eq!(raw.payload(), b"12");
533 assert_eq!(raw.serialize(), buf_clone);
534 }
535 {
537 let header = (0, 0x1, 0, 1);
538 let buf = {
539 let mut buf = Vec::new();
540 buf.extend(pack_header(&header)[..5].to_vec().into_iter());
541 buf
542 };
543 let buf_clone = buf.clone();
544
545 let raw = RawFrame::from(buf);
546
547 assert_eq!(raw.serialize(), buf_clone);
548 }
549 {
551 assert_eq!(RawFrame::from(vec![]).serialize(), &[]);
552 }
553 }
554
555 #[test]
558 fn test_raw_frame_serialize() {
559 let data = b"123";
560 let header = (data.len() as u32, 0x1, 0, 1);
561 let buf = {
562 let mut buf = Vec::new();
563 buf.extend(pack_header(&header).to_vec().into_iter());
564 buf.extend(data.to_vec().into_iter());
565 buf
566 };
567 let raw = RawFrame::from_buf(&buf).unwrap();
568
569 assert_eq!(raw.serialize(), buf);
570 }
571
572 #[test]
574 fn test_raw_frame_into_vec() {
575 let data = b"123";
576 let header = (data.len() as u32, 0x1, 0, 1);
577 let buf = {
578 let mut buf = Vec::new();
579 buf.extend(pack_header(&header).to_vec().into_iter());
580 buf.extend(data.to_vec().into_iter());
581 buf
582 };
583 let raw = RawFrame::from_buf(&buf).unwrap();
584
585 let serialized = raw.serialize();
586 let vec: Vec<_> = raw.into();
587 assert_eq!(vec, buf);
589 assert_eq!(vec, serialized);
591 }
592}