-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdomain.go
47 lines (38 loc) · 1.13 KB
/
domain.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
package whois
import (
"fmt"
"strings"
"golang.org/x/net/idna"
"golang.org/x/net/publicsuffix"
)
type Domain struct {
TLD string // gTLD or ccTLD or newTLD
eTLD string // effective top-level domains
isICANN bool // is managed by the ICANN
}
func Parse(domain string) (*Domain, error) {
var err error
if domain, err = idna.ToASCII(domain); err != nil {
return nil, err
}
if strings.HasPrefix(domain, ".") || strings.HasSuffix(domain, ".") || strings.Contains(domain, "..") {
return nil, fmt.Errorf("empty label in domain %q", domain)
}
var d Domain
if d.TLD, d.isICANN = publicsuffix.PublicSuffix(domain); len(domain) <= len(d.TLD) {
return nil, fmt.Errorf("cannot derive eTLD+1 for domain %q", domain)
}
i := len(domain) - len(d.TLD) - 1
if domain[i] != '.' {
return nil, fmt.Errorf("invalid public TLD %q for domain %q", d.TLD, domain)
}
d.eTLD = domain[1+strings.LastIndex(domain[:i], "."):]
return &d, nil
}
func (d Domain) Query() string {
arr, ok := whoisServerData[d.TLD]
if !ok {
arr = []string{"whois.nic." + d.TLD, "whois." + d.TLD, "nic." + d.TLD}
}
return <-AsyncQueryWithTimeout(d.eTLD, arr)
}