use crate::hpack::{Decoder, Encoder, Header}; use bytes::BytesMut; use hex::FromHex; use serde_json::Value; use std::fs::File; use std::io::prelude::*; use std::io::Cursor; use std::path::Path; use std::str; fn test_fixture(path: &Path) { let mut file = File::open(path).unwrap(); let mut data = String::new(); file.read_to_string(&mut data).unwrap(); let story: Value = serde_json::from_str(&data).unwrap(); test_story(story); } fn test_story(story: Value) { let story = story.as_object().unwrap(); if let Some(cases) = story.get("cases") { let mut cases: Vec<_> = cases .as_array() .unwrap() .iter() .map(|case| { let case = case.as_object().unwrap(); let size = case .get("header_table_size") .map(|v| v.as_u64().unwrap() as usize); let wire = case.get("wire").unwrap().as_str().unwrap(); let wire: Vec = FromHex::from_hex(wire.as_bytes()).unwrap(); let expect: Vec<_> = case .get("headers") .unwrap() .as_array() .unwrap() .iter() .map(|h| { let h = h.as_object().unwrap(); let (name, val) = h.iter().next().unwrap(); (name.clone(), val.as_str().unwrap().to_string()) }) .collect(); Case { seqno: case.get("seqno").unwrap().as_u64().unwrap(), wire: wire, expect: expect, header_table_size: size, } }) .collect(); cases.sort_by_key(|c| c.seqno); let mut decoder = Decoder::default(); // First, check decoding against the fixtures for case in &cases { let mut expect = case.expect.clone(); if let Some(size) = case.header_table_size { decoder.queue_size_update(size); } let mut buf = BytesMut::with_capacity(case.wire.len()); buf.extend_from_slice(&case.wire); decoder .decode(&mut Cursor::new(&mut buf), |e| { let (name, value) = expect.remove(0); assert_eq!(name, key_str(&e)); assert_eq!(value, value_str(&e)); }) .unwrap(); assert_eq!(0, expect.len()); } let mut encoder = Encoder::default(); let mut decoder = Decoder::default(); // Now, encode the headers for case in &cases { let limit = 64 * 1024; let mut buf = BytesMut::with_capacity(limit); if let Some(size) = case.header_table_size { encoder.update_max_size(size); decoder.queue_size_update(size); } let mut input: Vec<_> = case .expect .iter() .map(|&(ref name, ref value)| { Header::new(name.clone().into(), value.clone().into()) .unwrap() .into() }) .collect(); encoder.encode(&mut input.clone().into_iter(), &mut buf); decoder .decode(&mut Cursor::new(&mut buf), |e| { assert_eq!(e, input.remove(0).reify().unwrap()); }) .unwrap(); assert_eq!(0, input.len()); } } } struct Case { seqno: u64, wire: Vec, expect: Vec<(String, String)>, header_table_size: Option, } fn key_str(e: &Header) -> &str { match *e { Header::Field { ref name, .. } => name.as_str(), Header::Authority(..) => ":authority", Header::Method(..) => ":method", Header::Scheme(..) => ":scheme", Header::Path(..) => ":path", Header::Protocol(..) => ":protocol", Header::Status(..) => ":status", } } fn value_str(e: &Header) -> &str { match *e { Header::Field { ref value, .. } => value.to_str().unwrap(), Header::Authority(ref v) => &**v, Header::Method(ref m) => m.as_str(), Header::Scheme(ref v) => &**v, Header::Path(ref v) => &**v, Header::Protocol(ref v) => v.as_str(), Header::Status(ref v) => v.as_str(), } } macro_rules! fixture_mod { ($module:ident => { $( ($fn:ident, $path:expr); )+ }) => { mod $module { $( #[test] fn $fn() { let path = ::std::path::Path::new(env!("CARGO_MANIFEST_DIR")) .join("fixtures/hpack") .join($path); super::test_fixture(path.as_ref()); } )+ } } } fixture_mod!( haskell_http2_linear_huffman => { (story_00, "haskell-http2-linear-huffman/story_00.json"); (story_01, "haskell-http2-linear-huffman/story_01.json"); (story_02, "haskell-http2-linear-huffman/story_02.json"); (story_03, "haskell-http2-linear-huffman/story_03.json"); (story_04, "haskell-http2-linear-huffman/story_04.json"); (story_05, "haskell-http2-linear-huffman/story_05.json"); (story_06, "haskell-http2-linear-huffman/story_06.json"); (story_07, "haskell-http2-linear-huffman/story_07.json"); (story_08, "haskell-http2-linear-huffman/story_08.json"); (story_09, "haskell-http2-linear-huffman/story_09.json"); (story_10, "haskell-http2-linear-huffman/story_10.json"); (story_11, "haskell-http2-linear-huffman/story_11.json"); (story_12, "haskell-http2-linear-huffman/story_12.json"); (story_13, "haskell-http2-linear-huffman/story_13.json"); (story_14, "haskell-http2-linear-huffman/story_14.json"); (story_15, "haskell-http2-linear-huffman/story_15.json"); (story_16, "haskell-http2-linear-huffman/story_16.json"); (story_17, "haskell-http2-linear-huffman/story_17.json"); (story_18, "haskell-http2-linear-huffman/story_18.json"); (story_19, "haskell-http2-linear-huffman/story_19.json"); (story_20, "haskell-http2-linear-huffman/story_20.json"); (story_21, "haskell-http2-linear-huffman/story_21.json"); (story_22, "haskell-http2-linear-huffman/story_22.json"); (story_23, "haskell-http2-linear-huffman/story_23.json"); (story_24, "haskell-http2-linear-huffman/story_24.json"); (story_25, "haskell-http2-linear-huffman/story_25.json"); (story_26, "haskell-http2-linear-huffman/story_26.json"); (story_27, "haskell-http2-linear-huffman/story_27.json"); (story_28, "haskell-http2-linear-huffman/story_28.json"); (story_29, "haskell-http2-linear-huffman/story_29.json"); (story_30, "haskell-http2-linear-huffman/story_30.json"); (story_31, "haskell-http2-linear-huffman/story_31.json"); } ); fixture_mod!( python_hpack => { (story_00, "python-hpack/story_00.json"); (story_01, "python-hpack/story_01.json"); (story_02, "python-hpack/story_02.json"); (story_03, "python-hpack/story_03.json"); (story_04, "python-hpack/story_04.json"); (story_05, "python-hpack/story_05.json"); (story_06, "python-hpack/story_06.json"); (story_07, "python-hpack/story_07.json"); (story_08, "python-hpack/story_08.json"); (story_09, "python-hpack/story_09.json"); (story_10, "python-hpack/story_10.json"); (story_11, "python-hpack/story_11.json"); (story_12, "python-hpack/story_12.json"); (story_13, "python-hpack/story_13.json"); (story_14, "python-hpack/story_14.json"); (story_15, "python-hpack/story_15.json"); (story_16, "python-hpack/story_16.json"); (story_17, "python-hpack/story_17.json"); (story_18, "python-hpack/story_18.json"); (story_19, "python-hpack/story_19.json"); (story_20, "python-hpack/story_20.json"); (story_21, "python-hpack/story_21.json"); (story_22, "python-hpack/story_22.json"); (story_23, "python-hpack/story_23.json"); (story_24, "python-hpack/story_24.json"); (story_25, "python-hpack/story_25.json"); (story_26, "python-hpack/story_26.json"); (story_27, "python-hpack/story_27.json"); (story_28, "python-hpack/story_28.json"); (story_29, "python-hpack/story_29.json"); (story_30, "python-hpack/story_30.json"); (story_31, "python-hpack/story_31.json"); } ); fixture_mod!( nghttp2_16384_4096 => { (story_00, "nghttp2-16384-4096/story_00.json"); (story_01, "nghttp2-16384-4096/story_01.json"); (story_02, "nghttp2-16384-4096/story_02.json"); (story_03, "nghttp2-16384-4096/story_03.json"); (story_04, "nghttp2-16384-4096/story_04.json"); (story_05, "nghttp2-16384-4096/story_05.json"); (story_06, "nghttp2-16384-4096/story_06.json"); (story_07, "nghttp2-16384-4096/story_07.json"); (story_08, "nghttp2-16384-4096/story_08.json"); (story_09, "nghttp2-16384-4096/story_09.json"); (story_10, "nghttp2-16384-4096/story_10.json"); (story_11, "nghttp2-16384-4096/story_11.json"); (story_12, "nghttp2-16384-4096/story_12.json"); (story_13, "nghttp2-16384-4096/story_13.json"); (story_14, "nghttp2-16384-4096/story_14.json"); (story_15, "nghttp2-16384-4096/story_15.json"); (story_16, "nghttp2-16384-4096/story_16.json"); (story_17, "nghttp2-16384-4096/story_17.json"); (story_18, "nghttp2-16384-4096/story_18.json"); (story_19, "nghttp2-16384-4096/story_19.json"); (story_20, "nghttp2-16384-4096/story_20.json"); (story_21, "nghttp2-16384-4096/story_21.json"); (story_22, "nghttp2-16384-4096/story_22.json"); (story_23, "nghttp2-16384-4096/story_23.json"); (story_24, "nghttp2-16384-4096/story_24.json"); (story_25, "nghttp2-16384-4096/story_25.json"); (story_26, "nghttp2-16384-4096/story_26.json"); (story_27, "nghttp2-16384-4096/story_27.json"); (story_28, "nghttp2-16384-4096/story_28.json"); (story_29, "nghttp2-16384-4096/story_29.json"); (story_30, "nghttp2-16384-4096/story_30.json"); } ); fixture_mod!( node_http2_hpack => { (story_00, "node-http2-hpack/story_00.json"); (story_01, "node-http2-hpack/story_01.json"); (story_02, "node-http2-hpack/story_02.json"); (story_03, "node-http2-hpack/story_03.json"); (story_04, "node-http2-hpack/story_04.json"); (story_05, "node-http2-hpack/story_05.json"); (story_06, "node-http2-hpack/story_06.json"); (story_07, "node-http2-hpack/story_07.json"); (story_08, "node-http2-hpack/story_08.json"); (story_09, "node-http2-hpack/story_09.json"); (story_10, "node-http2-hpack/story_10.json"); (story_11, "node-http2-hpack/story_11.json"); (story_12, "node-http2-hpack/story_12.json"); (story_13, "node-http2-hpack/story_13.json"); (story_14, "node-http2-hpack/story_14.json"); (story_15, "node-http2-hpack/story_15.json"); (story_16, "node-http2-hpack/story_16.json"); (story_17, "node-http2-hpack/story_17.json"); (story_18, "node-http2-hpack/story_18.json"); (story_19, "node-http2-hpack/story_19.json"); (story_20, "node-http2-hpack/story_20.json"); (story_21, "node-http2-hpack/story_21.json"); (story_22, "node-http2-hpack/story_22.json"); (story_23, "node-http2-hpack/story_23.json"); (story_24, "node-http2-hpack/story_24.json"); (story_25, "node-http2-hpack/story_25.json"); (story_26, "node-http2-hpack/story_26.json"); (story_27, "node-http2-hpack/story_27.json"); (story_28, "node-http2-hpack/story_28.json"); (story_29, "node-http2-hpack/story_29.json"); (story_30, "node-http2-hpack/story_30.json"); (story_31, "node-http2-hpack/story_31.json"); } ); fixture_mod!( nghttp2_change_table_size => { (story_00, "nghttp2-change-table-size/story_00.json"); (story_01, "nghttp2-change-table-size/story_01.json"); (story_02, "nghttp2-change-table-size/story_02.json"); (story_03, "nghttp2-change-table-size/story_03.json"); (story_04, "nghttp2-change-table-size/story_04.json"); (story_05, "nghttp2-change-table-size/story_05.json"); (story_06, "nghttp2-change-table-size/story_06.json"); (story_07, "nghttp2-change-table-size/story_07.json"); (story_08, "nghttp2-change-table-size/story_08.json"); (story_09, "nghttp2-change-table-size/story_09.json"); (story_10, "nghttp2-change-table-size/story_10.json"); (story_11, "nghttp2-change-table-size/story_11.json"); (story_12, "nghttp2-change-table-size/story_12.json"); (story_13, "nghttp2-change-table-size/story_13.json"); (story_14, "nghttp2-change-table-size/story_14.json"); (story_15, "nghttp2-change-table-size/story_15.json"); (story_16, "nghttp2-change-table-size/story_16.json"); (story_17, "nghttp2-change-table-size/story_17.json"); (story_18, "nghttp2-change-table-size/story_18.json"); (story_19, "nghttp2-change-table-size/story_19.json"); (story_20, "nghttp2-change-table-size/story_20.json"); (story_21, "nghttp2-change-table-size/story_21.json"); (story_22, "nghttp2-change-table-size/story_22.json"); (story_23, "nghttp2-change-table-size/story_23.json"); (story_24, "nghttp2-change-table-size/story_24.json"); (story_25, "nghttp2-change-table-size/story_25.json"); (story_26, "nghttp2-change-table-size/story_26.json"); (story_27, "nghttp2-change-table-size/story_27.json"); (story_28, "nghttp2-change-table-size/story_28.json"); (story_29, "nghttp2-change-table-size/story_29.json"); (story_30, "nghttp2-change-table-size/story_30.json"); } ); fixture_mod!( haskell_http2_static_huffman => { (story_00, "haskell-http2-static-huffman/story_00.json"); (story_01, "haskell-http2-static-huffman/story_01.json"); (story_02, "haskell-http2-static-huffman/story_02.json"); (story_03, "haskell-http2-static-huffman/story_03.json"); (story_04, "haskell-http2-static-huffman/story_04.json"); (story_05, "haskell-http2-static-huffman/story_05.json"); (story_06, "haskell-http2-static-huffman/story_06.json"); (story_07, "haskell-http2-static-huffman/story_07.json"); (story_08, "haskell-http2-static-huffman/story_08.json"); (story_09, "haskell-http2-static-huffman/story_09.json"); (story_10, "haskell-http2-static-huffman/story_10.json"); (story_11, "haskell-http2-static-huffman/story_11.json"); (story_12, "haskell-http2-static-huffman/story_12.json"); (story_13, "haskell-http2-static-huffman/story_13.json"); (story_14, "haskell-http2-static-huffman/story_14.json"); (story_15, "haskell-http2-static-huffman/story_15.json"); (story_16, "haskell-http2-static-huffman/story_16.json"); (story_17, "haskell-http2-static-huffman/story_17.json"); (story_18, "haskell-http2-static-huffman/story_18.json"); (story_19, "haskell-http2-static-huffman/story_19.json"); (story_20, "haskell-http2-static-huffman/story_20.json"); (story_21, "haskell-http2-static-huffman/story_21.json"); (story_22, "haskell-http2-static-huffman/story_22.json"); (story_23, "haskell-http2-static-huffman/story_23.json"); (story_24, "haskell-http2-static-huffman/story_24.json"); (story_25, "haskell-http2-static-huffman/story_25.json"); (story_26, "haskell-http2-static-huffman/story_26.json"); (story_27, "haskell-http2-static-huffman/story_27.json"); (story_28, "haskell-http2-static-huffman/story_28.json"); (story_29, "haskell-http2-static-huffman/story_29.json"); (story_30, "haskell-http2-static-huffman/story_30.json"); (story_31, "haskell-http2-static-huffman/story_31.json"); } ); fixture_mod!( haskell_http2_naive_huffman => { (story_00, "haskell-http2-naive-huffman/story_00.json"); (story_01, "haskell-http2-naive-huffman/story_01.json"); (story_02, "haskell-http2-naive-huffman/story_02.json"); (story_03, "haskell-http2-naive-huffman/story_03.json"); (story_04, "haskell-http2-naive-huffman/story_04.json"); (story_05, "haskell-http2-naive-huffman/story_05.json"); (story_06, "haskell-http2-naive-huffman/story_06.json"); (story_07, "haskell-http2-naive-huffman/story_07.json"); (story_08, "haskell-http2-naive-huffman/story_08.json"); (story_09, "haskell-http2-naive-huffman/story_09.json"); (story_10, "haskell-http2-naive-huffman/story_10.json"); (story_11, "haskell-http2-naive-huffman/story_11.json"); (story_12, "haskell-http2-naive-huffman/story_12.json"); (story_13, "haskell-http2-naive-huffman/story_13.json"); (story_14, "haskell-http2-naive-huffman/story_14.json"); (story_15, "haskell-http2-naive-huffman/story_15.json"); (story_16, "haskell-http2-naive-huffman/story_16.json"); (story_17, "haskell-http2-naive-huffman/story_17.json"); (story_18, "haskell-http2-naive-huffman/story_18.json"); (story_19, "haskell-http2-naive-huffman/story_19.json"); (story_20, "haskell-http2-naive-huffman/story_20.json"); (story_21, "haskell-http2-naive-huffman/story_21.json"); (story_22, "haskell-http2-naive-huffman/story_22.json"); (story_23, "haskell-http2-naive-huffman/story_23.json"); (story_24, "haskell-http2-naive-huffman/story_24.json"); (story_25, "haskell-http2-naive-huffman/story_25.json"); (story_26, "haskell-http2-naive-huffman/story_26.json"); (story_27, "haskell-http2-naive-huffman/story_27.json"); (story_28, "haskell-http2-naive-huffman/story_28.json"); (story_29, "haskell-http2-naive-huffman/story_29.json"); (story_30, "haskell-http2-naive-huffman/story_30.json"); (story_31, "haskell-http2-naive-huffman/story_31.json"); } ); fixture_mod!( haskell_http2_naive => { (story_00, "haskell-http2-naive/story_00.json"); (story_01, "haskell-http2-naive/story_01.json"); (story_02, "haskell-http2-naive/story_02.json"); (story_03, "haskell-http2-naive/story_03.json"); (story_04, "haskell-http2-naive/story_04.json"); (story_05, "haskell-http2-naive/story_05.json"); (story_06, "haskell-http2-naive/story_06.json"); (story_07, "haskell-http2-naive/story_07.json"); (story_08, "haskell-http2-naive/story_08.json"); (story_09, "haskell-http2-naive/story_09.json"); (story_10, "haskell-http2-naive/story_10.json"); (story_11, "haskell-http2-naive/story_11.json"); (story_12, "haskell-http2-naive/story_12.json"); (story_13, "haskell-http2-naive/story_13.json"); (story_14, "haskell-http2-naive/story_14.json"); (story_15, "haskell-http2-naive/story_15.json"); (story_16, "haskell-http2-naive/story_16.json"); (story_17, "haskell-http2-naive/story_17.json"); (story_18, "haskell-http2-naive/story_18.json"); (story_19, "haskell-http2-naive/story_19.json"); (story_20, "haskell-http2-naive/story_20.json"); (story_21, "haskell-http2-naive/story_21.json"); (story_22, "haskell-http2-naive/story_22.json"); (story_23, "haskell-http2-naive/story_23.json"); (story_24, "haskell-http2-naive/story_24.json"); (story_25, "haskell-http2-naive/story_25.json"); (story_26, "haskell-http2-naive/story_26.json"); (story_27, "haskell-http2-naive/story_27.json"); (story_28, "haskell-http2-naive/story_28.json"); (story_29, "haskell-http2-naive/story_29.json"); (story_30, "haskell-http2-naive/story_30.json"); (story_31, "haskell-http2-naive/story_31.json"); } ); fixture_mod!( haskell_http2_static => { (story_00, "haskell-http2-static/story_00.json"); (story_01, "haskell-http2-static/story_01.json"); (story_02, "haskell-http2-static/story_02.json"); (story_03, "haskell-http2-static/story_03.json"); (story_04, "haskell-http2-static/story_04.json"); (story_05, "haskell-http2-static/story_05.json"); (story_06, "haskell-http2-static/story_06.json"); (story_07, "haskell-http2-static/story_07.json"); (story_08, "haskell-http2-static/story_08.json"); (story_09, "haskell-http2-static/story_09.json"); (story_10, "haskell-http2-static/story_10.json"); (story_11, "haskell-http2-static/story_11.json"); (story_12, "haskell-http2-static/story_12.json"); (story_13, "haskell-http2-static/story_13.json"); (story_14, "haskell-http2-static/story_14.json"); (story_15, "haskell-http2-static/story_15.json"); (story_16, "haskell-http2-static/story_16.json"); (story_17, "haskell-http2-static/story_17.json"); (story_18, "haskell-http2-static/story_18.json"); (story_19, "haskell-http2-static/story_19.json"); (story_20, "haskell-http2-static/story_20.json"); (story_21, "haskell-http2-static/story_21.json"); (story_22, "haskell-http2-static/story_22.json"); (story_23, "haskell-http2-static/story_23.json"); (story_24, "haskell-http2-static/story_24.json"); (story_25, "haskell-http2-static/story_25.json"); (story_26, "haskell-http2-static/story_26.json"); (story_27, "haskell-http2-static/story_27.json"); (story_28, "haskell-http2-static/story_28.json"); (story_29, "haskell-http2-static/story_29.json"); (story_30, "haskell-http2-static/story_30.json"); (story_31, "haskell-http2-static/story_31.json"); } ); fixture_mod!( nghttp2 => { (story_00, "nghttp2/story_00.json"); (story_01, "nghttp2/story_01.json"); (story_02, "nghttp2/story_02.json"); (story_03, "nghttp2/story_03.json"); (story_04, "nghttp2/story_04.json"); (story_05, "nghttp2/story_05.json"); (story_06, "nghttp2/story_06.json"); (story_07, "nghttp2/story_07.json"); (story_08, "nghttp2/story_08.json"); (story_09, "nghttp2/story_09.json"); (story_10, "nghttp2/story_10.json"); (story_11, "nghttp2/story_11.json"); (story_12, "nghttp2/story_12.json"); (story_13, "nghttp2/story_13.json"); (story_14, "nghttp2/story_14.json"); (story_15, "nghttp2/story_15.json"); (story_16, "nghttp2/story_16.json"); (story_17, "nghttp2/story_17.json"); (story_18, "nghttp2/story_18.json"); (story_19, "nghttp2/story_19.json"); (story_20, "nghttp2/story_20.json"); (story_21, "nghttp2/story_21.json"); (story_22, "nghttp2/story_22.json"); (story_23, "nghttp2/story_23.json"); (story_24, "nghttp2/story_24.json"); (story_25, "nghttp2/story_25.json"); (story_26, "nghttp2/story_26.json"); (story_27, "nghttp2/story_27.json"); (story_28, "nghttp2/story_28.json"); (story_29, "nghttp2/story_29.json"); (story_30, "nghttp2/story_30.json"); (story_31, "nghttp2/story_31.json"); } ); fixture_mod!( haskell_http2_linear => { (story_00, "haskell-http2-linear/story_00.json"); (story_01, "haskell-http2-linear/story_01.json"); (story_02, "haskell-http2-linear/story_02.json"); (story_03, "haskell-http2-linear/story_03.json"); (story_04, "haskell-http2-linear/story_04.json"); (story_05, "haskell-http2-linear/story_05.json"); (story_06, "haskell-http2-linear/story_06.json"); (story_07, "haskell-http2-linear/story_07.json"); (story_08, "haskell-http2-linear/story_08.json"); (story_09, "haskell-http2-linear/story_09.json"); (story_10, "haskell-http2-linear/story_10.json"); (story_11, "haskell-http2-linear/story_11.json"); (story_12, "haskell-http2-linear/story_12.json"); (story_13, "haskell-http2-linear/story_13.json"); (story_14, "haskell-http2-linear/story_14.json"); (story_15, "haskell-http2-linear/story_15.json"); (story_16, "haskell-http2-linear/story_16.json"); (story_17, "haskell-http2-linear/story_17.json"); (story_18, "haskell-http2-linear/story_18.json"); (story_19, "haskell-http2-linear/story_19.json"); (story_20, "haskell-http2-linear/story_20.json"); (story_21, "haskell-http2-linear/story_21.json"); (story_22, "haskell-http2-linear/story_22.json"); (story_23, "haskell-http2-linear/story_23.json"); (story_24, "haskell-http2-linear/story_24.json"); (story_25, "haskell-http2-linear/story_25.json"); (story_26, "haskell-http2-linear/story_26.json"); (story_27, "haskell-http2-linear/story_27.json"); (story_28, "haskell-http2-linear/story_28.json"); (story_29, "haskell-http2-linear/story_29.json"); (story_30, "haskell-http2-linear/story_30.json"); (story_31, "haskell-http2-linear/story_31.json"); } ); fixture_mod!( go_hpack => { (story_00, "go-hpack/story_00.json"); (story_01, "go-hpack/story_01.json"); (story_02, "go-hpack/story_02.json"); (story_03, "go-hpack/story_03.json"); (story_04, "go-hpack/story_04.json"); (story_05, "go-hpack/story_05.json"); (story_06, "go-hpack/story_06.json"); (story_07, "go-hpack/story_07.json"); (story_08, "go-hpack/story_08.json"); (story_09, "go-hpack/story_09.json"); (story_10, "go-hpack/story_10.json"); (story_11, "go-hpack/story_11.json"); (story_12, "go-hpack/story_12.json"); (story_13, "go-hpack/story_13.json"); (story_14, "go-hpack/story_14.json"); (story_15, "go-hpack/story_15.json"); (story_16, "go-hpack/story_16.json"); (story_17, "go-hpack/story_17.json"); (story_18, "go-hpack/story_18.json"); (story_19, "go-hpack/story_19.json"); (story_20, "go-hpack/story_20.json"); (story_21, "go-hpack/story_21.json"); (story_22, "go-hpack/story_22.json"); (story_23, "go-hpack/story_23.json"); (story_24, "go-hpack/story_24.json"); (story_25, "go-hpack/story_25.json"); (story_26, "go-hpack/story_26.json"); (story_27, "go-hpack/story_27.json"); (story_28, "go-hpack/story_28.json"); (story_29, "go-hpack/story_29.json"); (story_30, "go-hpack/story_30.json"); (story_31, "go-hpack/story_31.json"); } );