/* * dnssecjava - a DNSSEC validating stub resolver for Java * Copyright (c) 2013-2015 Ingo Bauersachs * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jitsi.dnssec; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.Reader; import org.xbill.DNS.DClass; import org.xbill.DNS.Master; import org.xbill.DNS.Message; import org.xbill.DNS.Name; import org.xbill.DNS.Rcode; import org.xbill.DNS.Record; import org.xbill.DNS.Section; import org.xbill.DNS.Type; public class MessageReader { public Message readMessage(Reader in) throws IOException { BufferedReader r; if (in instanceof BufferedReader) { r = (BufferedReader)in; } else { r = new BufferedReader(in); } Message m = null; String line = null; int section = 103; while ((line = r.readLine()) != null) { String[] data; if (line.startsWith(";; ->>HEADER<<- ")) { section = 101; m = new Message(); } else if (line.startsWith(";; QUESTIONS:")) { section = 102; } else if (line.startsWith(";; ANSWERS:")) { section = Section.ANSWER; line = r.readLine(); } else if (line.startsWith(";; AUTHORITY RECORDS:")) { section = Section.AUTHORITY; line = r.readLine(); } else if (line.startsWith(";; ADDITIONAL RECORDS:")) { section = 100; } else if (line.startsWith("####")) { return m; } else if (line.startsWith("#")) { continue; } switch (section) { case 100: // ignore break; case 101: // header section = 100; data = line.substring(";; ->>HEADER<<- ".length()).split(","); m.getHeader().setRcode(Rcode.value(data[1].split(":\\s*")[1])); m.getHeader().setID(Integer.parseInt(data[2].split(":\\s*")[1])); break; case 102: // question line = r.readLine(); data = line.split(","); Record q = Record.newRecord( Name.fromString(data[0].replaceAll(";;\\s*", "")), Type.value(data[1].split("\\s*=\\s*")[1]), DClass.value(data[2].split("\\s*=\\s*")[1])); m.addRecord(q, Section.QUESTION); section = 100; break; default: if (line != null && !"".equals(line)) { Master ma = new Master(new ByteArrayInputStream(line.getBytes())); Record record = ma.nextRecord(); if (record != null) { m.addRecord(record, section); } } } } r.close(); return m; } }