(Message response, Name name, int type, int dclass, int iterations, int flags)
| 209 | } |
| 210 | |
| 211 | byte |
| 212 | addAnswer(Message response, Name name, int type, int dclass, |
| 213 | int iterations, int flags) |
| 214 | { |
| 215 | SetResponse sr; |
| 216 | byte rcode = Rcode.NOERROR; |
| 217 | |
| 218 | if (iterations > 6) |
| 219 | return Rcode.NOERROR; |
| 220 | |
| 221 | if (type == Type.SIG || type == Type.RRSIG) { |
| 222 | type = Type.ANY; |
| 223 | flags |= FLAG_SIGONLY; |
| 224 | } |
| 225 | |
| 226 | Zone zone = findBestZone(name); |
| 227 | if (zone != null) |
| 228 | sr = zone.findRecords(name, type); |
| 229 | else { |
| 230 | Cache cache = getCache(dclass); |
| 231 | sr = cache.lookupRecords(name, type, Credibility.NORMAL); |
| 232 | } |
| 233 | |
| 234 | if (sr.isUnknown()) { |
| 235 | addCacheNS(response, getCache(dclass), name); |
| 236 | } |
| 237 | if (sr.isNXDOMAIN()) { |
| 238 | response.getHeader().setRcode(Rcode.NXDOMAIN); |
| 239 | if (zone != null) { |
| 240 | addSOA(response, zone); |
| 241 | if (iterations == 0) |
| 242 | response.getHeader().setFlag(Flags.AA); |
| 243 | } |
| 244 | rcode = Rcode.NXDOMAIN; |
| 245 | } |
| 246 | else if (sr.isNXRRSET()) { |
| 247 | if (zone != null) { |
| 248 | addSOA(response, zone); |
| 249 | if (iterations == 0) |
| 250 | response.getHeader().setFlag(Flags.AA); |
| 251 | } |
| 252 | } |
| 253 | else if (sr.isDelegation()) { |
| 254 | RRset nsRecords = sr.getNS(); |
| 255 | addRRset(nsRecords.getName(), response, nsRecords, |
| 256 | Section.AUTHORITY, flags); |
| 257 | } |
| 258 | else if (sr.isCNAME()) { |
| 259 | CNAMERecord cname = sr.getCNAME(); |
| 260 | RRset rrset = new RRset(cname); |
| 261 | addRRset(name, response, rrset, Section.ANSWER, flags); |
| 262 | if (zone != null && iterations == 0) |
| 263 | response.getHeader().setFlag(Flags.AA); |
| 264 | rcode = addAnswer(response, cname.getTarget(), |
| 265 | type, dclass, iterations + 1, flags); |
| 266 | } |
| 267 | else if (sr.isDNAME()) { |
| 268 | DNAMERecord dname = sr.getDNAME(); |
no test coverage detected