forked from forease/gotld
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgotld.go
113 lines (92 loc) · 1.73 KB
/
gotld.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
*
*
*/
package gotld
import (
"bytes"
"errors"
"strings"
"sync"
)
// TldItem tld item
type TldItem struct {
Id int32
Country, Tld, Category string
Lables int
}
const (
GOTLD_VERSION = "gotld V1.3"
)
var (
tldMap = make(map[string]TldItem)
pool = sync.Pool{New: func() interface{} { return new(bytes.Buffer) }}
)
// Initialization Top Level Domain Table
func init() {
initTld()
}
// GetTld 获取域名
func GetTld(url string) (tld TldItem, domain string, err error) {
tld, domain, _, err = subDomain(url, 0)
return
}
// GetSubdomain 获取子域名
func GetSubdomain(url string, level int) (subdomain, domain, tld string) {
var t TldItem
t, domain, subdomain, _ = subDomain(url, level)
return subdomain, domain, t.Tld
}
func subDomain(url string, level int) (tld TldItem, domain, subDomain string, err error) {
var (
buffer = pool.Get().(*bytes.Buffer)
isTLD bool
)
dm := strings.Split(url, ".")
size := len(dm)
if size > 1 {
idx := 0
for i := size - 1; i >= 0; i-- {
// 组合域名
for j := i; j < size; j++ {
buffer.WriteString(dm[j])
if j != size-1 {
buffer.WriteString(".")
}
}
subDomain = buffer.String()
// 重置buffer
buffer.Reset()
// 判断是否为TLD
value, ok := tldMap[subDomain]
if ok {
tld = value
isTLD = true
continue
}
// 找出TLD后
if isTLD {
if domain == "" {
domain = subDomain
}
if idx >= level {
break
}
idx++
}
}
} else {
tld, _ = tldMap[url]
}
pool.Put(buffer)
if tld.Tld == "" {
err = errors.New("Can't get tld from " + url)
} else {
tld.Lables = size
}
return
}
// GetVersion -
func GetVersion() string {
return GOTLD_VERSION
}