Skip to content

Commit b2fbc56

Browse files
authored
Merge pull request #5925 from Jacalz/uri-parse-ipv6-support
Add support for IPv6 addresses in ParseURI
2 parents 0328dc1 + adfc984 commit b2fbc56

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

storage/repository/parse.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,33 @@ func ParseURI(s string) (fyne.URI, error) {
8181
return nil, err
8282
}
8383

84-
authority := ""
84+
authority := l.Authority()
85+
authBuilder := strings.Builder{}
86+
authBuilder.Grow(len(authority.UserInfo()) + len(authority.Host()) + len(authority.Port()) + len("@[]:"))
8587

86-
if userInfo := l.Authority().UserInfo(); len(userInfo) > 0 {
87-
authority += userInfo + "@"
88+
if userInfo := authority.UserInfo(); userInfo != "" {
89+
authBuilder.WriteString(userInfo)
90+
authBuilder.WriteByte('@')
8891
}
8992

90-
authority += l.Authority().Host()
93+
// Per RFC 3986, section 3.2.2, IPv6 addresses must be enclosed in square brackets.
94+
if host := authority.Host(); strings.Contains(host, ":") {
95+
authBuilder.WriteByte('[')
96+
authBuilder.WriteString(host)
97+
authBuilder.WriteByte(']')
98+
} else {
99+
authBuilder.WriteString(host)
100+
}
91101

92-
if port := l.Authority().Port(); len(port) > 0 {
93-
authority += ":" + port
102+
if port := authority.Port(); port != "" {
103+
authBuilder.WriteByte(':')
104+
authBuilder.WriteString(port)
94105
}
95106

96107
return &uri{
97108
scheme: scheme,
98-
authority: authority,
99-
path: l.Authority().Path(),
109+
authority: authBuilder.String(),
110+
path: authority.Path(),
100111
query: l.Query().Encode(),
101112
fragment: l.Fragment(),
102113
}, nil

storage/repository/parse_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ func TestParseURI(t *testing.T) {
2323
uri, err = ParseURI("file://C:/tmp/foo.txt")
2424
assert.NoError(t, err)
2525
assert.Equal(t, "file://C:/tmp/foo.txt", uri.String())
26+
27+
IPv6url := "http://[2001:db8:4006:812::200e]:8080/path/page.html"
28+
uri, err = ParseURI(IPv6url)
29+
assert.NoError(t, err)
30+
assert.Equal(t, IPv6url, uri.String())
31+
32+
IPv6url = "http://[2001:db8:4006:812::200e]/path/page.html"
33+
uri, err = ParseURI(IPv6url)
34+
assert.NoError(t, err)
35+
assert.Equal(t, IPv6url, uri.String())
2636
}
2737

2838
func TestParseInvalidURI(t *testing.T) {

0 commit comments

Comments
 (0)