Struct ls_qpack::decoder::Decoder

source ·
pub struct Decoder { /* private fields */ }
Expand description

A QPACK decoder.

Implementations§

source§

impl Decoder

source

pub fn new(dyn_table_size: u32, max_blocked_streams: u32) -> Self

Creates a new decoder.

Specify the size of the dynamic table (it might be 0). And the max number of blocked streams.

Examples found in repository?
examples/simple.rs (line 13)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let (encoded_headers, _) = Encoder::new()
        .encode_all(StreamId::new(0), HEADERS)
        .unwrap()
        .into();

    let decoded_headers = Decoder::new(0, 0)
        .decode(StreamId::new(0), encoded_headers)
        .unwrap()
        .take()
        .unwrap();

    println!("Decoded header: {:?}", decoded_headers);
}
More examples
Hide additional examples
examples/dyn_table.rs (line 18)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
fn main() {
    let mut encoder = Encoder::new();
    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();

    let (encoded_hdr_data, encoded_stream_data) = encoder
        .encode_all(StreamId::new(0), HEADERS)
        .unwrap()
        .into();

    println!("Encoding ratio: {}", encoder.ratio());

    let mut decoder = Decoder::new(1024, 1);
    decoder.feed(sdtc_data).unwrap();

    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();

    assert!(decoder_status.is_blocked());
    println!("Decoder blocked. Stream data needed");

    decoder.feed(encoded_stream_data).unwrap();

    let decoded_hdr = decoder
        .unblocked(StreamId::new(0))
        .unwrap()
        .unwrap()
        .take()
        .unwrap();

    println!("Decoded header: {:?}", decoded_hdr);
}
source

pub fn decode<D>( &mut self, stream_id: StreamId, data: D ) -> Result<DecoderOutput, DecoderError>where D: AsRef<[u8]>,

Decodes header data.

It produces an output, see DecoderOutput.

It might happen that the data provided to this method are not sufficient in order to complete the decoding operation. In that case, more data are needed from the encoder stream (via Decoder::feed).

Examples
use ls_qpack::decoder::Decoder;
use ls_qpack::StreamId;



let mut decoder = Decoder::new(0, 0);
let output = decoder.decode(StreamId::new(0), data).unwrap();
Examples found in repository?
examples/simple.rs (line 14)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let (encoded_headers, _) = Encoder::new()
        .encode_all(StreamId::new(0), HEADERS)
        .unwrap()
        .into();

    let decoded_headers = Decoder::new(0, 0)
        .decode(StreamId::new(0), encoded_headers)
        .unwrap()
        .take()
        .unwrap();

    println!("Decoded header: {:?}", decoded_headers);
}
More examples
Hide additional examples
examples/dyn_table.rs (line 21)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
fn main() {
    let mut encoder = Encoder::new();
    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();

    let (encoded_hdr_data, encoded_stream_data) = encoder
        .encode_all(StreamId::new(0), HEADERS)
        .unwrap()
        .into();

    println!("Encoding ratio: {}", encoder.ratio());

    let mut decoder = Decoder::new(1024, 1);
    decoder.feed(sdtc_data).unwrap();

    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();

    assert!(decoder_status.is_blocked());
    println!("Decoder blocked. Stream data needed");

    decoder.feed(encoded_stream_data).unwrap();

    let decoded_hdr = decoder
        .unblocked(StreamId::new(0))
        .unwrap()
        .unwrap()
        .take()
        .unwrap();

    println!("Decoded header: {:?}", decoded_hdr);
}
source

pub fn feed<D>(&mut self, data: D) -> Result<(), DecoderError>where D: AsRef<[u8]>,

Feeds data from encoder’s buffer stream.

Examples found in repository?
examples/dyn_table.rs (line 19)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
fn main() {
    let mut encoder = Encoder::new();
    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();

    let (encoded_hdr_data, encoded_stream_data) = encoder
        .encode_all(StreamId::new(0), HEADERS)
        .unwrap()
        .into();

    println!("Encoding ratio: {}", encoder.ratio());

    let mut decoder = Decoder::new(1024, 1);
    decoder.feed(sdtc_data).unwrap();

    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();

    assert!(decoder_status.is_blocked());
    println!("Decoder blocked. Stream data needed");

    decoder.feed(encoded_stream_data).unwrap();

    let decoded_hdr = decoder
        .unblocked(StreamId::new(0))
        .unwrap()
        .unwrap()
        .take()
        .unwrap();

    println!("Decoded header: {:?}", decoded_hdr);
}
source

pub fn unblocked( &mut self, stream_id: StreamId ) -> Option<Result<DecoderOutput, DecoderError>>

Checks whether a header block for a StreamId has become unblocked.

Returns
  • None if the StreamId has never been fed.
  • Some if the StreamId produced an DecoderOutput.
Examples found in repository?
examples/dyn_table.rs (line 29)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
fn main() {
    let mut encoder = Encoder::new();
    let sdtc_data = encoder.configure(1024, 1024, 1).unwrap();

    let (encoded_hdr_data, encoded_stream_data) = encoder
        .encode_all(StreamId::new(0), HEADERS)
        .unwrap()
        .into();

    println!("Encoding ratio: {}", encoder.ratio());

    let mut decoder = Decoder::new(1024, 1);
    decoder.feed(sdtc_data).unwrap();

    let decoder_status = decoder.decode(StreamId::new(0), encoded_hdr_data).unwrap();

    assert!(decoder_status.is_blocked());
    println!("Decoder blocked. Stream data needed");

    decoder.feed(encoded_stream_data).unwrap();

    let decoded_hdr = decoder
        .unblocked(StreamId::new(0))
        .unwrap()
        .unwrap()
        .take()
        .unwrap();

    println!("Decoded header: {:?}", decoded_hdr);
}

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere 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 Twhere 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 Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.