1 // Copyright (C) 2019, Cloudflare, Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer.
10 //
11 // * Redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution.
14 //
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16 // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
19 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27 #[macro_use]
28 extern crate log;
29
30 use std::fs::File;
31
32 use std::io::prelude::*;
33
34 use quiche::h3::NameValue;
35
36 use quiche::h3::qpack;
37
main()38 fn main() {
39 // TODO: parse params from file name.
40
41 let mut args = std::env::args();
42
43 let cmd = &args.next().unwrap();
44
45 if args.len() != 1 {
46 println!("Usage: {} FILE", cmd);
47 return;
48 }
49
50 let mut file = File::open(&args.next().unwrap()).unwrap();
51
52 let mut dec = qpack::Decoder::new();
53
54 loop {
55 let mut stream_id: [u8; 8] = [0; 8];
56 let mut len: [u8; 4] = [0; 4];
57
58 let _ = file.read(&mut stream_id).unwrap();
59 let stream_id = u64::from_be_bytes(stream_id);
60
61 let _ = file.read(&mut len).unwrap();
62 let len = u32::from_be_bytes(len) as usize;
63
64 let mut data = vec![0; len as usize];
65
66 let data_len = file.read(&mut data).unwrap();
67
68 if data_len == 0 {
69 break;
70 }
71
72 debug!("Got stream={} len={}", stream_id, len);
73
74 if stream_id == 0 {
75 dec.control(&mut data[..len]).unwrap();
76 continue;
77 }
78
79 for hdr in dec.decode(&data[..len], std::u64::MAX).unwrap() {
80 println!("{}\t{}", hdr.name(), hdr.value());
81 }
82
83 println!();
84 }
85 }
86