(Message query, byte [] in, int length, Socket s)
| 367 | * TCP. |
| 368 | */ |
| 369 | public byte [] |
| 370 | generateReply(Message query, byte [] in, int length, Socket s) |
| 371 | throws IOException |
| 372 | { |
| 373 | Header header; |
| 374 | boolean badversion; |
| 375 | int maxLength; |
| 376 | int flags = 0; |
| 377 | |
| 378 | header = query.getHeader(); |
| 379 | if (header.getFlag(Flags.QR)) |
| 380 | return null; |
| 381 | if (header.getRcode() != Rcode.NOERROR) |
| 382 | return errorMessage(query, Rcode.FORMERR); |
| 383 | if (header.getOpcode() != Opcode.QUERY) |
| 384 | return errorMessage(query, Rcode.NOTIMP); |
| 385 | |
| 386 | Record queryRecord = query.getQuestion(); |
| 387 | |
| 388 | |
| 389 | TSIGRecord queryTSIG = query.getTSIG(); |
| 390 | TSIG tsig = null; |
| 391 | if (queryTSIG != null) { |
| 392 | tsig = (TSIG) TSIGs.get(queryTSIG.getName()); |
| 393 | if (tsig == null || |
| 394 | tsig.verify(query, in, length, null) != Rcode.NOERROR) |
| 395 | return formerrMessage(in); |
| 396 | } |
| 397 | |
| 398 | OPTRecord queryOPT = query.getOPT(); |
| 399 | if (queryOPT != null && queryOPT.getVersion() > 0) |
| 400 | badversion = true; |
| 401 | |
| 402 | if (s != null) |
| 403 | maxLength = 65535; |
| 404 | else if (queryOPT != null) |
| 405 | maxLength = Math.max(queryOPT.getPayloadSize(), 512); |
| 406 | else |
| 407 | maxLength = 512; |
| 408 | |
| 409 | if (queryOPT != null && (queryOPT.getFlags() & ExtendedFlags.DO) != 0) |
| 410 | flags = FLAG_DNSSECOK; |
| 411 | |
| 412 | Message response = new Message(query.getHeader().getID()); |
| 413 | response.getHeader().setFlag(Flags.QR); |
| 414 | if (query.getHeader().getFlag(Flags.RD)) |
| 415 | response.getHeader().setFlag(Flags.RD); |
| 416 | response.addRecord(queryRecord, Section.QUESTION); |
| 417 | |
| 418 | Name name = queryRecord.getName(); |
| 419 | int type = queryRecord.getType(); |
| 420 | int dclass = queryRecord.getDClass(); |
| 421 | if (type == Type.AXFR && s != null) |
| 422 | return doAXFR(name, query, tsig, queryTSIG, s); |
| 423 | if (!Type.isRR(type) && type != Type.ANY) |
| 424 | return errorMessage(query, Rcode.NOTIMP); |
| 425 | |
| 426 | byte rcode = addAnswer(response, name, type, dclass, 0, flags); |
no test coverage detected