@Override public void run() { while (running) { try { buf.clear(); SocketAddress src = channel.receive(buf); buf.flip(); if (src != null) { log.debug("Received datagram from " + src); Message message = new Message(buf); if (message.getHeader().getOpcode() == Opcode.QUERY) { // Dispatch workers.execute(new ForwardTask(channel, src, message, workers)); } } } catch (IOException e) { e.printStackTrace(); } } }
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_toString() { m_h.setOpcode(Opcode.value("STATUS")); m_h.setRcode(Rcode.value("NXDOMAIN")); 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); String text = m_h.toString(); assertFalse(text.indexOf("id: 43981") == -1); assertFalse(text.indexOf("opcode: STATUS") == -1); assertFalse(text.indexOf("status: NXDOMAIN") == -1); assertFalse(text.indexOf(" qr ") == -1); assertFalse(text.indexOf(" rd ") == -1); assertFalse(text.indexOf(" ra ") == -1); assertFalse(text.indexOf(" cd ") == -1); assertFalse(text.indexOf("qd: 0 ") == -1); assertFalse(text.indexOf("an: 255 ") == -1); assertFalse(text.indexOf("au: 10 ") == -1); assertFalse(text.indexOf("ad: 0 ") == -1); }
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 checkValidResponse(Message query, Message response) { verify( response.getHeader().getID() == query.getHeader().getID(), "response ID %s does not match query ID %s", response.getHeader().getID(), query.getHeader().getID()); verify( response.getHeader().getOpcode() == query.getHeader().getOpcode(), "response opcode '%s' does not match query opcode '%s'", Opcode.string(response.getHeader().getOpcode()), Opcode.string(query.getHeader().getOpcode())); }
private Message messageWithResponseCode(int responseCode) { Message message = new Message(); message.getHeader().setOpcode(Opcode.UPDATE); message.getHeader().setFlag(Flags.QR); message.getHeader().setRcode(responseCode); return message; }
@Test public void testResponseOpcodeMismatchThrowsException() throws Exception { simpleQuery.getHeader().setOpcode(Opcode.QUERY); expectedResponse.getHeader().setOpcode(Opcode.STATUS); when(mockSocket.getInputStream()) .thenReturn(new ByteArrayInputStream(messageToBytesWithLength(expectedResponse))); when(mockSocket.getOutputStream()).thenReturn(new ByteArrayOutputStream()); VerifyException thrown = expectThrows(VerifyException.class, () -> resolver.send(simpleQuery)); assertThat(thrown) .hasMessageThat() .contains("response opcode 'STATUS' does not match query opcode 'QUERY'"); }