@@ -130,10 +130,31 @@ func (d *DNSServer) readQuery(m *dns.Msg) {
130130 }
131131}
132132
133+ func (d * DNSServer ) getRecordByDomainName (domainName string ) (Records , bool ) {
134+ lowerName := strings .ToLower (domainName )
135+ domain , ok := d .Domains [lowerName ]
136+ if ! ok {
137+ split := strings .Split (lowerName , "." )
138+ for len (split ) > 0 && ! ok {
139+ split [0 ] = "*"
140+ wildName := strings .Join (split , "." )
141+ domain , ok = d .Domains [wildName ]
142+ newsplit := append (split [:0 ], split [1 :]... )
143+ split = newsplit
144+ }
145+ if ok {
146+ for i := 0 ; i < len (domain .Records ); i ++ {
147+ domain .Records [i ].Header ().Name = lowerName
148+ }
149+ }
150+ }
151+ return domain , ok
152+ }
153+
133154func (d * DNSServer ) getRecord (q dns.Question ) ([]dns.RR , error ) {
134155 var rr []dns.RR
135156 var cnames []dns.RR
136- domain , ok := d .Domains [ strings . ToLower (q .Name )]
157+ domain , ok := d .getRecordByDomainName (q .Name )
137158 if ! ok {
138159 return rr , fmt .Errorf ("No records for domain %s" , q .Name )
139160 }
@@ -156,7 +177,7 @@ func (d *DNSServer) answeringForDomain(name string) bool {
156177 if d .Domain == strings .ToLower (name ) {
157178 return true
158179 }
159- _ , ok := d .Domains [ strings . ToLower (name )]
180+ _ , ok := d .getRecordByDomainName (name )
160181 return ok
161182}
162183
0 commit comments