@@ -50,8 +50,15 @@ func TestProxyParse(t *testing.T) {
5050 p , _ , err := ParseProxyV2 (srv )
5151 require .NoError (t , err )
5252 require .NotNil (t , p )
53- require .Equal (t , tcpaddr , p .SrcAddress )
54- require .Equal (t , tcpaddr , p .DstAddress )
53+
54+ srcAddr , ok := p .SrcAddress .(* net.TCPAddr )
55+ require .True (t , ok )
56+ require .Equal (t , tcpaddr .IP .To4 (), srcAddr .IP )
57+ require .Equal (t , tcpaddr .Port , srcAddr .Port )
58+ dstAddr , ok := p .DstAddress .(* net.TCPAddr )
59+ require .True (t , ok )
60+ require .Equal (t , tcpaddr .IP .To4 (), dstAddr .IP )
61+ require .Equal (t , tcpaddr .Port , dstAddr .Port )
5562 require .Equal (t , ProxyVersion2 , p .Version )
5663 require .Equal (t , ProxyCommandLocal , p .Command )
5764 require .Len (t , p .TLV , 2 )
@@ -92,3 +99,85 @@ func TestProxyToBytes(t *testing.T) {
9299 _ , err = hdr .ToBytes ()
93100 require .NoError (t , err )
94101}
102+
103+ func TestMixIPv4AndIPv6ProxyToBytes (t * testing.T ) {
104+ tests := []struct {
105+ srcIP net.IP
106+ dstIP net.IP
107+ srcPort int
108+ dstPort int
109+ wantAF ProxyAddressFamily
110+ wantIPLen int
111+ }{
112+ {
113+ srcIP : net .ParseIP ("192.168.1.1" ),
114+ dstIP : net .ParseIP ("192.168.1.2" ),
115+ srcPort : 1234 ,
116+ dstPort : 5678 ,
117+ wantAF : ProxyAFINet ,
118+ wantIPLen : net .IPv4len ,
119+ },
120+ {
121+ srcIP : net .ParseIP ("2001:db8::1" ),
122+ dstIP : net .ParseIP ("2001:db8::2" ),
123+ srcPort : 1234 ,
124+ dstPort : 5678 ,
125+ wantAF : ProxyAFINet6 ,
126+ wantIPLen : net .IPv6len ,
127+ },
128+ {
129+ srcIP : net .ParseIP ("192.168.1.1" ),
130+ dstIP : net .ParseIP ("2001:db8::1" ),
131+ srcPort : 1234 ,
132+ dstPort : 5678 ,
133+ wantAF : ProxyAFINet6 ,
134+ wantIPLen : net .IPv6len ,
135+ },
136+ {
137+ srcIP : net .ParseIP ("192.168.1.1" ),
138+ dstIP : net .ParseIP ("::ffff:192.168.1.2" ),
139+ srcPort : 1234 ,
140+ dstPort : 5678 ,
141+ wantAF : ProxyAFINet ,
142+ wantIPLen : net .IPv4len ,
143+ },
144+ {
145+ srcIP : net .ParseIP ("::ffff:192.168.1.1" ),
146+ dstIP : net .ParseIP ("::ffff:192.168.1.2" ),
147+ srcPort : 1234 ,
148+ dstPort : 5678 ,
149+ wantAF : ProxyAFINet ,
150+ wantIPLen : net .IPv4len ,
151+ },
152+ {
153+ srcIP : net .ParseIP ("::ffff:192.168.1.1" ),
154+ dstIP : net .ParseIP ("2001:db8::1" ),
155+ srcPort : 1234 ,
156+ dstPort : 5678 ,
157+ wantAF : ProxyAFINet6 ,
158+ wantIPLen : net .IPv6len ,
159+ },
160+ }
161+
162+ for _ , tt := range tests {
163+ hdr := & Proxy {
164+ Version : ProxyVersion2 ,
165+ Command : ProxyCommandProxy ,
166+ SrcAddress : & net.TCPAddr {IP : tt .srcIP , Port : tt .srcPort },
167+ DstAddress : & net.TCPAddr {IP : tt .dstIP , Port : tt .dstPort },
168+ }
169+
170+ hdrBytes , err := hdr .ToBytes ()
171+ require .NoError (t , err )
172+ require .GreaterOrEqual (t , len (hdrBytes ), len (MagicV2 )+ 4 )
173+
174+ addressFamily := ProxyAddressFamily (hdrBytes [len (MagicV2 )+ 1 ] >> 4 )
175+ require .Equal (t , tt .wantAF , addressFamily )
176+
177+ length := int (hdrBytes [len (MagicV2 )+ 2 ])<< 8 | int (hdrBytes [len (MagicV2 )+ 3 ])
178+ require .Equal (t , len (hdrBytes )- 4 - len (MagicV2 ), length )
179+
180+ expectedPayloadSize := tt .wantIPLen * 2 + 4
181+ require .Equal (t , expectedPayloadSize , length )
182+ }
183+ }
0 commit comments