private void CreateWebRequests(RequestMessage start, RequestMessage end)
        {
            // Properly handle the case where we have multiple files
            // This is only implemented for single file torrents
            Uri uri = Uri;

            if (Uri.OriginalString.EndsWith("/"))
                uri = new Uri(uri, Manager.Torrent.Name + "/");

            // startOffset and endOffset are *inclusive*. I need to subtract '1' from the end index so that i
            // stop at the correct byte when requesting the byte ranges from the server
            long startOffset = (long)start.PieceIndex * manager.Torrent.PieceLength + start.StartOffset;
            long endOffset = (long)end.PieceIndex * manager.Torrent.PieceLength + end.StartOffset + end.RequestLength;

            foreach (TorrentFile file in manager.Torrent.Files)
            {
                Uri u = uri;
                if (manager.Torrent.Files.Length > 1)
                    u = new Uri(u, file.Path);
                if (endOffset == 0)
                    break;

                // We want data from a later file
                if (startOffset >= file.Length)
                {
                    startOffset -= file.Length;
                    endOffset -= file.Length;
                }
                // We want data from the end of the current file and from the next few files
                else if (endOffset >= file.Length)
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(u);
                    AddRange(request, startOffset, file.Length - 1);
                    webRequests.Enqueue(new KeyValuePair<WebRequest, int>(request, (int)(file.Length - startOffset)));
                    startOffset = 0;
                    endOffset -= file.Length;
                }
                // All the data we want is from within this file
                else
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(u);
                    AddRange(request, startOffset, endOffset - 1);
                    webRequests.Enqueue(new KeyValuePair<WebRequest,int>(request, (int)(endOffset - startOffset)));
                    endOffset = 0;
                }
            }
        }
 protected override void HandleRequestMessage(PeerId id, RequestMessage message)
 {
     base.HandleRequestMessage(id, message);
     unchoker.SentBlock(id, message.PieceIndex);
 }
 public void RequestEncoding()
 {
     var length = new RequestMessage(5, 1024, 16384).Encode(buffer, offset);
     Assert.Equal("00-00-00-0D-06-00-00-00-05-00-00-04-00-00-00-40-00",
         BitConverter.ToString(buffer, offset, length));
 }
Beispiel #4
0
        protected virtual void HandleRequestMessage(PeerId id, RequestMessage message)
        {
            // If we are not on the last piece and the user requested a stupidly big/small amount of data
            // we will close the connection
            if (manager.Torrent.Pieces.Count != (message.PieceIndex + 1))
                if (message.RequestLength > RequestMessage.MaxSize || message.RequestLength < RequestMessage.MinSize)
                    throw new MessageException("Illegal piece request received. Peer requested " + message.RequestLength.ToString() + " byte");

            PieceMessage m = new PieceMessage(message.PieceIndex, message.StartOffset, message.RequestLength);

            // If we're not choking the peer, enqueue the message right away
            if (!id.AmChoking)
            {
                id.IsRequestingPiecesCount++;
                id.PieceReads.Add(m);
                id.TryProcessAsyncReads();
            }

            // If the peer supports fast peer and the requested piece is one of the allowed pieces, enqueue it
            // otherwise send back a reject request message
            else if (id.SupportsFastPeer && ClientEngine.SupportsFastPeer)
            {
                if (id.AmAllowedFastPieces.Contains(message.PieceIndex))
                {
                    id.IsRequestingPiecesCount++;
                    id.PieceReads.Add(m);
                    id.TryProcessAsyncReads();
                }
                else
                    id.Enqueue(new RejectRequestMessage(m));
            }
        }
Beispiel #5
0
 public HttpRequestData(RequestMessage request)
 {
     Request = request;
     PieceMessage m = new PieceMessage(null, request.PieceIndex, request.StartOffset, request.RequestLength);
     TotalToReceive = m.ByteLength;
 }
 public RejectRequestMessage(RequestMessage message)
     : this(message.PieceIndex, message.StartOffset, message.RequestLength)
 {
 }