diff options
Diffstat (limited to 'middleware/normalize.go')
-rw-r--r-- | middleware/normalize.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/middleware/normalize.go b/middleware/normalize.go new file mode 100644 index 000000000..e5b747620 --- /dev/null +++ b/middleware/normalize.go @@ -0,0 +1,78 @@ +package middleware + +import ( + "net" + "strings" + + "github.com/miekg/dns" +) + +type Zones []string + +// Matches checks is qname is a subdomain of any of the zones in z. The match +// will return the most specific zones that matches other. The empty string +// signals a not found condition. +func (z Zones) Matches(qname string) string { + zone := "" + for _, zname := range z { + if dns.IsSubDomain(zname, qname) { + // TODO(miek): hmm, add test for this case + if len(zname) > len(zone) { + zone = zname + } + } + } + return zone +} + +// Normalize fully qualifies all zones in z. +func (z Zones) Normalize() { + for i, _ := range z { + z[i] = Name(z[i]).Normalize() + } +} + +// Name represents a domain name. +type Name string + +// Matches checks to see if other is a subdomain (or the same domain) of n. +// This method assures that names can be easily and consistently matched. +func (n Name) Matches(child string) bool { + if dns.Name(n) == dns.Name(child) { + return true + } + + return dns.IsSubDomain(string(n), child) +} + +// Normalize lowercases and makes n fully qualified. +func (n Name) Normalize() string { return strings.ToLower(dns.Fqdn(string(n))) } + +// Host represents a host from the Corefile, may contain port. +type ( + Host string + Addr string +) + +// Normalize will return the host portion of host, stripping +// of any port. The host will also be fully qualified and lowercased. +func (h Host) Normalize() string { + // separate host and port + host, _, err := net.SplitHostPort(string(h)) + if err != nil { + host, _, _ = net.SplitHostPort(string(h) + ":") + } + return Name(host).Normalize() +} + +// Normalize will return a normalized address, if not port is specified +// port 53 is added, otherwise the port will be left as is. +func (a Addr) Normalize() string { + // separate host and port + addr, port, err := net.SplitHostPort(string(a)) + if err != nil { + addr, port, _ = net.SplitHostPort(string(a) + ":53") + } + // TODO(miek): lowercase it? + return net.JoinHostPort(addr, port) +} |