-
Notifications
You must be signed in to change notification settings - Fork 0
/
trust_server.go
70 lines (60 loc) · 1.24 KB
/
trust_server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
import (
"fmt"
"net/url"
"strings"
"sync"
)
// 信任服务器列表,用于缩短源文件的访问路径
type TrustServer struct {
sync.RWMutex
m map[string]*url.URL
}
func NewTrustServer() *TrustServer {
return &TrustServer{
m: make(map[string]*url.URL),
}
}
func (t *TrustServer) Set(tag string, u *url.URL) {
t.Lock()
defer t.Unlock()
t.m[strings.TrimSpace(tag)] = u
}
func (t *TrustServer) Get(tag string) *url.URL {
t.RLock()
defer t.RUnlock()
if v, ok := t.m[tag]; ok {
return v
}
return nil
}
// 根据短请求地址返回完整的资源地址,短请求地址样式:
// s1:/jquery-latest.js 或 s1:/jquery-3.2.1.min.js 或 s2:/2.0/typo.css
func (t *TrustServer) GetByShort(su string) string {
tag, path := func() (string, string) {
as := strings.Split(su, ":")
return as[0], as[1]
}()
u := t.Get(tag)
if u == nil {
return ""
}
pu := u.String()
if strings.HasSuffix(pu, "/") {
pu = pu[:len(pu)-1]
}
path = cleanPrefixPath(path)
if u, err := url.Parse(fmt.Sprintf("%s/%s", pu, path)); err == nil {
return u.String()
}
return ""
}
func (t *TrustServer) List() map[string]string {
t.RLock()
defer t.RUnlock()
r := make(map[string]string)
for k, v := range t.m {
r[k] = v.String()
}
return r
}