podman
69 строк · 1.7 Кб
1package internal
2
3import (
4"net/url"
5"regexp"
6"strings"
7)
8
9const (
10defaultHTTPPort = ":80"
11defaultHTTPSPort = ":443"
12)
13
14// Regular expressions used by the normalizations
15var rxPort = regexp.MustCompile(`(:\d+)/?$`)
16var rxDupSlashes = regexp.MustCompile(`/{2,}`)
17
18// NormalizeURL will normalize the specified URL
19// This was added to replace a previous call to the no longer maintained purell library:
20// The call that was used looked like the following:
21//
22// url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes))
23//
24// To explain all that was included in the call above, purell.FlagsSafe was really just the following:
25// - FlagLowercaseScheme
26// - FlagLowercaseHost
27// - FlagRemoveDefaultPort
28// - FlagRemoveDuplicateSlashes (and this was mixed in with the |)
29//
30// This also normalizes the URL into its urlencoded form by removing RawPath and RawFragment.
31func NormalizeURL(u *url.URL) {
32lowercaseScheme(u)
33lowercaseHost(u)
34removeDefaultPort(u)
35removeDuplicateSlashes(u)
36
37u.RawPath = ""
38u.RawFragment = ""
39}
40
41func lowercaseScheme(u *url.URL) {
42if len(u.Scheme) > 0 {
43u.Scheme = strings.ToLower(u.Scheme)
44}
45}
46
47func lowercaseHost(u *url.URL) {
48if len(u.Host) > 0 {
49u.Host = strings.ToLower(u.Host)
50}
51}
52
53func removeDefaultPort(u *url.URL) {
54if len(u.Host) > 0 {
55scheme := strings.ToLower(u.Scheme)
56u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string {
57if (scheme == "http" && val == defaultHTTPPort) || (scheme == "https" && val == defaultHTTPSPort) {
58return ""
59}
60return val
61})
62}
63}
64
65func removeDuplicateSlashes(u *url.URL) {
66if len(u.Path) > 0 {
67u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/")
68}
69}
70