• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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