Skip to content

Commit ab99c61

Browse files
fix issue with v4-mapped IPv6 addresses
1 parent ae65f2c commit ab99c61

File tree

3 files changed

+53
-8
lines changed

3 files changed

+53
-8
lines changed

headerv1.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,11 @@ func parseV1(r *bufio.Reader) (*HeaderV1, error) {
7373
if fam == "TCP4" {
7474
return ip.To4() != nil
7575
}
76-
return ip.To4() == nil
76+
if fam == "TCP6" {
77+
return ip.To16() != nil
78+
}
79+
80+
return false
7781
}
7882

7983
srcIP := net.ParseIP(srcIPStr)

headerv1_test.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ import (
1010

1111
func TestHeaderV1_WriteTo(t *testing.T) {
1212
check := func(name string, hdr HeaderV1, exp string) {
13-
t.Run(name, func(t *testing.T) {
14-
buf := new(bytes.Buffer)
15-
_, err := hdr.WriteTo(buf)
16-
assert.NoError(t, err)
17-
assert.Equal(t, exp, buf.String())
18-
})
13+
t.Helper()
14+
buf := new(bytes.Buffer)
15+
_, err := hdr.WriteTo(buf)
16+
assert.NoError(t, err, name)
17+
assert.Equal(t, exp, buf.String(), name)
1918
}
2019

2120
check("blank", HeaderV1{}, "PROXY UNKNOWN\r\n")
@@ -43,5 +42,4 @@ func TestHeaderV1_WriteTo(t *testing.T) {
4342
},
4443
"PROXY TCP6 2001:db8:85a3::8a2e:370:7334 2002:db8:85a3::8a2e:370:7334 1234 5678\r\n",
4544
)
46-
4745
}

parse_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package proxyprotocol
33
import (
44
"bufio"
55
"bytes"
6+
"net"
7+
"strings"
68
"testing"
79

810
"github.com/stretchr/testify/assert"
@@ -26,3 +28,44 @@ func TestParse_Malformed(t *testing.T) {
2628
bytes.NewReader(data)))
2729
assert.Error(t, err)
2830
}
31+
32+
func TestParse_HeaderV1(t *testing.T) {
33+
check := func(name string, hdr HeaderV1, exp string) {
34+
t.Helper()
35+
36+
h, err := Parse(bufio.NewReader(strings.NewReader(exp)))
37+
assert.NoError(t, err, name)
38+
assert.Equal(t, 1, h.Version(), name+" version")
39+
40+
h1 := h.(*HeaderV1)
41+
assert.Equal(t, hdr, *h1, name)
42+
}
43+
44+
check("blank", HeaderV1{}, "PROXY UNKNOWN\r\n")
45+
check("ipv4", HeaderV1{
46+
SrcPort: 1234,
47+
DestPort: 5678,
48+
SrcIP: net.ParseIP("192.168.0.1"),
49+
DestIP: net.ParseIP("192.168.0.2"),
50+
},
51+
"PROXY TCP4 192.168.0.1 192.168.0.2 1234 5678\r\n",
52+
)
53+
54+
check("ipv6", HeaderV1{
55+
SrcPort: 1234,
56+
DestPort: 5678,
57+
SrcIP: net.ParseIP("2001:db8:85a3::8a2e:370:7334"),
58+
DestIP: net.ParseIP("2002:db8:85a3::8a2e:370:7334"),
59+
},
60+
"PROXY TCP6 2001:db8:85a3::8a2e:370:7334 2002:db8:85a3::8a2e:370:7334 1234 5678\r\n",
61+
)
62+
63+
check("ipv6-mapped-ipv4", HeaderV1{
64+
SrcPort: 53740,
65+
DestPort: 10001,
66+
SrcIP: net.ParseIP("::ffff:192.168.0.1"),
67+
DestIP: net.ParseIP("::ffff:192.168.0.1"),
68+
},
69+
"PROXY TCP6 ::ffff:192.168.0.1 ::ffff:192.168.0.1 53740 10001\r\n",
70+
)
71+
}

0 commit comments

Comments
 (0)