[tor-commits] [metrics-lib/master] Detect relay descriptor type from first lines.
karsten at torproject.org
karsten at torproject.org
Sun Jan 8 20:12:48 UTC 2012
commit ee1976649c74cb408dd7d6d334acc95e4e71c417
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date: Sun Jan 8 16:55:56 2012 +0100
Detect relay descriptor type from first lines.
---
.../torproject/descriptor/impl/DescriptorImpl.java | 37 ++++++++++++++++++++
.../descriptor/impl/RelayDescriptorReaderImpl.java | 26 +-------------
2 files changed, 38 insertions(+), 25 deletions(-)
diff --git a/src/org/torproject/descriptor/impl/DescriptorImpl.java b/src/org/torproject/descriptor/impl/DescriptorImpl.java
index 8165d69..cade4cf 100644
--- a/src/org/torproject/descriptor/impl/DescriptorImpl.java
+++ b/src/org/torproject/descriptor/impl/DescriptorImpl.java
@@ -14,6 +14,43 @@ import org.torproject.descriptor.Descriptor;
public abstract class DescriptorImpl implements Descriptor {
+ protected static List<Descriptor> parseRelayDescriptors(
+ byte[] rawDescriptorBytes) throws DescriptorParseException {
+ List<Descriptor> parsedDescriptors = new ArrayList<Descriptor>();
+ byte[] first100Chars = new byte[Math.min(100,
+ rawDescriptorBytes.length)];
+ System.arraycopy(rawDescriptorBytes, 0, first100Chars, 0,
+ first100Chars.length);
+ String firstLines = new String(first100Chars);
+ if (firstLines.startsWith("network-status-version 3\n") ||
+ firstLines.contains("\nnetwork-status-version 3\n")) {
+ if (firstLines.contains("\nvote-status consensus\n")) {
+ parsedDescriptors.addAll(RelayNetworkStatusConsensusImpl.
+ parseConsensuses(rawDescriptorBytes));
+ } else if (firstLines.contains("\nvote-status consensus\n")) {
+ parsedDescriptors.addAll(RelayNetworkStatusVoteImpl.
+ parseVotes(rawDescriptorBytes));
+ } else {
+ throw new DescriptorParseException("Could not detect relay "
+ + "network status type in descriptor starting with '"
+ + firstLines + "'.");
+ }
+ } else if (firstLines.startsWith("router ") ||
+ firstLines.contains("\nrouter ")) {
+ parsedDescriptors.addAll(RelayServerDescriptorImpl.
+ parseDescriptors(rawDescriptorBytes));
+ } else if (firstLines.startsWith("extra-info ") ||
+ firstLines.contains("\nextra-info ")) {
+ parsedDescriptors.addAll(RelayExtraInfoDescriptorImpl.
+ parseDescriptors(rawDescriptorBytes));
+ } else {
+ throw new DescriptorParseException("Could not detect relay "
+ + "descriptor type in descriptor starting with '" + firstLines
+ + "'.");
+ }
+ return parsedDescriptors;
+ }
+
protected static List<byte[]> splitRawDescriptorBytes(
byte[] rawDescriptorBytes, String startToken) {
List<byte[]> rawDescriptors = new ArrayList<byte[]>();
diff --git a/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java b/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
index f0efbb3..b0e2b81 100644
--- a/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayDescriptorReaderImpl.java
@@ -110,31 +110,7 @@ public class RelayDescriptorReaderImpl implements RelayDescriptorReader {
}
bis.close();
byte[] rawDescriptorBytes = baos.toByteArray();
- /* TODO This consensus/vote detection is a hack. */
- boolean isConsensus = false;
- if (file.getName().contains("consensus")) {
- isConsensus = true;
- } else if (file.getName().contains("vote")) {
- } else {
- throw new RuntimeException("Unknown descriptor type in '"
- + file.getAbsolutePath() + ".");
- }
- return this.parseDescriptors(rawDescriptorBytes, isConsensus);
- }
- private List<Descriptor> parseDescriptors(byte[] rawDescriptorBytes,
- boolean isConsensus) throws DescriptorParseException {
- List<Descriptor> parsedDescriptors = new ArrayList<Descriptor>();
- if (isConsensus) {
- List<RelayNetworkStatusConsensus> parsedConsensuses =
- RelayNetworkStatusConsensusImpl.parseConsensuses(
- rawDescriptorBytes);
- parsedDescriptors.addAll(parsedConsensuses);
- } else {
- List<RelayNetworkStatusVote> parsedVotes =
- RelayNetworkStatusVoteImpl.parseVotes(rawDescriptorBytes);
- parsedDescriptors.addAll(parsedVotes);
- }
- return parsedDescriptors;
+ return DescriptorImpl.parseRelayDescriptors(rawDescriptorBytes);
}
}
}
More information about the tor-commits
mailing list