Skip to content

Commit a685cb8

Browse files
committed
Servers should obey the numWant parameter (fix webtorrent#21)
1 parent cdc2c5d commit a685cb8

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

server.js

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ var parallel = require('run-parallel')
1212
var querystring = require('querystring')
1313
var string2compact = require('string2compact')
1414

15+
var NUM_ANNOUNCE_PEERS = 50
16+
var MAX_ANNOUNCE_PEERS = 82
1517
var REMOVE_IPV6_RE = /^::ffff:/
1618

1719
inherits(Server, EventEmitter)
@@ -141,6 +143,11 @@ Server.prototype._onHttpRequest = function (req, res) {
141143
var swarm = self._getSwarm(infoHash)
142144
var peer = swarm.peers[addr]
143145

146+
var numWant = Math.min(
147+
Number(params.numwant) || NUM_ANNOUNCE_PEERS,
148+
MAX_ANNOUNCE_PEERS
149+
)
150+
144151
switch (params.event) {
145152
case 'started':
146153
if (peer) {
@@ -210,8 +217,8 @@ Server.prototype._onHttpRequest = function (req, res) {
210217

211218
// send peers
212219
var peers = Number(params.compact) === 1
213-
? self._getPeersCompact(swarm)
214-
: self._getPeers(swarm)
220+
? self._getPeersCompact(swarm, numWant)
221+
: self._getPeers(swarm, numWant)
215222

216223
var response = {
217224
complete: swarm.complete,
@@ -329,6 +336,10 @@ Server.prototype._onUdpRequest = function (msg, rinfo) {
329336
var swarm = self._getSwarm(infoHash)
330337
var peer = swarm.peers[addr]
331338

339+
// never send more than MAX_ANNOUNCE_PEERS or else the UDP packet will get bigger than
340+
// 512 bytes which is not safe
341+
numWant = Math.min(numWant || NUM_ANNOUNCE_PEERS, MAX_ANNOUNCE_PEERS)
342+
332343
switch (event) {
333344
case common.EVENTS.started:
334345
if (peer) {
@@ -394,12 +405,7 @@ Server.prototype._onUdpRequest = function (msg, rinfo) {
394405
}
395406

396407
// send peers
397-
var peers = self._getPeersCompact(swarm)
398-
399-
// never send more than 70 peers or else the UDP packet will get too big
400-
if (peers.length >= 70 * 6) {
401-
peers = peers.slice(0, 70 * 6)
402-
}
408+
var peers = self._getPeersCompact(swarm, numWant)
403409

404410
send(Buffer.concat([
405411
common.toUInt32(common.ACTIONS.ANNOUNCE),
@@ -445,32 +451,34 @@ Server.prototype._onUdpRequest = function (msg, rinfo) {
445451
}
446452
}
447453

448-
Server.prototype._getPeers = function (swarm) {
454+
Server.prototype._getPeers = function (swarm, numWant) {
449455
var self = this
450456
var peers = []
451457
for (var peerId in swarm.peers) {
452458
var peer = swarm.peers[peerId]
459+
if (!peer) continue // ignore null values
453460
peers.push({
454461
'peer id': peer.peerId,
455462
ip: peer.ip,
456463
port: peer.port
457464
})
465+
if (peers.length === numWant) break
458466
}
459467
return peers
460468
}
461469

462-
Server.prototype._getPeersCompact = function (swarm) {
470+
Server.prototype._getPeersCompact = function (swarm, numWant) {
463471
var self = this
464-
var addrs = []
472+
var peers = []
465473

466-
Object.keys(swarm.peers).forEach(function (peerId) {
474+
for (var peerId in swarm.peers) {
467475
var peer = swarm.peers[peerId]
468-
if (peer) {
469-
addrs.push(peer.ip + ':' + peer.port)
470-
}
471-
})
476+
if (!peer) continue // ignore null values
477+
peers.push(peer.ip + ':' + peer.port)
478+
if (peers.length === numWant) break
479+
}
472480

473-
return string2compact(addrs)
481+
return string2compact(peers)
474482
}
475483

476484
// HELPER FUNCTIONS

0 commit comments

Comments
 (0)