example_custom_composer/
example_custom_composer.rs

1use std::{fmt, io::Cursor};
2
3use byteorder::{BigEndian, WriteBytesExt};
4use haprox_rs::{common::map_io_err, protocol::PP2TlvDump, HdrV2OpProxy, ProxyHdrV2, HaProxRes, PP2TlvClient, ProxyTransportFam, ProxyV2Addr};
5
6
7
8#[derive(Clone, Debug)]
9pub enum ProxyV2Dummy2 
10{
11    SomeTlvName(u32, u32),
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 PP2TlvDump for ProxyV2Dummy2
23{
24    fn get_type(&self) -> u8 
25    {
26        let Self::SomeTlvName(..) = self else { panic!("wrong") };
27
28        return 0xE0;
29    }
30
31    fn dump(&self, cur: &mut Cursor<Vec<u8>>) -> HaProxRes<()> 
32    {
33        match self
34        {
35            Self::SomeTlvName(arg0, arg1) =>
36            {
37                cur.write_u32::<BigEndian>(*arg0).map_err(map_io_err)?;
38                cur.write_u32::<BigEndian>(*arg1).map_err(map_io_err)?;
39            }
40        }
41
42        return Ok(());
43    }
44}
45
46fn main()
47{
48    let addr = ProxyV2Addr::try_from(("127.0.0.1:39754", "127.0.0.67:11883")).unwrap();
49        
50    let mut comp = 
51        ProxyHdrV2::<HdrV2OpProxy>::new(ProxyTransportFam::STREAM, addr).unwrap();
52
53    let plts = comp.set_plts();
54
55    let mut ssl = plts.add_ssl(PP2TlvClient::PP2_CLIENT_SSL, 0).unwrap();
56
57    ssl.add_ssl_sub_version("TLSv1.2").unwrap();
58    
59    let mut plts = ssl.done().unwrap();
60
61
62    let cust_plt = ProxyV2Dummy2::SomeTlvName(0x01020304, 0x05060708);
63
64    plts.add_tlv(cust_plt, Some(&[0xE0..=0xE0])).unwrap();
65
66    drop(plts);
67
68    let pkt: Vec<u8> = comp.try_into().unwrap();
69
70    let ctrl = 
71b"\x0d\x0a\x0d\x0a\x00\x0d\x0a\x51\x55\x49\x54\x0a\x21\x11\x00\x29\
72\x7f\x00\x00\x01\x7f\x00\x00\x43\x9b\x4a\x2e\x6b\x20\x00\x0f\x01\
73\x00\x00\x00\x00\x21\x00\x07\x54\x4c\x53\x76\x31\x2e\x32\xE0\x00\
74\x08\x01\x02\x03\x04\x05\x06\x07\x08";
75
76    assert_eq!(pkt.as_slice(), ctrl.as_slice());
77}