Encoder

Struct Encoder 

Source
pub struct Encoder { /* private fields */ }
Expand description

A QPACK encoder.

Implementations§

Source§

impl Encoder

Source

pub fn new() -> Self

Creates a new encoder.

If not configured, this encoder will only make use of a static table.

Once peer’s settings has been received, you might want to allocate the dynamic table by means of Self::configure.

Examples found in repository?
examples/simple.rs (line 8)
7fn main() {
8    let (encoded_headers, _) = Encoder::new()
9        .encode_all(StreamId::new(0), HEADERS)
10        .unwrap()
11        .into();
12
13    let decoded_headers = Decoder::new(0, 0)
14        .decode(StreamId::new(0), encoded_headers)
15        .unwrap()
16        .take()
17        .unwrap();
18
19    println!("Decoded header: {:?}", decoded_headers);
20}
More examples
Hide additional examples
examples/dyn_table.rs (line 8)
7fn main() {
8    let mut encoder = Encoder::new();
9    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();
10
11    let (encoded_hdr_data, encoded_stream_data) = encoder
12        .encode_all(StreamId::new(0), HEADERS)
13        .unwrap()
14        .into();
15
16    println!("Encoding ratio: {}", encoder.ratio());
17
18    let mut decoder = Decoder::new(1024, 1);
19    decoder.feed(sdtc_data).unwrap();
20
21    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();
22
23    assert!(decoder_status.is_blocked());
24    println!("Decoder blocked. Stream data needed");
25
26    decoder.feed(encoded_stream_data).unwrap();
27
28    let decoded_hdr = decoder
29        .unblocked(StreamId::new(0))
30        .unwrap()
31        .unwrap()
32        .take()
33        .unwrap();
34
35    println!("Decoded header: {:?}", decoded_hdr);
36}
Source

pub fn configure( &mut self, max_table_size: u32, dyn_table_size: u32, max_blocked_streams: u32, ) -> Result<SDTCInstruction, EncoderError>

Sets dynamic table size and it applies peer’s settings.

§Returns

SDTC instruction (Set Dynamic Table Capacity) data. This should be transmitted to the peer via encoder stream.

§Notes
  • dyn_table_size can be 0 to avoid dynamic table.
  • dyn_table_size cannot be larger than max_table_size.
Examples found in repository?
examples/dyn_table.rs (line 9)
7fn main() {
8    let mut encoder = Encoder::new();
9    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();
10
11    let (encoded_hdr_data, encoded_stream_data) = encoder
12        .encode_all(StreamId::new(0), HEADERS)
13        .unwrap()
14        .into();
15
16    println!("Encoding ratio: {}", encoder.ratio());
17
18    let mut decoder = Decoder::new(1024, 1);
19    decoder.feed(sdtc_data).unwrap();
20
21    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();
22
23    assert!(decoder_status.is_blocked());
24    println!("Decoder blocked. Stream data needed");
25
26    decoder.feed(encoded_stream_data).unwrap();
27
28    let decoded_hdr = decoder
29        .unblocked(StreamId::new(0))
30        .unwrap()
31        .unwrap()
32        .take()
33        .unwrap();
34
35    println!("Decoded header: {:?}", decoded_hdr);
36}
Source

pub fn encode_all<I, H>( &mut self, stream_id: StreamId, headers: I, ) -> Result<BuffersEncoded, EncoderError>
where I: IntoIterator<Item = H>, H: TryIntoHeader,

Encodes an entire header block (a list of headers).

§Returns

The encoded data (see BuffersEncoded).

§Examples
use ls_qpack::encoder::Encoder;
use ls_qpack::StreamId;

let mut encoder = Encoder::new();
let (enc_hdr, enc_stream) = encoder
    .encode_all(
        StreamId::new(0),
        [(":status", "404"), (":method", "connect")],
    )
    .unwrap()
    .into();
Examples found in repository?
examples/simple.rs (line 9)
7fn main() {
8    let (encoded_headers, _) = Encoder::new()
9        .encode_all(StreamId::new(0), HEADERS)
10        .unwrap()
11        .into();
12
13    let decoded_headers = Decoder::new(0, 0)
14        .decode(StreamId::new(0), encoded_headers)
15        .unwrap()
16        .take()
17        .unwrap();
18
19    println!("Decoded header: {:?}", decoded_headers);
20}
More examples
Hide additional examples
examples/dyn_table.rs (line 12)
7fn main() {
8    let mut encoder = Encoder::new();
9    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();
10
11    let (encoded_hdr_data, encoded_stream_data) = encoder
12        .encode_all(StreamId::new(0), HEADERS)
13        .unwrap()
14        .into();
15
16    println!("Encoding ratio: {}", encoder.ratio());
17
18    let mut decoder = Decoder::new(1024, 1);
19    decoder.feed(sdtc_data).unwrap();
20
21    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();
22
23    assert!(decoder_status.is_blocked());
24    println!("Decoder blocked. Stream data needed");
25
26    decoder.feed(encoded_stream_data).unwrap();
27
28    let decoded_hdr = decoder
29        .unblocked(StreamId::new(0))
30        .unwrap()
31        .unwrap()
32        .take()
33        .unwrap();
34
35    println!("Decoded header: {:?}", decoded_hdr);
36}
Source

pub fn encoding(&mut self, stream_id: StreamId) -> EncodingBlock<'_>

Encodes a list of headers in a sequential fashion way.

This method is similar to Self::encode_all. However, instead of providing the entire list of header, it is possible to append a header step by step.

See EncodingBlock.

§Examples
use ls_qpack::encoder::Encoder;
use ls_qpack::StreamId;

let mut encoder = Encoder::new();
let mut encoding_block = encoder.encoding(StreamId::new(0));

encoding_block.append((":status", "404"));
encoding_block.append((":method", "connect"));

let (enc_hdr, enc_stream) = encoding_block.encode().unwrap().into();
Source

pub fn ratio(&self) -> f32

Return estimated compression ratio until this point.

Compression ratio is defined as size of the output divided by the size of the input, where output includes both header blocks and instructions sent on the encoder stream.

Examples found in repository?
examples/dyn_table.rs (line 16)
7fn main() {
8    let mut encoder = Encoder::new();
9    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();
10
11    let (encoded_hdr_data, encoded_stream_data) = encoder
12        .encode_all(StreamId::new(0), HEADERS)
13        .unwrap()
14        .into();
15
16    println!("Encoding ratio: {}", encoder.ratio());
17
18    let mut decoder = Decoder::new(1024, 1);
19    decoder.feed(sdtc_data).unwrap();
20
21    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();
22
23    assert!(decoder_status.is_blocked());
24    println!("Decoder blocked. Stream data needed");
25
26    decoder.feed(encoded_stream_data).unwrap();
27
28    let decoded_hdr = decoder
29        .unblocked(StreamId::new(0))
30        .unwrap()
31        .unwrap()
32        .take()
33        .unwrap();
34
35    println!("Decoded header: {:?}", decoded_hdr);
36}

Trait Implementations§

Source§

impl Default for Encoder

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.