example_custom_parser/
example_custom_parser.rs1use std::{fmt, io::Cursor};
2
3use byteorder::{BigEndian, ReadBytesExt};
4use haprox_rs::{HaProxRes, HdrV2Command, PP2_TYPE_MIN_CUSTOM, PP2TlvClient, PP2Tlvs, PPV2ParserZeroCopy, ProtocolVersion, ProxyTransportFam, ProxyV2Addr, ProxyV2AddrType, ProxyV2Parser, common, PP2TlvDump, PP2TlvRestore, return_error};
5
6
7#[derive(Clone, Debug)]
8pub enum ProxyV2Dummy2
9{
10 SomeTlvName(u32, u32),
11 OtherTlv,
12}
13
14impl fmt::Display for ProxyV2Dummy2
15{
16 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
17 {
18 write!(f, "DUMMY external reader")
19 }
20}
21
22impl<'zc> PP2TlvRestore<'zc> for ProxyV2Dummy2
23{
24 type TlvTblRes = Self;
25
26 fn restore(tlv_type: u8, cur: &mut Cursor<&[u8]>) -> HaProxRes<Self::TlvTblRes>
27 {
28 match tlv_type
29 {
30 0xE0 =>
31 {
32 let arg0 = cur.read_u32::<BigEndian>().map_err(common::map_io_err)?;
33 let arg1 = cur.read_u32::<BigEndian>().map_err(common::map_io_err)?;
34
35 return Ok(Self::SomeTlvName(arg0, arg1));
36 },
37 _ =>
38 return_error!(ProtocolUnknownData, "unknown tlv_type: {}", tlv_type)
39 }
40
41 }
42
43 fn contains_subtype(_item: &Self::TlvTblRes) -> bool
44 {
45 return false;
46 }
47
48 fn is_in_range(tlv_type: u8, _tlv_parent_type: Option<u8>) -> bool
49 {
50 return tlv_type == PP2_TYPE_MIN_CUSTOM;
51 }
52
53}
54
55impl PP2TlvDump for ProxyV2Dummy2
56{
57 fn get_type(&self) -> u8
58 {
59 let Self::SomeTlvName(..) = self else { panic!("wrong") };
60
61 return 0xE0;
62 }
63
64 fn dump(&self, _cur: &mut Cursor<Vec<u8>>) -> HaProxRes<()>
65 {
66 todo!()
67 }
68}
69
70
71fn main() -> HaProxRes<()>
72{
73
74 let pkt_ssl =
75b"\x0d\x0a\x0d\x0a\x00\x0d\x0a\x51\x55\x49\x54\x0a\x21\x11\x00\x29\
76\x7f\x00\x00\x01\x7f\x00\x00\x43\x9b\x4a\x2e\x6b\x20\x00\x0f\x01\
77\x00\x00\x00\x00\x21\x00\x07\x54\x4c\x53\x76\x31\x2e\x32\xE0\x00\
78\x08\x01\x02\x03\x04\x05\x06\x07\x08";
79
80 let dec = ProxyV2Parser::<PPV2ParserZeroCopy, ProxyV2Dummy2>::try_from_slice_custom(pkt_ssl.as_slice()).unwrap();
81
82 assert_eq!(dec.get_transport().is_ok(), true);
83 assert_eq!(dec.get_transport().unwrap(), ProxyTransportFam::STREAM);
84
85 assert_eq!(dec.get_proto_version(), ProtocolVersion::V2);
86 assert_eq!(dec.get_proto_command(), HdrV2Command::PROXY);
87
88 assert_eq!(dec.get_address_family().is_ok(), true);
89 assert_eq!(dec.get_address_family().unwrap(), ProxyV2AddrType::AfInet);
90
91 let addr = dec.get_address().unwrap();
92
93 assert_eq!(addr.is_some(), true);
94
95 let addr = addr.unwrap();
96 let maddr = ProxyV2Addr::try_from(("127.0.0.1:39754", "127.0.0.67:11883")).unwrap();
97
98 assert_eq!(addr, maddr);
99
100 let tlv_iter = dec.get_tlvs_iter();
101
102 assert_eq!(tlv_iter.is_some(), true);
103
104 let mut tlv_iter = tlv_iter.unwrap();
105
106 let type_ssl = tlv_iter.next().unwrap().take_internal().unwrap();
107
108 assert_eq!(type_ssl.get_type(), PP2Tlvs::TYPE_SSL);
109 let PP2Tlvs::TypeSsl { client, verify } = type_ssl else {panic!("wrong")};
110
111 assert_eq!(client, PP2TlvClient::PP2_CLIENT_SSL);
112 assert_eq!(verify, 0);
113
114 let type_ssl_version = tlv_iter.next().unwrap().take_internal().unwrap();
116
117 assert_eq!(type_ssl_version.get_type(), PP2Tlvs::TYPE_SUBTYPE_SSL_VERSION);
118
119 let PP2Tlvs::TypeSubtypeSslVersion(ssl_version) = type_ssl_version else { panic!("wrong") };
120
121 assert_eq!(ssl_version, "TLSv1.2");
122
123 let ext_type_e0 = tlv_iter.next().unwrap().take_external().unwrap();
125
126 assert_eq!(ext_type_e0.get_type(), 0xE0);
127
128 let ProxyV2Dummy2::SomeTlvName(arg0, arg1) = ext_type_e0 else {panic!("wrong")};
129
130 assert_eq!(arg0, 0x01020304);
131 assert_eq!(arg1, 0x05060708);
132
133
134 return Ok(());
135}