1 unstable release

Uses old Rust 2015

0.2.0 Aug 28, 2015

#1999 in Parser implementations

MPL2 license

185KB
7.5K SLoC

nahpack

nahpack is an RFC 7541 HPACK encoder and decoder library.

It compresses, decompresses, and validates an HTTP/2 "header block" as contained in HEADERS, PUSH PROMISE, and CONTINUATION frames.

It is fully compatible with implementations submitted to the hpack-test-case repository.

Usage

This example decodes the C.3 case given in the HPACK RFC.

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.

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<u8> = 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.

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-----

No runtime deps