public void HandshakeSupportsTest() { ExtendedHandshakeMessage m = new ExtendedHandshakeMessage(); byte[] encoded = m.Encode(); Assert.AreEqual(m.ByteLength, encoded.Length, "#1"); Assert.IsTrue(m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(PeerExchangeMessage.Support.Name); }), "#2"); Assert.IsTrue(m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(LTChat.Support.Name); }), "#3"); Assert.IsTrue(m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(LTMetadata.Support.Name); }), "#4"); }
public void HandshakeSupportsTest() { var m = new ExtendedHandshakeMessage(); var encoded = m.Encode(); Assert.Equal(m.ByteLength, encoded.Length); Assert.True( m.Supports.Exists( delegate(ExtensionSupport s) { return s.Name.Equals(PeerExchangeMessage.Support.Name); })); Assert.True(m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(LTChat.Support.Name); })); Assert.True( m.Supports.Exists(delegate(ExtensionSupport s) { return s.Name.Equals(LTMetadata.Support.Name); })); }
public void HandshakeDecodeTest() { ExtendedHandshakeMessage m = new ExtendedHandshakeMessage(); byte[] data = m.Encode(); ExtendedHandshakeMessage decoded = (ExtendedHandshakeMessage)PeerMessage.DecodeMessage(data, 0, data.Length, rig.Manager); Assert.AreEqual(m.ByteLength, data.Length); Assert.AreEqual(m.ByteLength, decoded.ByteLength, "#1"); Assert.AreEqual(m.LocalPort, decoded.LocalPort, "#2"); Assert.AreEqual(m.MaxRequests, decoded.MaxRequests, "#3"); Assert.AreEqual(m.Version, decoded.Version, "#4"); Assert.AreEqual(m.Supports.Count, decoded.Supports.Count, "#5"); m.Supports.ForEach(delegate(ExtensionSupport s) { Assert.IsTrue(decoded.Supports.Contains(s), "#6:" + s.ToString()); }); }
public void HandshakeDecodeTest() { var m = new ExtendedHandshakeMessage(); var data = m.Encode(); var decoded = (ExtendedHandshakeMessage) PeerMessage.DecodeMessage(data, 0, data.Length, rig.Manager); Assert.Equal(m.ByteLength, data.Length); Assert.Equal(m.ByteLength, decoded.ByteLength); Assert.Equal(m.LocalPort, decoded.LocalPort); Assert.Equal(m.MaxRequests, decoded.MaxRequests); Assert.Equal(m.Version, decoded.Version); Assert.Equal(m.Supports.Count, decoded.Supports.Count); m.Supports.ForEach( delegate(ExtensionSupport s) { Assert.True(decoded.Supports.Contains(s), "#6:" + s); }); }
public void SendMetadataCore(string expectedPath) { var connection = pair.Incoming; // 1) Send local handshake. We've already received the remote handshake as part // of the Connect method. SendMessage( new HandshakeMessage(rig.Manager.InfoHash, new string('g', 20), VersionInfo.ProtocolStringV100, true, true), connection); var exHand = new ExtendedHandshakeMessage(rig.Torrent.Metadata.Length); exHand.Supports.Add(LTMetadata.Support); SendMessage(exHand, connection); // 2) Receive the metadata requests from the other peer and fulfill them var buffer = rig.Torrent.Metadata; var length = (buffer.Length + 16383)/16384; PeerMessage m; while (length > 0 && (m = ReceiveMessage(connection)) != null) { var metadata = m as LTMetadata; if (metadata != null) { if (metadata.MetadataMessageType == LTMetadata.eMessageType.Request) { metadata = new LTMetadata(LTMetadata.Support.MessageId, LTMetadata.eMessageType.Data, metadata.Piece, buffer); SendMessage(metadata, connection); length--; } } } // We've sent all the pieces. Now we just wait for the torrentmanager to process them all. while (rig.Manager.Mode is MetadataMode) Thread.Sleep(10); Assert.True(File.Exists(expectedPath)); var torrent = Torrent.Load(expectedPath); Assert.Equal(rig.Manager.InfoHash, torrent.InfoHash); }
public void RequestMetadata() { Setup(false, "path.torrent"); CustomConnection connection = pair.Incoming; // 1) Send local handshake. We've already received the remote handshake as part // of the Connect method. SendMessage(new HandshakeMessage(rig.Manager.Torrent.infoHash, new string('g', 20), VersionInfo.ProtocolStringV100, true, true), connection); ExtendedHandshakeMessage exHand = new ExtendedHandshakeMessage(rig.TorrentDict.LengthInBytes()); exHand.Supports.Add(LTMetadata.Support); SendMessage(exHand, connection); // 2) Send all our metadata requests int length = (rig.TorrentDict.LengthInBytes() + 16383) / 16384; for (int i = 0; i < length; i++) SendMessage(new LTMetadata(LTMetadata.Support.MessageId, LTMetadata.eMessageType.Request, i, null), connection); // 3) Receive all the metadata chunks PeerMessage m; var stream = new MemoryStream(); while (length > 0 && (m = ReceiveMessage(connection)) != null) { LTMetadata metadata = m as LTMetadata; if (metadata != null) { if (metadata.MetadataMessageType == LTMetadata.eMessageType.Data) { stream.Write(metadata.MetadataPiece, 0, metadata.MetadataPiece.Length); length--; } } } // 4) Verify the hash is the same. stream.Position = 0; Assert.AreEqual(rig.Torrent.InfoHash, new InfoHash(new SHA1Managed().ComputeHash(stream)), "#1"); }
protected virtual void HandleExtendedHandshakeMessage(PeerId id, ExtendedHandshakeMessage message) { // FIXME: Use the 'version' information // FIXME: Recreate the uri? Give warning? if (message.LocalPort > 0) id.Peer.LocalPort = message.LocalPort; id.MaxSupportedPendingRequests = Math.Max(1, message.MaxRequests); id.ExtensionSupports = message.Supports; if (id.ExtensionSupports.Supports(PeerExchangeMessage.Support.Name)) { if (manager.HasMetadata && !manager.Torrent.IsPrivate) id.PeerExchangeManager = new PeerExchangeManager(id); } }
protected override void HandleExtendedHandshakeMessage(PeerId id, ExtendedHandshakeMessage message) { base.HandleExtendedHandshakeMessage(id, message); if (id.ExtensionSupports.Supports(LTMetadata.Support.Name)) { stream = new MemoryStream(new byte[message.MetadataSize], 0, message.MetadataSize, true, true); int size = message.MetadataSize % LTMetadata.BlockSize; if (size > 0) size = 1; size += message.MetadataSize / LTMetadata.BlockSize; bitField = new BitField(size); RequestNextNeededPiece(id); } }