From 70ce33cab3caf8a53688c7b31b646393de567b70 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Mon, 15 Jan 2024 12:43:55 +1100 Subject: [PATCH] Expect cancel acknowledgement from Transmission v4 clients --- peer.go | 1 + peerconn.go | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/peer.go b/peer.go index 7d524b7f..c4b4fb9e 100644 --- a/peer.go +++ b/peer.go @@ -465,6 +465,7 @@ func (me *Peer) cancel(r RequestIndex) { panic("request not existing should have been guarded") } if me._cancel(r) { + // Record that we expect to get a cancel ack. if !me.requestState.Cancelled.CheckedAdd(r) { panic("request already cancelled") } diff --git a/peerconn.go b/peerconn.go index e2d944ff..7a1639f2 100644 --- a/peerconn.go +++ b/peerconn.go @@ -297,9 +297,23 @@ func (me *PeerConn) _request(r Request) bool { func (me *PeerConn) _cancel(r RequestIndex) bool { me.write(makeCancelMessage(me.t.requestIndexToRequest(r))) - // Transmission does not send rejects for received cancels. See - // https://github.com/transmission/transmission/pull/2275. - return me.fastEnabled() && !me.remoteIsTransmission() + return me.remoteRejectsCancels() +} + +// Whether we should expect a reject message after sending a cancel. +func (me *PeerConn) remoteRejectsCancels() bool { + if !me.fastEnabled() { + return false + } + if me.remoteIsTransmission() { + // Transmission did not send rejects for received cancels. See + // https://github.com/transmission/transmission/pull/2275. Fixed in 4.0.0-beta.1 onward in + // https://github.com/transmission/transmission/commit/76719bf34c255da4fca991c2ad3fa4b65d2154b1. + // Peer ID prefix scheme described + // https://github.com/transmission/transmission/blob/7ec7607bbcf0fa99bd4b157b9b0f0c411d59f45d/CMakeLists.txt#L128-L149. + return me.PeerID[3] >= '4' + } + return true } func (cn *PeerConn) fillWriteBuffer() { -- 2.48.1