TUN-6898: Fix bug handling IPv6 based ingresses with missing port

This commit is contained in:
João Oliveirinha 2022-10-28 10:33:23 +01:00
parent 66d1f27507
commit e14238224d
2 changed files with 38 additions and 1 deletions

View File

@ -9,6 +9,7 @@ import (
"net" "net"
"net/http" "net/http"
"net/url" "net/url"
"strings"
"time" "time"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -155,8 +156,15 @@ func newSocksProxyOverWSService(accessPolicy *ipaccess.Policy) *socksProxyOverWS
} }
func addPortIfMissing(uri *url.URL, port int) { func addPortIfMissing(uri *url.URL, port int) {
hostname := uri.Hostname()
// check if it is an IPv6 address and wrap it with brackets
if ip := net.ParseIP(hostname); ip != nil && strings.Count(hostname, ":") > 0 {
hostname = fmt.Sprintf("[%s]", hostname)
}
if uri.Port() == "" { if uri.Port() == "" {
uri.Host = fmt.Sprintf("%s:%d", uri.Hostname(), port) uri.Host = fmt.Sprintf("%s:%d", hostname, port)
} }
} }

View File

@ -0,0 +1,29 @@
package ingress
import (
"net/url"
"testing"
"github.com/stretchr/testify/require"
)
func TestAddPortIfMissing(t *testing.T) {
testCases := []struct {
input string
expected string
}{
{"ssh://[::1]", "[::1]:22"},
{"ssh://[::1]:38", "[::1]:38"},
{"ssh://abc:38", "abc:38"},
{"ssh://127.0.0.1:38", "127.0.0.1:38"},
{"ssh://127.0.0.1", "127.0.0.1:22"},
}
for _, tc := range testCases {
t.Run(tc.input, func(t *testing.T) {
url1, _ := url.Parse(tc.input)
addPortIfMissing(url1, 22)
require.Equal(t, tc.expected, url1.Host)
})
}
}