diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java index 4cb55541ff..517b103938 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java +++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java @@ -155,7 +155,7 @@ public class BEncoder out.write(bs); } - public static byte[] bencode(Map m) + public static byte[] bencode(Map m) { try { @@ -169,23 +169,29 @@ public class BEncoder } } - public static void bencode(Map m, OutputStream out) throws IOException + public static void bencode(Map m, OutputStream out) + throws IOException, IllegalArgumentException { out.write('d'); // Keys must be sorted. XXX - But is this the correct order? - Set s = m.keySet(); - List l = new ArrayList(s); + Set s = m.keySet(); + List l = new ArrayList(s.size()); + for (Object k : s) { + // Keys must be Strings. + if (String.class.isAssignableFrom(k.getClass())) + l.add((String) k); + else + throw new IllegalArgumentException("Cannot bencode map: contains non-String key of type " + k.getClass()); + } Collections.sort(l); Iterator it = l.iterator(); while(it.hasNext()) { - // Keys must be Strings. String key = it.next(); - Object value = m.get(key); bencode(key, out); - bencode(value, out); + bencode(m.get(key), out); } out.write('e');