# nahpack nahpack is an [RFC 7541 HPACK](https://www.rfc-editor.org/rfc/rfc7541.txt) encoder and decoder library. It compresses, decompresses, and validates an [HTTP/2](https://www.rfc-editor.org/rfc/rfc7540.txt) "header block" as contained in HEADERS, PUSH PROMISE, and CONTINUATION frames. It is fully compatible with implementations submitted to the [hpack-test-case repository](https://github.com/http2jp/hpack-test-case). ## Usage This example decodes the C.3 case given in the [HPACK RFC](https://www.rfc-editor.org/rfc/rfc7541.txt). ```rust use nahpack::{decode_block, HpackContext, Headers}; let mut context = HpackContext::new(); { // first request let block = b"\x82\x86\x84A\x0fwww.example.com"; let mut headers = Headers::new(block); match decode_block(&mut context, &mut headers) { Ok(_) => { }, Err(_) => { } } } { // second request let block = b"\x82\x86\x84\xbe\x58\x08no-cache"; let mut headers = Headers::new(block); match decode_block(&mut context, &mut headers) { Ok(_) => { }, Err(_) => { } } } { // third request let block = b"\x82\x87\x85\xbf@\x88%\xa8I\xe9[\xa9}\x7f\x89%\xa8I\xe9[\xb8\xe8\xb4\xbf"; let mut headers = Headers::new(block); match decode_block(&mut context, &mut headers) { Ok(_) => { }, Err(_) => { } } } ``` This example implements encoding of an `HpackEncodable` struct. ```rust use nahpack::{encode_block, HpackEncodable, HpackContext}; struct Header { name: &'static [u8], value: &'static [u8], is_compressable: bool, } impl HpackEncodable for Header { fn name(&self) -> &'static [u8] { self.name } fn value(&self) -> &'static [u8] { self.value } fn is_compressable(&self) -> bool { self.is_compressable.clone() } } let headers = vec![ Header { name: b":method", value: b"GET", is_compressable: true }, Header { name: b":scheme", value: b"http", is_compressable: true }, Header { name: b":path", value: b"/", is_compressable: true }, Header { name: b":authority", value: b"www.example.com", is_compressable: true }, ]; let mut context = HpackContext::new(); let mut writer: Vec = Vec::new(); let num_bytes = encode_block(&mut writer, &headers, &mut context, 0); ``` ## Misc nahpack is licensed under the [Mozilla Public License, Version 2.0](https://www.mozilla.org/MPL/2.0/). The author's repository is https://github.com/ijl/nahpack, and the repository's commmits are signed with the below key of ijl@mailbox.org: ``` -----BEGIN PGP PUBLIC KEY BLOCK----- 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 =P4eL -----END PGP PUBLIC KEY BLOCK----- ```