diff --git a/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java b/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java index 145d8224df..3597c436fa 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java @@ -49,7 +49,7 @@ class MagnetState { infohash = iHash; if (meta != null) { metainfo = meta; - initialize(meta.getInfoBytes().length); + initialize(meta.getInfoBytesLength()); complete = true; } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java index f4aeb21f4f..434c794bdb 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java @@ -68,6 +68,7 @@ public class MetaInfo private final String created_by; private final long creation_date; private Map infoMap; + private int infoBytesLength; /** * Called by Storage when creating a new torrent from local data @@ -622,11 +623,27 @@ public class MetaInfo return BEncoder.bencode(m); } - /** @since 0.8.4 */ + /** + * Side effect: Caches infoBytesLength. + * @since 0.8.4 + */ public synchronized byte[] getInfoBytes() { if (infoMap == null) createInfoMap(); - return BEncoder.bencode(infoMap); + byte[] rv = BEncoder.bencode(infoMap); + infoBytesLength = rv.length; + return rv; + } + + /** + * The size of getInfoBytes(). + * Cached. + * @since 0.9.48 + */ + public synchronized int getInfoBytesLength() { + if (infoBytesLength > 0) + return infoBytesLength; + return getInfoBytes().length; } /** @return an unmodifiable view of the Map */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index ba633cb18f..b8c0763657 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -290,7 +290,7 @@ public class Peer implements Comparable if ((options & OPTION_EXTENSION) != 0) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Peer supports extensions, sending reply message"); - int metasize = metainfo != null ? metainfo.getInfoBytes().length : -1; + int metasize = metainfo != null ? metainfo.getInfoBytesLength() : -1; boolean pexAndMetadata = metainfo == null || !metainfo.isPrivate(); boolean dht = util.getDHT() != null; boolean comment = util.utCommentsEnabled();