...
1 package urlx
2
3 import (
4 "net/url"
5 "regexp"
6 "strings"
7
8 "github.com/ory/x/logrusx"
9 )
10
11
12 var winPathRegex = regexp.MustCompile("^[A-Za-z]:.*")
13
14
15
16
17
18
19
20
21
22
23
24 func Parse(rawURL string) (*url.URL, error) {
25 lcRawURL := strings.ToLower(rawURL)
26 if strings.HasPrefix(lcRawURL, "file:///") {
27 return url.Parse(rawURL)
28 }
29
30
31
32
33 rawURL = trimPrefixIC(rawURL, "file://")
34
35 if winPathRegex.MatchString(rawURL) {
36
37 return url.Parse("file:///" + rawURL)
38 }
39
40 if strings.HasPrefix(lcRawURL, "\\\\") {
41
42
43
44 host, path := extractUNCPathParts(rawURL)
45
46 return url.Parse("file://" + host + strings.ReplaceAll(path, "\\", "/"))
47 }
48
49 return url.Parse(rawURL)
50 }
51
52
53 func ParseOrPanic(in string) *url.URL {
54 out, err := url.Parse(in)
55 if err != nil {
56 panic(err.Error())
57 }
58 return out
59 }
60
61
62 func ParseOrFatal(l *logrusx.Logger, in string) *url.URL {
63 out, err := url.Parse(in)
64 if err != nil {
65 l.WithError(err).Fatalf("Unable to parse url: %s", in)
66 }
67 return out
68 }
69
70
71 func ParseRequestURIOrPanic(in string) *url.URL {
72 out, err := url.ParseRequestURI(in)
73 if err != nil {
74 panic(err.Error())
75 }
76 return out
77 }
78
79
80 func ParseRequestURIOrFatal(l *logrusx.Logger, in string) *url.URL {
81 out, err := url.ParseRequestURI(in)
82 if err != nil {
83 l.WithError(err).Fatalf("Unable to parse url: %s", in)
84 }
85 return out
86 }
87
88 func extractUNCPathParts(uncPath string) (host, path string) {
89 parts := strings.Split(strings.TrimPrefix(uncPath, "\\\\"), "\\")
90 host = parts[0]
91 if len(parts) > 0 {
92 path = "\\" + strings.Join(parts[1:], "\\")
93 }
94 return host, path
95 }
96
97
98
99
100 func trimPrefixIC(s, prefix string) string {
101 if strings.HasPrefix(strings.ToLower(s), prefix) {
102 return s[len(prefix):]
103 }
104 return s
105 }
106
View as plain text