@@ -166,28 +166,56 @@ func (r *Resolver) dnsLocalDomainHandler(resp dns.ResponseWriter, req *dns.Msg)
166166
167167 switch qtype {
168168 case dns .TypeA , dns .TypeAAAA , dns .TypeANY :
169- aRec := & dns.A {
169+ if ! found {
170+ m .SetRcode (req , dns .RcodeNameError )
171+ continue
172+ }
173+ appendIPAnswers (m , hostname , mappedIP , qtype )
174+ }
175+ }
176+
177+ processOwnResponse (req , resp , m )
178+
179+ _ = resp .WriteMsg (m )
180+ }
181+
182+ func appendIPAnswers (m * dns.Msg , hostname string , mappedIP string , qtype uint16 ) {
183+ ip := net .ParseIP (mappedIP )
184+ if ip == nil {
185+ return
186+ }
187+
188+ if qtype == dns .TypeA || qtype == dns .TypeANY {
189+ if ipv4 := ip .To4 (); ipv4 != nil {
190+ m .Answer = append (m .Answer , & dns.A {
170191 Hdr : dns.RR_Header {
171192 // we should return original name from the request as some clients expect that
172193 Name : hostname ,
173194 Rrtype : dns .TypeA ,
174195 Class : dns .ClassINET ,
175196 Ttl : defaultTTLSeconds ,
176197 },
177- }
178- if found {
179- // TODO: support ipv6
180- aRec .A = net .ParseIP (mappedIP ).To4 ()
181- } else {
182- m .SetRcode (req , dns .RcodeNameError )
183- }
184- m .Answer = append (m .Answer , aRec )
198+ A : ipv4 ,
199+ })
185200 }
186201 }
187202
188- processOwnResponse (req , resp , m )
189-
190- _ = resp .WriteMsg (m )
203+ if qtype == dns .TypeAAAA || qtype == dns .TypeANY {
204+ if ip .To4 () == nil {
205+ if ipv6 := ip .To16 (); ipv6 != nil {
206+ m .Answer = append (m .Answer , & dns.AAAA {
207+ Hdr : dns.RR_Header {
208+ // we should return original name from the request as some clients expect that
209+ Name : hostname ,
210+ Rrtype : dns .TypeAAAA ,
211+ Class : dns .ClassINET ,
212+ Ttl : defaultTTLSeconds ,
213+ },
214+ AAAA : ipv6 ,
215+ })
216+ }
217+ }
218+ }
191219}
192220
193221func (r * Resolver ) ptrv4Handler (resp dns.ResponseWriter , req * dns.Msg ) {
0 commit comments