peerconn.go | 8 +++++++- diff --git a/peerconn.go b/peerconn.go index 27d34ee55b7545f419ebe901b216487ed23328c1..289b2fdf4e102c82ebfb41302c6c79f22b40c570 100644 --- a/peerconn.go +++ b/peerconn.go @@ -648,7 +648,9 @@ if me.cancelledRequests.Contains(r) { // Already cancelled and waiting for a response. return true } - if me.fastEnabled() { + // Transmission does not send rejects for received cancels. See + // https://github.com/transmission/transmission/pull/2275. + if me.fastEnabled() && !me.remoteIsTransmission() { me.cancelledRequests.Add(r) } else { if !me.deleteRequest(r) { @@ -1688,3 +1690,7 @@ func (pc *PeerConn) isLowOnRequests() bool { return pc.actualRequestState.Requests.IsEmpty() } + +func (pc *PeerConn) remoteIsTransmission() bool { + return bytes.HasPrefix(pc.PeerID[:], []byte("-TR")) && pc.PeerID[7] == '-' +}