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)); }
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)); } }
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) { }