Enum ProxyV2TlvSource

Source
pub enum ProxyV2TlvSource<EXT: PP2TlvRestore> {
    Internal(PP2Tlvs),
    External(EXT),
    Error(HaProxErr),
}
Expand description

An enum which is returned by the TLV iterator. It may contain either parsed TLV or error description which occured during parsing. Normally, in case of error, the parsing should be stopped and connection dropped.

Variants§

§

Internal(PP2Tlvs)

A base implementation of the protocl.

§

External(EXT)

A user’s extension to the protocol.

§

Error(HaProxErr)

Error during parsing.

Implementations§

Source§

impl<EXT: PP2TlvRestore> ProxyV2TlvSource<EXT>

Source

pub fn take_internal(self) -> Option<PP2Tlvs>

Consumes the instance returning the PP2Tlvs build-in TLV through Option. If instance os not Internal then instance will be lost.

Examples found in repository?
examples/example_custom_parser.rs (line 103)
68fn main() -> HaProxRes<()>
69{
70
71    let pkt_ssl = 
72b"\x0d\x0a\x0d\x0a\x00\x0d\x0a\x51\x55\x49\x54\x0a\x21\x11\x00\x1e\
73\x7f\x00\x00\x01\x7f\x00\x00\x43\x9b\x4a\x2e\x6b\x20\x00\x0f\x01\
74\x00\x00\x00\x00\x21\x00\x07\x54\x4c\x53\x76\x31\x2e\x32\xE0\x00\
75\x08\x01\x02\x03\x04\x05\x06\x07\x08";
76
77        let dec = ProxyV2Parser::<ProxyV2Dummy2>::try_from_slice_custom(pkt_ssl.as_slice()).unwrap();
78
79        assert_eq!(dec.get_transport().is_ok(), true);
80        assert_eq!(dec.get_transport().unwrap(), ProxyTransportFam::STREAM);
81
82        assert_eq!(dec.get_proto_version(), ProtocolVersion::V2);
83        assert_eq!(dec.get_proto_command(), HdrV2Command::PROXY);
84
85        assert_eq!(dec.get_address_family().is_ok(), true);
86        assert_eq!(dec.get_address_family().unwrap(), ProxyV2AddrType::AfInet);
87        
88        let addr = dec.get_address().unwrap();
89
90        assert_eq!(addr.is_some(), true);
91
92        let addr = addr.unwrap();
93        let maddr = ProxyV2Addr::try_from(("127.0.0.1:39754", "127.0.0.67:11883")).unwrap();
94
95        assert_eq!(addr, maddr);
96
97        let tlv_iter = dec.get_tlvs_iter();
98
99        assert_eq!(tlv_iter.is_some(), true);
100
101        let mut tlv_iter = tlv_iter.unwrap();
102
103        let type_ssl = tlv_iter.next().unwrap().take_internal().unwrap();
104
105        assert_eq!(type_ssl.get_type(), PP2Tlvs::TYPE_SSL);
106        let PP2Tlvs::TypeSsl { client, verify } = type_ssl else {panic!("wrong")};
107
108        assert_eq!(client, PP2TlvClient::PP2_CLIENT_SSL);
109        assert_eq!(verify, 0);
110
111        // --
112        let type_ssl_version = tlv_iter.next().unwrap().take_internal().unwrap();
113
114        assert_eq!(type_ssl_version.get_type(), PP2Tlvs::TYPE_SUBTYPE_SSL_VERSION);
115
116        let PP2Tlvs::TypeSubtypeSslVersion(ssl_version) = type_ssl_version else { panic!("wrong") };
117
118        assert_eq!(ssl_version, "TLSv1.2");
119
120        // ---
121        let ext_type_e0 = tlv_iter.next().unwrap().take_external().unwrap();
122
123        assert_eq!(ext_type_e0.get_type(), 0xE0);
124
125        let ProxyV2Dummy2::SomeTlvName(arg0, arg1) = ext_type_e0 else {panic!("wrong")};
126
127        assert_eq!(arg0, 0x01020304);
128        assert_eq!(arg1, 0x05060708);
129
130
131    return Ok(());
132}
Source

pub fn take_external(self) -> Option<EXT>

Consumes the instance returning the PP2Tlvs build-in TLV through Option. If instance os not External then instance will be lost.

Examples found in repository?
examples/example_custom_parser.rs (line 121)
68fn main() -> HaProxRes<()>
69{
70
71    let pkt_ssl = 
72b"\x0d\x0a\x0d\x0a\x00\x0d\x0a\x51\x55\x49\x54\x0a\x21\x11\x00\x1e\
73\x7f\x00\x00\x01\x7f\x00\x00\x43\x9b\x4a\x2e\x6b\x20\x00\x0f\x01\
74\x00\x00\x00\x00\x21\x00\x07\x54\x4c\x53\x76\x31\x2e\x32\xE0\x00\
75\x08\x01\x02\x03\x04\x05\x06\x07\x08";
76
77        let dec = ProxyV2Parser::<ProxyV2Dummy2>::try_from_slice_custom(pkt_ssl.as_slice()).unwrap();
78
79        assert_eq!(dec.get_transport().is_ok(), true);
80        assert_eq!(dec.get_transport().unwrap(), ProxyTransportFam::STREAM);
81
82        assert_eq!(dec.get_proto_version(), ProtocolVersion::V2);
83        assert_eq!(dec.get_proto_command(), HdrV2Command::PROXY);
84
85        assert_eq!(dec.get_address_family().is_ok(), true);
86        assert_eq!(dec.get_address_family().unwrap(), ProxyV2AddrType::AfInet);
87        
88        let addr = dec.get_address().unwrap();
89
90        assert_eq!(addr.is_some(), true);
91
92        let addr = addr.unwrap();
93        let maddr = ProxyV2Addr::try_from(("127.0.0.1:39754", "127.0.0.67:11883")).unwrap();
94
95        assert_eq!(addr, maddr);
96
97        let tlv_iter = dec.get_tlvs_iter();
98
99        assert_eq!(tlv_iter.is_some(), true);
100
101        let mut tlv_iter = tlv_iter.unwrap();
102
103        let type_ssl = tlv_iter.next().unwrap().take_internal().unwrap();
104
105        assert_eq!(type_ssl.get_type(), PP2Tlvs::TYPE_SSL);
106        let PP2Tlvs::TypeSsl { client, verify } = type_ssl else {panic!("wrong")};
107
108        assert_eq!(client, PP2TlvClient::PP2_CLIENT_SSL);
109        assert_eq!(verify, 0);
110
111        // --
112        let type_ssl_version = tlv_iter.next().unwrap().take_internal().unwrap();
113
114        assert_eq!(type_ssl_version.get_type(), PP2Tlvs::TYPE_SUBTYPE_SSL_VERSION);
115
116        let PP2Tlvs::TypeSubtypeSslVersion(ssl_version) = type_ssl_version else { panic!("wrong") };
117
118        assert_eq!(ssl_version, "TLSv1.2");
119
120        // ---
121        let ext_type_e0 = tlv_iter.next().unwrap().take_external().unwrap();
122
123        assert_eq!(ext_type_e0.get_type(), 0xE0);
124
125        let ProxyV2Dummy2::SomeTlvName(arg0, arg1) = ext_type_e0 else {panic!("wrong")};
126
127        assert_eq!(arg0, 0x01020304);
128        assert_eq!(arg1, 0x05060708);
129
130
131    return Ok(());
132}
Source

pub fn contains_subtype(&self) -> bool

Checks if current instance constains the subtype. For Error false is always returned.

Trait Implementations§

Source§

impl<EXT: Clone + PP2TlvRestore> Clone for ProxyV2TlvSource<EXT>

Source§

fn clone(&self) -> ProxyV2TlvSource<EXT>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<EXT: Debug + PP2TlvRestore> Debug for ProxyV2TlvSource<EXT>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<EXT: PartialEq + PP2TlvRestore> PartialEq for ProxyV2TlvSource<EXT>

Source§

fn eq(&self, other: &ProxyV2TlvSource<EXT>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<EXT: Eq + PP2TlvRestore> Eq for ProxyV2TlvSource<EXT>

Source§

impl<EXT: PP2TlvRestore> StructuralPartialEq for ProxyV2TlvSource<EXT>

Auto Trait Implementations§

§

impl<EXT> Freeze for ProxyV2TlvSource<EXT>
where EXT: Freeze,

§

impl<EXT> RefUnwindSafe for ProxyV2TlvSource<EXT>
where EXT: RefUnwindSafe,

§

impl<EXT> Send for ProxyV2TlvSource<EXT>
where EXT: Send,

§

impl<EXT> Sync for ProxyV2TlvSource<EXT>
where EXT: Sync,

§

impl<EXT> Unpin for ProxyV2TlvSource<EXT>
where EXT: Unpin,

§

impl<EXT> UnwindSafe for ProxyV2TlvSource<EXT>
where EXT: UnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.