diff --git a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java index 53247a699..a711d9a05 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java @@ -42,7 +42,7 @@ abstract class ExtensionHandler { * @param dht advertise DHT capability * @return bencoded outgoing handshake message */ - public static byte[] getHandshake(int metasize, boolean pexAndMetadata, boolean dht) { + public static byte[] getHandshake(int metasize, boolean pexAndMetadata, boolean dht, boolean uploadOnly) { Map handshake = new HashMap(); Map m = new HashMap(); if (pexAndMetadata) { @@ -59,6 +59,9 @@ abstract class ExtensionHandler { handshake.put("p", Integer.valueOf(TrackerClient.PORT)); handshake.put("v", "I2PSnark"); handshake.put("reqq", Integer.valueOf(5)); + // BEP 21 + if (uploadOnly) + handshake.put("upload_only", Integer.valueOf(1)); return BEncoder.bencode(handshake); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index fbbb1859a..68258022e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -217,9 +217,11 @@ public class Peer implements Comparable * * If the given BitField is non-null it is send to the peer as first * message. + * + * @param uploadOnly if we are complete with skipped files, i.e. a partial seed */ - public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, MagnetState mState) - { + public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, + MagnetState mState, boolean uploadOnly) { if (state != null) throw new IllegalStateException("Peer already started"); @@ -275,17 +277,9 @@ public class Peer implements Comparable int metasize = metainfo != null ? metainfo.getInfoBytes().length : -1; boolean pexAndMetadata = metainfo == null || !metainfo.isPrivate(); boolean dht = util.getDHT() != null; - out.sendExtension(0, ExtensionHandler.getHandshake(metasize, pexAndMetadata, dht)); + out.sendExtension(0, ExtensionHandler.getHandshake(metasize, pexAndMetadata, dht, uploadOnly)); } - // Old DHT PORT message - //if ((options & OPTION_I2P_DHT) != 0 && util.getDHT() != null) { - // if (_log.shouldLog(Log.DEBUG)) - // _log.debug("Peer supports DHT, sending PORT message"); - // int port = util.getDHT().getPort(); - // out.sendPort(port); - //} - // Send our bitmap if (bitfield != null) s.out.sendBitfield(bitfield); diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 8daf8b030..afa718016 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -604,11 +604,13 @@ class PeerCoordinator implements PeerListener bitfield = storage.getBitField(); else bitfield = null; + // if we aren't a seed but we don't want any more + final boolean partialComplete = wantedBytes == 0 && bitfield != null && !bitfield.complete(); Runnable r = new Runnable() { public void run() { - peer.runConnection(_util, listener, bitfield, magnetState); + peer.runConnection(_util, listener, bitfield, magnetState, partialComplete); } }; String threadName = "Snark peer " + peer.toString();