Skip to content

Commit 48fef32

Browse files
committed
validate invalid/unsupported schemes
1 parent f3ee198 commit 48fef32

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

url/parsers.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,10 @@ func absoluteURLParser(u *URL) (*URL, error) {
146146
FTP + SchemeSeparator,
147147
"//",
148148
}
149-
if stringsutil.HasPrefixAny(u.Original, allowedSchemes...) {
149+
if strings.Contains(u.Original, SchemeSeparator) || strings.HasPrefix(u.Original, "//") {
150+
if !strings.HasPrefix(u.Original, "//") && !stringsutil.HasPrefixAny(u.Original, allowedSchemes...) {
151+
return nil, errorutil.NewWithTag("urlutil", "failed to parse url got invalid scheme input=%v", u.Original)
152+
}
150153
u.IsRelative = false
151154
urlparse, parseErr := url.Parse(u.Original)
152155
if parseErr != nil {

url/url_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,23 @@ func TestUnicodeEscapeWithUnsafe(t *testing.T) {
204204
require.Equal(t, v.expected, urlx.String())
205205
}
206206
}
207+
208+
func TestInvalidScheme(t *testing.T) {
209+
testcases := []struct {
210+
input string
211+
expectedErr bool
212+
}{
213+
{"//:foo", true},
214+
{"://foo", true},
215+
}
216+
for _, v := range testcases {
217+
urlx, err := ParseAbsoluteURL(v.input, true)
218+
if v.expectedErr {
219+
require.NotNil(t, err)
220+
require.Nil(t, urlx)
221+
} else {
222+
require.Nil(t, err)
223+
require.NotNil(t, urlx)
224+
}
225+
}
226+
}

0 commit comments

Comments
 (0)