...
1
2
3
4
5
6
7
8
9
10
11
12 package v4
13
14 import (
15 "bytes"
16 "fmt"
17 "net/url"
18 "strings"
19 )
20
21
22 var noEscape [256]bool
23
24 func init() {
25 for i := 0; i < len(noEscape); i++ {
26
27 noEscape[i] = (i >= 'A' && i <= 'Z') ||
28 (i >= 'a' && i <= 'z') ||
29 (i >= '0' && i <= '9') ||
30 i == '-' ||
31 i == '.' ||
32 i == '_' ||
33 i == '~'
34 }
35 }
36
37 func getURIPath(u *url.URL) string {
38 var uri string
39
40 if len(u.Opaque) > 0 {
41 uri = "/" + strings.Join(strings.Split(u.Opaque, "/")[3:], "/")
42 } else {
43 uri = u.EscapedPath()
44 }
45
46 if len(uri) == 0 {
47 uri = "/"
48 }
49
50 return uri
51 }
52
53
54 func EscapePath(path string, encodeSep bool) string {
55 var buf bytes.Buffer
56 for i := 0; i < len(path); i++ {
57 c := path[i]
58 if noEscape[c] || (c == '/' && !encodeSep) {
59 buf.WriteByte(c)
60 } else {
61 fmt.Fprintf(&buf, "%%%02X", c)
62 }
63 }
64 return buf.String()
65 }
66
View as plain text