Commit a08ab0c0 authored by Matthew Holt's avatar Matthew Holt

Fix slice bounds when getting key of address (fixes #2706)

parent 28e1f7c5
...@@ -490,11 +490,10 @@ func (a Address) Key() string { ...@@ -490,11 +490,10 @@ func (a Address) Key() string {
if a.Host != "" { if a.Host != "" {
res += a.Host res += a.Host
} }
if a.Port != "" { // insert port only if the original has its own explicit port
if strings.HasPrefix(a.Original[len(res):], ":"+a.Port) { if a.Port != "" && len(a.Original) >= len(res) &&
// insert port only if the original has its own explicit port strings.HasPrefix(a.Original[len(res):], ":"+a.Port) {
res += ":" + a.Port res += ":" + a.Port
}
} }
if a.Path != "" { if a.Path != "" {
res += a.Path res += a.Path
...@@ -553,10 +552,12 @@ func standardizeAddress(str string) (Address, error) { ...@@ -553,10 +552,12 @@ func standardizeAddress(str string) (Address, error) {
// standardize http and https ports to their respective port numbers // standardize http and https ports to their respective port numbers
// (this behavior changed in Go 1.12.8) // (this behavior changed in Go 1.12.8)
if port == httpPort { if u.Scheme == "" {
u.Scheme = "http" if port == httpPort {
} else if port == httpsPort { u.Scheme = "http"
u.Scheme = "https" } else if port == httpsPort {
u.Scheme = "https"
}
} }
return Address{Original: input, Scheme: u.Scheme, Host: host, Port: port, Path: u.Path}, nil return Address{Original: input, Scheme: u.Scheme, Host: host, Port: port, Path: u.Path}, nil
......
...@@ -43,8 +43,8 @@ func TestStandardizeAddress(t *testing.T) { ...@@ -43,8 +43,8 @@ func TestStandardizeAddress(t *testing.T) {
{`:`, "", "", "", "", false}, {`:`, "", "", "", "", false},
{`localhost:http`, "http", "localhost", "80", "", false}, {`localhost:http`, "http", "localhost", "80", "", false},
{`localhost:https`, "https", "localhost", "443", "", false}, {`localhost:https`, "https", "localhost", "443", "", false},
{`:http`, "http", "", "80", "", false}, {`:http`, "http", "", "80", "", false}, // as of Go 1.12.8, service name in port is no longer supported
{`:https`, "https", "", "443", "", false}, {`:https`, "https", "", "443", "", false}, // as of Go 1.12.8, service name in port is no longer supported
{`http://localhost:https`, "", "", "", "", true}, // conflict {`http://localhost:https`, "", "", "", "", true}, // conflict
{`http://localhost:http`, "http", "localhost", "80", "", false}, // repeated scheme -- test adjusted for Go 1.12.8 (expect no error) {`http://localhost:http`, "http", "localhost", "80", "", false}, // repeated scheme -- test adjusted for Go 1.12.8 (expect no error)
{`http://localhost:443`, "", "", "", "", true}, // not conventional {`http://localhost:443`, "", "", "", "", true}, // not conventional
...@@ -212,6 +212,10 @@ func TestKeyNormalization(t *testing.T) { ...@@ -212,6 +212,10 @@ func TestKeyNormalization(t *testing.T) {
orig string orig string
res string res string
}{ }{
{
orig: "http://host:1234/path",
res: "http://host:1234/path",
},
{ {
orig: "HTTP://A/ABCDEF", orig: "HTTP://A/ABCDEF",
res: "http://a/ABCDEF", res: "http://a/ABCDEF",
...@@ -221,8 +225,20 @@ func TestKeyNormalization(t *testing.T) { ...@@ -221,8 +225,20 @@ func TestKeyNormalization(t *testing.T) {
res: "a/ABCDEF", res: "a/ABCDEF",
}, },
{ {
orig: "A:2015/Port", orig: "A:2015/Path",
res: "a:2015/Port", res: "a:2015/Path",
},
{
orig: ":80",
res: "http://",
},
{
orig: ":443",
res: "https://",
},
{
orig: ":1234",
res: ":1234",
}, },
} }
for _, item := range caseSensitiveData { for _, item := range caseSensitiveData {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment