diff --git a/lib/torrent.js b/lib/torrent.js index 0ed1fa55..1daff14d 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -1063,6 +1063,8 @@ Torrent.prototype._request = function (wire, index, hotswap) { var self = this var numRequests = wire.requests.length + var webPeer = wire.remotePort === 80 || wire.remotePort === 443 + if (self.bitfield.get(index)) return false var maxOutstandingRequests = getPipelineLength(wire, PIPELINE_MAX_DURATION) @@ -1070,10 +1072,10 @@ Torrent.prototype._request = function (wire, index, hotswap) { // var endGame = (wire.requests.length === 0 && self.store.numMissing < 30) var piece = self.pieces[index] - var reservation = piece.reserve() + var reservation = webPeer ? piece.reserveRemaining() : piece.reserve() if (reservation === -1 && hotswap && self._hotswap(wire, index)) { - reservation = piece.reserve() + reservation = webPeer ? piece.reserveRemaining() : piece.reserve() } if (reservation === -1) return false @@ -1084,7 +1086,7 @@ Torrent.prototype._request = function (wire, index, hotswap) { r[i] = wire var chunkOffset = piece.chunkOffset(reservation) - var chunkLength = piece.chunkLength(reservation) + var chunkLength = webPeer ? piece.chunkLengthRemaining(reservation) : piece.chunkLength(reservation) wire.request(index, chunkOffset, chunkLength, function onChunk (err, chunk) { // TODO: what is this for? @@ -1100,7 +1102,7 @@ Torrent.prototype._request = function (wire, index, hotswap) { index, chunkOffset, chunkLength, wire.remoteAddress + ':' + wire.remotePort, err.message ) - piece.cancel(reservation) + webPeer ? piece.cancelRemaining(reservation) : piece.cancel(reservation) onUpdateTick() return }