@@ -13,12 +13,14 @@ import (
13
13
14
14
var (
15
15
IPv4AddressesAndPorts = strings .Join ([]string {IP4_ADDR , IP4_ADDR , strconv .Itoa (PORT ), strconv .Itoa (PORT )}, separator )
16
+ IPv4In6AddressesAndPorts = strings .Join ([]string {IP4IN6_ADDR , IP4IN6_ADDR , strconv .Itoa (PORT ), strconv .Itoa (PORT )}, separator )
16
17
IPv4AddressesAndInvalidPorts = strings .Join ([]string {IP4_ADDR , IP4_ADDR , strconv .Itoa (INVALID_PORT ), strconv .Itoa (INVALID_PORT )}, separator )
17
18
IPv6AddressesAndPorts = strings .Join ([]string {IP6_ADDR , IP6_ADDR , strconv .Itoa (PORT ), strconv .Itoa (PORT )}, separator )
18
19
IPv6LongAddressesAndPorts = strings .Join ([]string {IP6_LONG_ADDR , IP6_LONG_ADDR , strconv .Itoa (PORT ), strconv .Itoa (PORT )}, separator )
19
20
20
- fixtureTCP4V1 = "PROXY TCP4 " + IPv4AddressesAndPorts + crlf + "GET /"
21
- fixtureTCP6V1 = "PROXY TCP6 " + IPv6AddressesAndPorts + crlf + "GET /"
21
+ fixtureTCP4V1 = "PROXY TCP4 " + IPv4AddressesAndPorts + crlf + "GET /"
22
+ fixtureTCP6V1 = "PROXY TCP6 " + IPv6AddressesAndPorts + crlf + "GET /"
23
+ fixtureTCP4IN6V1 = "PROXY TCP6 " + IPv4In6AddressesAndPorts + crlf + "GET /"
22
24
23
25
fixtureTCP6V1Overflow = "PROXY TCP6 " + IPv6LongAddressesAndPorts
24
26
@@ -66,6 +68,11 @@ var invalidParseV1Tests = []struct {
66
68
reader : newBufioReader ([]byte ("PROXY TCP4 " + IPv4AddressesAndPorts )),
67
69
expectedError : ErrCantReadVersion1Header ,
68
70
},
71
+ {
72
+ desc : "invalid IP address" ,
73
+ reader : newBufioReader ([]byte ("PROXY TCP4 invalid invalid 65533 65533" + crlf )),
74
+ expectedError : ErrInvalidAddress ,
75
+ },
69
76
{
70
77
desc : "TCP6 with IPv4 addresses" ,
71
78
reader : newBufioReader ([]byte ("PROXY TCP6 " + IPv4AddressesAndPorts + crlf )),
@@ -76,6 +83,11 @@ var invalidParseV1Tests = []struct {
76
83
reader : newBufioReader ([]byte ("PROXY TCP4 " + IPv6AddressesAndPorts + crlf )),
77
84
expectedError : ErrInvalidAddress ,
78
85
},
86
+ {
87
+ desc : "TCP4 with IPv4 mapped addresses" ,
88
+ reader : newBufioReader ([]byte ("PROXY TCP4 " + IPv4In6AddressesAndPorts + crlf )),
89
+ expectedError : ErrInvalidAddress ,
90
+ },
79
91
{
80
92
desc : "TCP4 with invalid port" ,
81
93
reader : newBufioReader ([]byte ("PROXY TCP4 " + IPv4AddressesAndInvalidPorts + crlf )),
@@ -102,6 +114,7 @@ var validParseAndWriteV1Tests = []struct {
102
114
desc string
103
115
reader * bufio.Reader
104
116
expectedHeader * Header
117
+ skipWrite bool
105
118
}{
106
119
{
107
120
desc : "TCP4" ,
@@ -125,6 +138,21 @@ var validParseAndWriteV1Tests = []struct {
125
138
DestinationAddr : v6addr ,
126
139
},
127
140
},
141
+ {
142
+ desc : "TCP4IN6" ,
143
+ reader : bufio .NewReader (strings .NewReader (fixtureTCP4IN6V1 )),
144
+ expectedHeader : & Header {
145
+ Version : 1 ,
146
+ Command : PROXY ,
147
+ TransportProtocol : TCPv6 ,
148
+ SourceAddr : v4addr ,
149
+ DestinationAddr : v4addr ,
150
+ },
151
+ // we skip write test because net.ParseIP converts ::ffff:127.0.0.1 to v4
152
+ // instead of preserving the v4 in v6 form, so, after serializing the header,
153
+ // we end up with v6 protocol and a v4 IP which is invalid
154
+ skipWrite : true ,
155
+ },
128
156
{
129
157
desc : "unknown" ,
130
158
reader : bufio .NewReader (strings .NewReader (fixtureUnknown )),
@@ -165,6 +193,9 @@ func TestParseV1Valid(t *testing.T) {
165
193
166
194
func TestWriteV1Valid (t * testing.T ) {
167
195
for _ , tt := range validParseAndWriteV1Tests {
196
+ if tt .skipWrite {
197
+ continue
198
+ }
168
199
t .Run (tt .desc , func (t * testing.T ) {
169
200
var b bytes.Buffer
170
201
w := bufio .NewWriter (& b )
0 commit comments