public static void main(String[] args) throws Exception { try (DatagramSocket socket = new DatagramSocket()) { Message message = new Message(); Header header = message.getHeader(); header.setOpcode(Opcode.QUERY); header.setID(1); header.setRcode(Rcode.NOERROR); header.setFlag(Flags.RD); message.addRecord(Record.newRecord(new Name("www.xqbase.com."), Type.A, DClass.IN), Section.QUESTION); byte[] data = message.toWire(); DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 53)); socket.send(packet); data = new byte[65536]; packet = new DatagramPacket(data, data.length); socket.setSoTimeout(2000); socket.receive(packet); Message response = new Message(Bytes.left(data, packet.getLength())); System.out.println(response); } }
public void test_ctor_0arg() { m_h = new Header(); assertTrue(0 <= m_h.getID() && m_h.getID() < 0xFFFF); boolean[] flags = m_h.getFlags(); for( int i=0; i<flags.length; ++i){ assertFalse(flags[i]); } assertEquals(0, m_h.getRcode()); assertEquals(0, m_h.getOpcode()); assertEquals(0, m_h.getCount(0)); assertEquals(0, m_h.getCount(1)); assertEquals(0, m_h.getCount(2)); assertEquals(0, m_h.getCount(3)); }
public void test_clone() { m_h.setOpcode(Opcode.value("IQUERY")); m_h.setRcode(Rcode.value("SERVFAIL")); m_h.setFlag(0); // qr m_h.setFlag(7); // rd m_h.setFlag(8); // ra m_h.setFlag(11); // cd m_h.setCount(1, 0xFF); m_h.setCount(2, 0x0A); Header h2 = (Header)m_h.clone(); assertNotSame(m_h, h2); assertEquals(m_h.getID(), h2.getID()); for( int i=0; i<16; ++i){ if( (i>0 && i<5) || i > 11){ continue; } assertEquals(m_h.getFlag(i), h2.getFlag(i)); } for( int i=0; i<4; ++i){ assertEquals(m_h.getCount(i), h2.getCount(i)); } }
private void setAnswerFlagsToState(Header header, AnswerScreenState state){ state.flag_AA = header.getFlag(Flags.AA); state.flag_AD = header.getFlag(Flags.AD); state.flag_TC = header.getFlag(Flags.TC); state.flag_RD = header.getFlag(Flags.RD); state.flag_RA = header.getFlag(Flags.RA); state.flag_CD = header.getFlag(Flags.CD); }
public void test_ctor_DNSInput() throws IOException { byte[] raw = new byte[] { (byte)0x12, (byte)0xAB, // ID (byte)0x8F, (byte)0xBD, // flags: 1 0001 1 1 1 1 011 1101 (byte)0x65, (byte)0x1C, // QDCOUNT (byte)0x10, (byte)0xF0, // ANCOUNT (byte)0x98, (byte)0xBA, // NSCOUNT (byte)0x71, (byte)0x90 }; // ARCOUNT m_h = new Header(new DNSInput(raw)); assertEquals(0x12AB, m_h.getID()); boolean[] flags = m_h.getFlags(); assertTrue(flags[0]); assertEquals(1, m_h.getOpcode()); assertTrue(flags[5]); assertTrue(flags[6]); assertTrue(flags[7]); assertTrue(flags[8]); assertFalse(flags[9]); assertTrue(flags[10]); assertTrue(flags[11]); assertEquals(0xD, m_h.getRcode()); assertEquals(0x651C, m_h.getCount(0)); assertEquals(0x10F0, m_h.getCount(1)); assertEquals(0x98BA, m_h.getCount(2)); assertEquals(0x7190, m_h.getCount(3)); }
public void test_toWire() throws IOException { byte[] raw = new byte[] { (byte)0x12, (byte)0xAB, // ID (byte)0x8F, (byte)0xBD, // flags: 1 0001 1 1 1 1 011 1101 (byte)0x65, (byte)0x1C, // QDCOUNT (byte)0x10, (byte)0xF0, // ANCOUNT (byte)0x98, (byte)0xBA, // NSCOUNT (byte)0x71, (byte)0x90 }; // ARCOUNT m_h = new Header(raw); DNSOutput dout = new DNSOutput(); m_h.toWire(dout); byte[] out = dout.toByteArray(); assertEquals(12, out.length); for( int i=0; i<out.length; ++i){ assertEquals(raw[i], out[i]); } m_h.setOpcode(0xA); // 1010 assertEquals(0xA, m_h.getOpcode()); m_h.setRcode(0x7); // 0111 // flags is now: 1101 0111 1011 0111 raw[2] = (byte)0xD7; raw[3] = (byte)0xB7; out = m_h.toWire(); assertEquals(12, out.length); for( int i=0; i<out.length; ++i){ assertEquals("i=" + i, raw[i], out[i]); } }
/** * Creates a response message with the given return code. * * @param request The request for which the response belongs. * @param rcode The response code, @see Rcode * @return The response message for <code>request</code>. */ private static SMessage errorMessage(Message request, int rcode) { SMessage m = new SMessage(request.getHeader().getID(), request.getQuestion()); Header h = m.getHeader(); h.setRcode(rcode); h.setFlag(Flags.QR); return m; }
/** * Creates a instance of this class. * * @param h The header of the original message. */ @SuppressWarnings("unchecked") public SMessage(Header h) { this.sections = new List[NUM_SECTIONS]; this.header = h; this.securityStatus = SecurityStatus.UNCHECKED; }
/** * Processes a DNS query. * * @param sock * Socket to listen to */ private void process(DatagramSocket sock) { try { byte[] in = new byte[UDP_SIZE]; // Read the question DatagramPacket indp = new DatagramPacket(in, UDP_SIZE); indp.setLength(UDP_SIZE); sock.receive(indp); Message msg = new Message(in); Header header = msg.getHeader(); Record question = msg.getQuestion(); // Prepare a response Message response = new Message(header.getID()); response.getHeader().setFlag(Flags.QR); response.addRecord(question, Section.QUESTION); Name name = question.getName(); boolean hasRecords = false; String txt = txtRecords.get(name.toString(true)); if (question.getType() == Type.TXT && txt != null) { response.addRecord(new TXTRecord(name, DClass.IN, TTL, txt), Section.ANSWER); hasRecords = true; LOG.info("dns-01: {} {} IN TXT \"{}\"", name, TTL, txt); } InetAddress a = aRecords.get(name.toString(true)); if (question.getType() == Type.A && a != null) { response.addRecord(new ARecord(name, DClass.IN, TTL, a), Section.ANSWER); hasRecords = true; LOG.info("dns-01: {} {} IN A {}", name, TTL, a.getHostAddress()); } if (!hasRecords) { response.getHeader().setRcode(Rcode.NXDOMAIN); LOG.warn("dns-01: Cannot answer: {}", question); } // Send the response byte[] resp = response.toWire(); DatagramPacket outdp = new DatagramPacket(resp, resp.length, indp.getAddress(), indp.getPort()); sock.send(outdp); } catch (Exception ex) { LOG.error("Failed to process query", ex); } }
public void setUp() { m_h = new Header(0xABCD); // 43981 }
/** * Gets this message as a standard DNSJAVA message. * * @return This message as a standard DNSJAVA message. */ public Message getMessage() { // Generate our new message. Message m = new Message(this.header.getID()); // Convert the header // We do this for two reasons: // 1) setCount() is package scope, so we can't do that, and // 2) setting the header on a message after creating the // message frequently gets stuff out of sync, leading to malformed wire // format messages. Header h = m.getHeader(); h.setOpcode(this.header.getOpcode()); h.setRcode(this.header.getRcode()); for (int i = 0; i < MAX_FLAGS; i++) { if (Flags.isFlag(i) && this.header.getFlag(i)) { h.setFlag(i); } } // Add all the records. -- this will set the counts correctly in the // message header. if (this.question != null) { m.addRecord(this.question, Section.QUESTION); } for (int sec = Section.ANSWER; sec <= Section.ADDITIONAL; sec++) { List<SRRset> slist = this.getSectionRRsets(sec); for (SRRset rrset : slist) { for (Iterator<?> j = rrset.rrs(); j.hasNext();) { m.addRecord((Record)j.next(), sec); } for (Iterator<?> j = rrset.sigs(); j.hasNext();) { m.addRecord((Record)j.next(), sec); } } } if (this.oPTRecord != null) { m.addRecord(this.oPTRecord, Section.ADDITIONAL); } return m; }
/** * Creates a new instance of this class. * * @param id The ID of the DNS query or response message. * @param question The question section of the query or response. */ public SMessage(int id, Record question) { this(new Header(id)); this.question = question; }
/** * Gets the header of this message. * * @return The header of this message. */ public Header getHeader() { return this.header; }