Struct s2n_quic_core::packet::interceptor::DecoderBufferMut
source · pub struct DecoderBufferMut<'a> { /* private fields */ }
Expand description
DecoderBufferMut is a panic-free, mutable byte buffer for decoding untrusted input
Implementations§
source§impl<'a> DecoderBufferMut<'a>
impl<'a> DecoderBufferMut<'a>
sourcepub fn new(bytes: &'a mut [u8]) -> DecoderBufferMut<'a>
pub fn new(bytes: &'a mut [u8]) -> DecoderBufferMut<'a>
Create a new DecoderBufferMut
from a byte slice
sourcepub fn freeze(self) -> DecoderBuffer<'a>
pub fn freeze(self) -> DecoderBuffer<'a>
Freeze the mutable buffer into a DecoderBuffer
sourcepub fn into_less_safe_slice(self) -> &'a mut [u8] ⓘ
pub fn into_less_safe_slice(self) -> &'a mut [u8] ⓘ
Move out the buffer’s slice. This should be used with caution, as it removes any panic protection this struct provides.
sourcepub fn as_less_safe_slice_mut(&'a mut self) -> &'a mut [u8] ⓘ
pub fn as_less_safe_slice_mut(&'a mut self) -> &'a mut [u8] ⓘ
Mutably borrow the buffer’s slice. This should be used with caution, as it removes any panic protection this struct provides.
source§impl<'a> DecoderBufferMut<'a>
impl<'a> DecoderBufferMut<'a>
sourcepub fn decode_slice(
self,
count: usize
) -> Result<(DecoderBufferMut<'a>, DecoderBufferMut<'a>), DecoderError>
pub fn decode_slice( self, count: usize ) -> Result<(DecoderBufferMut<'a>, DecoderBufferMut<'a>), DecoderError>
Decode a slice of bytes by count
, removing the slice from the current buffer
let mut data = [0, 1, 2, 3, 4];
let buffer = DecoderBufferMut::new(&mut data);
let (slice, buffer) = buffer.decode_slice(5).unwrap();
assert_eq!(slice, [0u8, 1, 2, 3, 4][..]);
assert!(buffer.is_empty());
sourcepub fn decode<T>(self) -> Result<(T, DecoderBufferMut<'a>), DecoderError>where
T: DecoderValueMut<'a>,
pub fn decode<T>(self) -> Result<(T, DecoderBufferMut<'a>), DecoderError>where
T: DecoderValueMut<'a>,
Decode a value of type T
, splitting the data from the current buffer
let mut data = [0, 1, 2, 3, 4, 5, 6];
let buffer = DecoderBufferMut::new(&mut data);
let (value, buffer) = buffer.decode::<u8>().unwrap();
assert_eq!(value, 0);
let (value, buffer) = buffer.decode::<u16>().unwrap();
assert_eq!(value, 258);
let (value, buffer) = buffer.decode::<u32>().unwrap();
assert_eq!(value, 50_595_078);
assert!(buffer.is_empty());
sourcepub fn decode_slice_with_len_prefix<Length>(
self
) -> Result<(DecoderBufferMut<'a>, DecoderBufferMut<'a>), DecoderError>
pub fn decode_slice_with_len_prefix<Length>( self ) -> Result<(DecoderBufferMut<'a>, DecoderBufferMut<'a>), DecoderError>
Decode a slice prefixed by type Length
, splitting the data from the
current buffer.
With a Length
as encoded u8
:
let mut data = [5, 0, 1, 2, 3, 4];
let buffer = DecoderBufferMut::new(&mut data);
let (slice, buffer) = buffer.decode_slice_with_len_prefix::<u8>().unwrap();
assert_eq!(slice, [0u8, 1, 2, 3, 4][..]);
assert!(buffer.is_empty())
With a Length
as encoded u16
:
let mut data = [0, 5, 0, 1, 2, 3, 4];
let buffer = DecoderBufferMut::new(&mut data);
let (slice, buffer) = buffer.decode_slice_with_len_prefix::<u16>().unwrap();
assert_eq!(slice, [0u8, 1, 2, 3, 4][..]);
assert!(buffer.is_empty())
sourcepub fn decode_with_len_prefix<Length, T>(
self
) -> Result<(T, DecoderBufferMut<'a>), DecoderError>
pub fn decode_with_len_prefix<Length, T>( self ) -> Result<(T, DecoderBufferMut<'a>), DecoderError>
Decode a value of type T
prefixed by type Length
, splitting the data from the
current buffer.
With a Length
as encoded u8
and T
as u16
:
let mut data = [2, 0, 1, 2, 3];
let buffer = DecoderBufferMut::new(&mut data);
let (value, buffer) = buffer.decode_with_len_prefix::<u8, u16>().unwrap();
assert_eq!(value, 1);
assert_eq!(buffer, [2, 3][..])
The DecoderValueMut
implementation of T
must consume the entire subslice
otherwise an error will be returned.
let mut data = [3, 0, 1, 2];
let buffer = DecoderBufferMut::new(&mut data);
let result = buffer.decode_with_len_prefix::<u8, u16>();
assert!(result.is_err())
sourcepub fn decode_parameterized<T>(
self,
parameter: <T as DecoderParameterizedValueMut<'a>>::Parameter
) -> Result<(T, DecoderBufferMut<'a>), DecoderError>where
T: DecoderParameterizedValueMut<'a>,
pub fn decode_parameterized<T>(
self,
parameter: <T as DecoderParameterizedValueMut<'a>>::Parameter
) -> Result<(T, DecoderBufferMut<'a>), DecoderError>where
T: DecoderParameterizedValueMut<'a>,
Decode a parameterized value of type T
implementing DecoderParameterizedValueMut
sourcepub fn skip(self, count: usize) -> Result<DecoderBufferMut<'a>, DecoderError>
pub fn skip(self, count: usize) -> Result<DecoderBufferMut<'a>, DecoderError>
Skip a count
of bytes, discarding the bytes
let mut data = [0, 1, 2, 3, 4];
let buffer = DecoderBufferMut::new(&mut data);
let buffer = buffer.skip(3).unwrap();
assert_eq!(buffer, [3, 4][..]);
sourcepub fn skip_with_len_prefix<Length>(
self
) -> Result<DecoderBufferMut<'a>, DecoderError>
pub fn skip_with_len_prefix<Length>( self ) -> Result<DecoderBufferMut<'a>, DecoderError>
Skip a number of bytes encoded as a length prefix of type Length
With a Length
encoded as u8
:
let mut data = [5, 0, 1, 2, 3, 4];
let buffer = DecoderBufferMut::new(&mut data);
let buffer = buffer.skip_with_len_prefix::<u8>().unwrap();
assert!(buffer.is_empty());
sourcepub fn skip_into_range(
self,
count: usize,
original_buffer: &DecoderBufferMut<'_>
) -> Result<(CheckedRange, DecoderBufferMut<'a>), DecoderError>
pub fn skip_into_range( self, count: usize, original_buffer: &DecoderBufferMut<'_> ) -> Result<(CheckedRange, DecoderBufferMut<'a>), DecoderError>
Skip a count
of bytes, returning a CheckedRange
for later access
sourcepub fn skip_into_range_with_len_prefix<Length>(
self,
original_buffer: &DecoderBufferMut<'_>
) -> Result<(CheckedRange, DecoderBufferMut<'a>), DecoderError>
pub fn skip_into_range_with_len_prefix<Length>( self, original_buffer: &DecoderBufferMut<'_> ) -> Result<(CheckedRange, DecoderBufferMut<'a>), DecoderError>
Skip a number of bytes encoded as a length prefix of type Length
into a CheckedRange
for later access
sourcepub fn get_checked_range(&self, range: &CheckedRange) -> DecoderBuffer<'_>
pub fn get_checked_range(&self, range: &CheckedRange) -> DecoderBuffer<'_>
Reads data from a CheckedRange
sourcepub fn peek(&'a self) -> DecoderBuffer<'a>
pub fn peek(&'a self) -> DecoderBuffer<'a>
Create a peeking DecoderBuffer
from the current buffer view
let mut data = [0, 1];
let buffer = DecoderBufferMut::new(&mut data);
let peek = buffer.peek();
let (value, peek) = peek.decode::<u16>().unwrap();
assert_eq!(value, 1);
assert!(peek.is_empty());
// `buffer` still contains the previous view
assert_eq!(buffer, [0, 1][..]);
sourcepub fn peek_byte(&self, index: usize) -> Result<u8, DecoderError>
pub fn peek_byte(&self, index: usize) -> Result<u8, DecoderError>
Returns a single byte at index
let mut data = [0, 1, 2];
let buffer = DecoderBufferMut::new(&mut data);
assert_eq!(buffer.peek_byte(0).unwrap(), 0);
assert_eq!(buffer.peek_byte(1).unwrap(), 1);
assert_eq!(buffer.peek_byte(2).unwrap(), 2);
// `buffer` has not changed
assert_eq!(buffer, [0, 1, 2][..]);
sourcepub fn peek_range(
&self,
range: Range<usize>
) -> Result<DecoderBuffer<'_>, DecoderError>
pub fn peek_range( &self, range: Range<usize> ) -> Result<DecoderBuffer<'_>, DecoderError>
Returns a PeekBuffer
by range
sourcepub fn ensure_empty(&self) -> Result<(), DecoderError>
pub fn ensure_empty(&self) -> Result<(), DecoderError>
Returns an error if the buffer is not empty.
let mut data = [1];
let buffer = DecoderBufferMut::new(&mut data);
assert!(buffer.ensure_empty().is_err());
let (_, buffer) = buffer.decode::<u8>().unwrap();
assert!(buffer.ensure_empty().is_ok());
sourcepub fn ensure_len(&self, len: usize) -> Result<(), DecoderError>
pub fn ensure_len(&self, len: usize) -> Result<(), DecoderError>
Returns an error if the buffer does not have at least len
bytes.
let mut data = [0, 1, 2];
let buffer = DecoderBufferMut::new(&mut data);
assert!(buffer.ensure_len(2).is_ok());
assert!(buffer.ensure_len(5).is_err());
sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of bytes in the buffer.
let mut data = [0, 1, 2];
let buffer = DecoderBufferMut::new(&mut data);
assert_eq!(buffer.len(), 3);
let (_, buffer) = buffer.decode::<u8>().unwrap();
assert_eq!(buffer.len(), 2);
sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if the buffer has a length of 0.
let mut data = [1];
let buffer = DecoderBufferMut::new(&mut data);
assert!(!buffer.is_empty());
let (_, buffer) = buffer.decode::<u8>().unwrap();
assert!(buffer.is_empty());
sourcepub fn as_less_safe_slice(&'a self) -> &'a [u8] ⓘ
pub fn as_less_safe_slice(&'a self) -> &'a [u8] ⓘ
Borrows the buffer’s slice. This should be used with caution, as it removes any panic protection this struct provides.
Trait Implementations§
source§impl<'a> Debug for DecoderBufferMut<'a>
impl<'a> Debug for DecoderBufferMut<'a>
source§impl<'a> Decoder<'a> for DecoderBufferMut<'a>
impl<'a> Decoder<'a> for DecoderBufferMut<'a>
fn decode<T: DecoderValue<'a> + DecoderValueMut<'a>>( self ) -> Result<(T, Self), DecoderError>
fn decode_slice(self, len: usize) -> Result<(Self, Self), DecoderError>
source§impl<'a> DecoderValueMut<'a> for DecoderBufferMut<'a>
impl<'a> DecoderValueMut<'a> for DecoderBufferMut<'a>
fn decode_mut( buffer: DecoderBufferMut<'a> ) -> Result<(DecoderBufferMut<'a>, DecoderBufferMut<'a>), DecoderError>
source§impl EncoderValue for DecoderBufferMut<'_>
impl EncoderValue for DecoderBufferMut<'_>
source§fn encoding_size(&self) -> usize
fn encoding_size(&self) -> usize
source§fn encoding_size_for_encoder<E>(&self, _encoder: &E) -> usizewhere
E: Encoder,
fn encoding_size_for_encoder<E>(&self, _encoder: &E) -> usizewhere
E: Encoder,
source§fn encode_mut<E>(&mut self, encoder: &mut E)where
E: Encoder,
fn encode_mut<E>(&mut self, encoder: &mut E)where
E: Encoder,
source§fn encode_with_len_prefix<Len, E>(&self, encoder: &mut E)
fn encode_with_len_prefix<Len, E>(&self, encoder: &mut E)
Len
fn encode_to_vec(&self) -> Vec<u8>
source§impl<'a> From<&'a mut [u8]> for DecoderBufferMut<'a>
impl<'a> From<&'a mut [u8]> for DecoderBufferMut<'a>
source§fn from(bytes: &'a mut [u8]) -> DecoderBufferMut<'a>
fn from(bytes: &'a mut [u8]) -> DecoderBufferMut<'a>
source§impl<'a> Hash for DecoderBufferMut<'a>
impl<'a> Hash for DecoderBufferMut<'a>
source§impl<'a> Ord for DecoderBufferMut<'a>
impl<'a> Ord for DecoderBufferMut<'a>
source§fn cmp(&self, other: &DecoderBufferMut<'a>) -> Ordering
fn cmp(&self, other: &DecoderBufferMut<'a>) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl<'a> PartialEq<[u8]> for DecoderBufferMut<'a>
impl<'a> PartialEq<[u8]> for DecoderBufferMut<'a>
source§impl<'a> PartialEq for DecoderBufferMut<'a>
impl<'a> PartialEq for DecoderBufferMut<'a>
source§fn eq(&self, other: &DecoderBufferMut<'a>) -> bool
fn eq(&self, other: &DecoderBufferMut<'a>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<'a> PartialOrd for DecoderBufferMut<'a>
impl<'a> PartialOrd for DecoderBufferMut<'a>
source§fn partial_cmp(&self, other: &DecoderBufferMut<'a>) -> Option<Ordering>
fn partial_cmp(&self, other: &DecoderBufferMut<'a>) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read more