Adds the support for IPv6 in the TCP HostSNI matcher

This commit is contained in:
Romain 2023-02-14 15:04:05 +01:00 committed by GitHub
parent e053eb6f17
commit 1a6dfe1f6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 4 deletions

View file

@ -63,6 +63,20 @@ func Test_addRoute(t *testing.T) {
"http://localhost/foo": http.StatusOK, "http://localhost/foo": http.StatusOK,
}, },
}, },
{
desc: "Host IPv4",
rule: "Host(`127.0.0.1`)",
expected: map[string]int{
"http://127.0.0.1/foo": http.StatusOK,
},
},
{
desc: "Host IPv6",
rule: "Host(`10::10`)",
expected: map[string]int{
"http://10::10/foo": http.StatusOK,
},
},
{ {
desc: "Non-ASCII Host", desc: "Non-ASCII Host",
rule: "Host(`locàlhost`)", rule: "Host(`locàlhost`)",

View file

@ -315,7 +315,7 @@ func alpn(tree *matchersTree, protos ...string) error {
return nil return nil
} }
var almostFQDN = regexp.MustCompile(`^[[:alnum:]\.-]+$`) var hostOrIP = regexp.MustCompile(`^[[:alnum:]\.\-\:]+$`)
// hostSNI checks if the SNI Host of the connection match the matcher host. // hostSNI checks if the SNI Host of the connection match the matcher host.
func hostSNI(tree *matchersTree, hosts ...string) error { func hostSNI(tree *matchersTree, hosts ...string) error {
@ -329,8 +329,8 @@ func hostSNI(tree *matchersTree, hosts ...string) error {
continue continue
} }
if !almostFQDN.MatchString(host) { if !hostOrIP.MatchString(host) {
return fmt.Errorf("invalid value for \"HostSNI\" matcher, %q is not a valid hostname", host) return fmt.Errorf("invalid value for \"HostSNI\" matcher, %q is not a valid hostname or IP", host)
} }
hosts[i] = strings.ToLower(host) hosts[i] = strings.ToLower(host)

View file

@ -740,7 +740,7 @@ func Test_HostSNI(t *testing.T) {
}, },
{ {
desc: "Matching hosts", desc: "Matching hosts",
ruleHosts: []string{"foobar"}, ruleHosts: []string{"foobar", "foo-bar.baz"},
serverName: "foobar", serverName: "foobar",
}, },
{ {
@ -748,6 +748,16 @@ func Test_HostSNI(t *testing.T) {
ruleHosts: []string{"foo.bar"}, ruleHosts: []string{"foo.bar"},
serverName: "foo.bar", serverName: "foo.bar",
}, },
{
desc: "Matching IPv4",
ruleHosts: []string{"127.0.0.1"},
serverName: "127.0.0.1",
},
{
desc: "Matching IPv6",
ruleHosts: []string{"10::10"},
serverName: "10::10",
},
} }
for _, test := range testCases { for _, test := range testCases {