Fix returning more than the requested number of peers, and don't return

a user's peers to themselves
This commit is contained in:
Justin Li 2013-12-05 20:37:19 -05:00
parent 4406eab97a
commit 181f241f79

View file

@ -201,11 +201,11 @@ func (s Server) serveAnnounce(w http.ResponseWriter, r *http.Request) {
if left > 0 { if left > 0 {
// If they're seeding, give them only leechers // If they're seeding, give them only leechers
writeLeechers(w, torrent, count, numWant, compact) count += writeLeechers(w, user, torrent, numWant, compact)
} else { } else {
// If they're leeching, prioritize giving them seeders // If they're leeching, prioritize giving them seeders
writeSeeders(w, torrent, count, numWant, compact) count += writeSeeders(w, user, torrent, numWant, compact)
writeLeechers(w, torrent, count, numWant, compact) count += writeLeechers(w, user, torrent, numWant - count, compact)
} }
if compact && peerCount != count { if compact && peerCount != count {
@ -289,44 +289,54 @@ func minInt(a, b int) int {
return b return b
} }
func writeSeeders(w http.ResponseWriter, t *storage.Torrent, count, numWant int, compact bool) { func writeSeeders(w http.ResponseWriter, user *storage.User, t *storage.Torrent, numWant int, compact bool) int {
for _, seed := range t.Seeders { count := 0
for _, peer := range t.Seeders {
if count >= numWant { if count >= numWant {
break break
} }
if peer.UserID == user.ID {
continue
}
if compact { if compact {
// TODO writeBencoded(w, compactAddr) // TODO writeBencoded(w, compactAddr)
} else { } else {
writeBencoded(w, "d") writeBencoded(w, "d")
writeBencoded(w, "ip") writeBencoded(w, "ip")
writeBencoded(w, seed.IP) writeBencoded(w, peer.IP)
writeBencoded(w, "peer id") writeBencoded(w, "peer id")
writeBencoded(w, seed.ID) writeBencoded(w, peer.ID)
writeBencoded(w, "port") writeBencoded(w, "port")
writeBencoded(w, seed.Port) writeBencoded(w, peer.Port)
writeBencoded(w, "e") writeBencoded(w, "e")
} }
count++ count++
} }
return count
} }
func writeLeechers(w http.ResponseWriter, t *storage.Torrent, count, numWant int, compact bool) { func writeLeechers(w http.ResponseWriter, user *storage.User, t *storage.Torrent, numWant int, compact bool) int {
for _, leech := range t.Leechers { count := 0
for _, peer := range t.Leechers {
if count >= numWant { if count >= numWant {
break break
} }
if peer.UserID == user.ID {
continue
}
if compact { if compact {
// TODO writeBencoded(w, compactAddr) // TODO writeBencoded(w, compactAddr)
} else { } else {
writeBencoded(w, "d") writeBencoded(w, "d")
writeBencoded(w, "ip") writeBencoded(w, "ip")
writeBencoded(w, leech.IP) writeBencoded(w, peer.IP)
writeBencoded(w, "peer id") writeBencoded(w, "peer id")
writeBencoded(w, leech.ID) writeBencoded(w, peer.ID)
writeBencoded(w, "port") writeBencoded(w, "port")
writeBencoded(w, leech.Port) writeBencoded(w, peer.Port)
writeBencoded(w, "e") writeBencoded(w, "e")
} }
count++ count++
} }
return count
} }