Decoder

Struct 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)
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 18)
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 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)
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 21)
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 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)
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 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)
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}

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.