diff --git a/parse.go b/parse.go index fdd6c41..44d3a73 100644 --- a/parse.go +++ b/parse.go @@ -1,17 +1,12 @@ package whois import ( - "fmt" - "os" "strings" "time" ) -func parse(domain string, result string) { - os.WriteFile(domain+".txt", []byte(result), 0644) +func parse(domain string, result string) (Result, error) { ext := getExtension(domain) - secExt := getExtension(strings.TrimSuffix(domain, "."+ext)) - _ = secExt var data Result var err error switch ext { @@ -24,10 +19,7 @@ func parse(domain string, result string) { default: data, err = commonParser(domain, result) } - fmt.Println(err) - fmt.Println(data.domain, data.registerDate, data.expireDate, data.nsServers) - fmt.Println(data.exists, data.statusRaw, data.nsServers) - fmt.Printf("%+v\n%+v\n", data.adminInfo, data.registerInfo) + return data, err } func commonParser(domain, data string) (Result, error) { @@ -38,6 +30,7 @@ func commonParser(domain, data string) (Result, error) { var r, a, t PersonalInfo split := strings.Split(data, "\n") + statusMap := make(map[string]struct{}) for _, line := range split { line = strings.TrimSpace(line) if !res.exists { @@ -69,7 +62,10 @@ func commonParser(domain, data string) (Result, error) { res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Registrar:")) } if strings.HasPrefix(line, "Status:") { - res.statusRaw = strings.TrimSpace(strings.TrimPrefix(line, "Status:")) + statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Status:")), " ")[0]] = struct{}{} + } + if strings.HasPrefix(line, "Domain Status:") { + statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:")), " ")[0]] = struct{}{} } if strings.HasPrefix(line, "Name Server:") { res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "Name Server:"))) @@ -189,6 +185,9 @@ func commonParser(domain, data string) (Result, error) { t.Email = strings.TrimSpace(strings.TrimPrefix(line, "Tech Email:")) } } + for status := range statusMap { + res.statusRaw = append(res.statusRaw, status) + } res.registerInfo = r res.adminInfo = a res.techInfo = t @@ -206,6 +205,7 @@ func dotCNParser(domain, data string) (Result, error) { return res, nil } res.exists = true + statusMap := make(map[string]struct{}) split := strings.Split(data, "\n") for _, line := range split { line = strings.TrimSpace(line) @@ -226,7 +226,10 @@ func dotCNParser(domain, data string) (Result, error) { res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Sponsoring Registrar:")) } if strings.HasPrefix(line, "Status:") { - res.statusRaw = strings.TrimSpace(strings.TrimPrefix(line, "Status:")) + statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Status:")), " ")[0]] = struct{}{} + } + if strings.HasPrefix(line, "Domain Status:") { + statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:")), " ")[0]] = struct{}{} } if strings.HasPrefix(line, "Name Server:") { res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "Name Server:"))) @@ -241,6 +244,9 @@ func dotCNParser(domain, data string) (Result, error) { r.Email = strings.TrimSpace(strings.TrimPrefix(line, "Registrant Contact Email:")) } } + for status := range statusMap { + res.statusRaw = append(res.statusRaw, status) + } res.registerInfo = r return res, nil } @@ -260,6 +266,7 @@ func dotJPParser(domain, data string) (Result, error) { } line = strings.TrimSpace(line) if strings.HasPrefix(line, "[Domain Name]") { + res.exists = true res.nsServers = []string{} res.domain = strings.TrimSpace(strings.TrimPrefix(line, "[Domain Name]")) } @@ -270,10 +277,10 @@ func dotJPParser(domain, data string) (Result, error) { res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "[Name Server]"))) } if strings.HasPrefix(line, "[状態]") { - res.statusRaw += strings.TrimSpace(strings.TrimPrefix(line, "[状態]")) + res.statusRaw = append(res.statusRaw, strings.TrimSpace(strings.TrimPrefix(line, "[状態]"))) } if strings.HasPrefix(line, "[ロック状態]") { - res.statusRaw += strings.TrimSpace(strings.TrimPrefix(line, "[ロック状態]")) + res.statusRaw = append(res.statusRaw, strings.TrimSpace(strings.TrimPrefix(line, "[ロック状態]"))) } if strings.HasPrefix(line, "[登録年月日]") { res.registerDate = parseJPDate(strings.TrimSpace(strings.TrimPrefix(line, "[登録年月日]")), true) @@ -348,7 +355,7 @@ func dotTWParser(domain, data string) (Result, error) { res.expireDate = parseCNDate(strings.TrimSpace(strings.TrimSuffix(strings.TrimPrefix(line, "Record expires on"), "(UTC+8)"))) } if strings.HasPrefix(line, "Domain Status:") { - res.statusRaw = strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:")) + res.statusRaw = append(res.statusRaw, strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:"))) } if strings.HasPrefix(line, "Domain servers in listed order:") { startNs = true diff --git a/parse_test.go b/parse_test.go index 1785c53..4fe2f49 100644 --- a/parse_test.go +++ b/parse_test.go @@ -7,5 +7,5 @@ import ( func TestWhois(t *testing.T) { c := NewClient() - fmt.Println(c.Whois("b612.com")) + fmt.Println(c.Whois("b612.in")) } diff --git a/whois.go b/whois.go index 46cabc2..884e5d4 100644 --- a/whois.go +++ b/whois.go @@ -19,6 +19,60 @@ const ( asnPrefix = "AS" ) +const ( + StatusAddPeriod = "AddPeriod" + StatusAutoRenewPeriod = "AutoRenewPeriod" + StatusInActive = "Inactive" + StatusOk = "Ok" + StatusPendingDelete = "PendingDelete" + StatusPendingCreate = "PendingCreate" + StatusPendingRenew = "PendingRenew" + StatusPendingTransfer = "PendingTransfer" + StatusPendingRestore = "PendingRestore" + StatusPendingUpdate = "PendingUpdate" + StatusRedemptionPeriod = "RedemptionPeriod" + StatusRenewPeriod = "RenewPeriod" + StatusServerDeleteProhibited = "ServerDeleteProhibited" + StatusServerHold = "ServerHold" + StatusServerRenewProhibited = "ServerRenewProhibited" + StatusServerTransferProhibited = "ServerTransferProhibited" + StatusServerUpdateProhibited = "ServerUpdateProhibited" + StatusTransferPeriod = "TransferPeriod" + StatusClientDeleteProhibited = "ClientDeleteProhibited" + StatusClientHold = "ClientHold" + StatusClientRenewProhibited = "ClientRenewProhibited" + StatusClientTransferProhibited = "ClientTransferProhibited" + StatusClientUpdateProhibited = "ClientUpdateProhibited" +) + +/* +var statusMap = map[string]string{ + "addPeriod": StatusAddPeriod, + "autoRenewPeriod": StatusAutoRenewPeriod, + "inactive": StatusInActive, + "ok": StatusOk, + "pendingDelete": StatusPendingDelete, + "pendingCreate": StatusPendingCreate, + "pendingRenew": StatusPendingRenew, + "pendingTransfer": StatusPendingTransfer, + "pendingRestore": StatusPendingRestore, + "pendingUpdate": StatusPendingUpdate, + "redemptionPeriod": StatusRedemptionPeriod, + "renewPeriod": StatusRenewPeriod, + "serverDeleteProhibited": StatusServerDeleteProhibited, + "serverHold": StatusServerHold, + "serverRenewProhibited": StatusServerRenewProhibited, + "serverTransferProhibited": StatusServerTransferProhibited, + "serverUpdateProhibited": StatusServerUpdateProhibited, + "transferPeriod": StatusTransferPeriod, + "clientDeleteProhibited": StatusClientDeleteProhibited, + "clientHold": StatusClientHold, + "clientRenewProhibited": StatusClientRenewProhibited, + "clientTransferProhibited": StatusClientTransferProhibited, + "clientUpdateProhibited": StatusClientUpdateProhibited, +} +*/ + // DefaultClient is default whois client var DefaultClient = NewClient() @@ -55,7 +109,7 @@ type Result struct { registerDate time.Time updateDate time.Time expireDate time.Time - statusRaw string + statusRaw []string nsServers []string dnssec string whoisSer string @@ -65,6 +119,70 @@ type Result struct { techInfo PersonalInfo } +func (r Result) Exists() bool { + return r.exists +} + +func (r Result) Domain() string { + return r.domain +} + +func (r Result) DomainID() string { + return r.domainID +} + +func (r Result) RawData() string { + return r.rawData +} + +func (r Result) Registar() string { + return r.registar +} + +func (r Result) RegisterDate() time.Time { + return r.registerDate +} + +func (r Result) UpdateDate() time.Time { + return r.updateDate +} + +func (r Result) ExpireDate() time.Time { + return r.expireDate +} + +func (r Result) Status() []string { + return r.statusRaw +} + +func (r Result) NsServers() []string { + return r.nsServers +} + +func (r Result) Dnssec() string { + return r.dnssec +} + +func (r Result) WhoisSer() string { + return r.whoisSer +} + +func (r Result) IanaID() string { + return r.ianaID +} + +func (r Result) RegisterInfo() PersonalInfo { + return r.registerInfo +} + +func (r Result) AdminInfo() PersonalInfo { + return r.adminInfo +} + +func (r Result) TechInfo() PersonalInfo { + return r.techInfo +} + // NewClient returns new whois client func NewClient() *Client { return &Client{ @@ -75,13 +193,12 @@ func NewClient() *Client { } } -func (c *Client) Whois(domain string, servers ...string) (string, error) { +func (c *Client) Whois(domain string, servers ...string) (Result, error) { data, err := c.whois(domain) if err != nil { - return data, err + return Result{}, err } - parse(domain, data) - return "", err + return parse(domain, data) } func (c *Client) whois(domain string, servers ...string) (result string, err error) {