aboutsummaryrefslogtreecommitdiff
path: root/middleware/normalize.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/normalize.go')
-rw-r--r--middleware/normalize.go78
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)
+}