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>
impl<EXT: PP2TlvRestore> ProxyV2TlvSource<EXT>
Sourcepub fn take_internal(self) -> Option<PP2Tlvs>
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}
Sourcepub fn take_external(self) -> Option<EXT>
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}
Sourcepub fn contains_subtype(&self) -> bool
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>
impl<EXT: Clone + PP2TlvRestore> Clone for ProxyV2TlvSource<EXT>
Source§fn clone(&self) -> ProxyV2TlvSource<EXT>
fn clone(&self) -> ProxyV2TlvSource<EXT>
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreSource§impl<EXT: Debug + PP2TlvRestore> Debug for ProxyV2TlvSource<EXT>
impl<EXT: Debug + PP2TlvRestore> Debug for ProxyV2TlvSource<EXT>
Source§impl<EXT: PartialEq + PP2TlvRestore> PartialEq for ProxyV2TlvSource<EXT>
impl<EXT: PartialEq + PP2TlvRestore> PartialEq for ProxyV2TlvSource<EXT>
impl<EXT: Eq + PP2TlvRestore> Eq for ProxyV2TlvSource<EXT>
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more