90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
|
|
package whois
|
||
|
|
|
||
|
|
import "strings"
|
||
|
|
|
||
|
|
// LookupStrategy provides per-TLD mode mapping used when Lookup mode is auto.
|
||
|
|
type LookupStrategy struct {
|
||
|
|
DefaultMode LookupMode
|
||
|
|
TLDModes map[string]LookupMode
|
||
|
|
}
|
||
|
|
|
||
|
|
func defaultLookupStrategy() LookupStrategy {
|
||
|
|
return LookupStrategy{
|
||
|
|
DefaultMode: LookupModeAutoPreferRDAP,
|
||
|
|
TLDModes: map[string]LookupMode{},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func cloneLookupStrategy(in LookupStrategy) LookupStrategy {
|
||
|
|
out := LookupStrategy{
|
||
|
|
DefaultMode: in.DefaultMode,
|
||
|
|
TLDModes: map[string]LookupMode{},
|
||
|
|
}
|
||
|
|
for k, v := range in.TLDModes {
|
||
|
|
tld := normalizeRDAPTLD(k)
|
||
|
|
if tld == "" {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
out.TLDModes[tld] = normalizeLookupMode(v)
|
||
|
|
}
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s LookupStrategy) modeForDomain(domain string, fallback LookupMode) LookupMode {
|
||
|
|
tld := normalizeRDAPTLD(getExtension(domain))
|
||
|
|
if tld != "" {
|
||
|
|
if m, ok := s.TLDModes[tld]; ok {
|
||
|
|
return normalizeLookupMode(m)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if strings.TrimSpace(string(s.DefaultMode)) != "" {
|
||
|
|
return normalizeLookupMode(s.DefaultMode)
|
||
|
|
}
|
||
|
|
return normalizeLookupMode(fallback)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (o LookupOptions) resolveMode(domain string) LookupMode {
|
||
|
|
mode := normalizeLookupMode(o.Mode)
|
||
|
|
if mode != LookupModeAutoPreferRDAP {
|
||
|
|
return mode
|
||
|
|
}
|
||
|
|
return o.Strategy.modeForDomain(domain, mode)
|
||
|
|
}
|
||
|
|
|
||
|
|
// WithLookupStrategy sets full lookup strategy.
|
||
|
|
func WithLookupStrategy(strategy LookupStrategy) LookupOpt {
|
||
|
|
return func(o *LookupOptions) {
|
||
|
|
o.Strategy = cloneLookupStrategy(strategy)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// WithLookupTLDStrategy sets one tld-specific lookup mode used under auto mode.
|
||
|
|
func WithLookupTLDStrategy(tld string, mode LookupMode) LookupOpt {
|
||
|
|
return func(o *LookupOptions) {
|
||
|
|
if o.Strategy.TLDModes == nil {
|
||
|
|
o.Strategy.TLDModes = map[string]LookupMode{}
|
||
|
|
}
|
||
|
|
key := normalizeRDAPTLD(tld)
|
||
|
|
if key == "" {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
o.Strategy.TLDModes[key] = normalizeLookupMode(mode)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// WithLookupTLDStrategies sets multiple tld-specific lookup modes used under auto mode.
|
||
|
|
func WithLookupTLDStrategies(m map[string]LookupMode) LookupOpt {
|
||
|
|
return func(o *LookupOptions) {
|
||
|
|
for tld, mode := range m {
|
||
|
|
WithLookupTLDStrategy(tld, mode)(o)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// WithLookupStrategyDefaultMode sets default strategy mode used under auto mode.
|
||
|
|
func WithLookupStrategyDefaultMode(mode LookupMode) LookupOpt {
|
||
|
|
return func(o *LookupOptions) {
|
||
|
|
o.Strategy.DefaultMode = normalizeLookupMode(mode)
|
||
|
|
}
|
||
|
|
}
|