peerconn.go | 8 ++++++-- web_seed.go | 26 ++++++++++++++++---------- diff --git a/peerconn.go b/peerconn.go index af98660fa9fa8a875a61e4624ea7fd29112283e7..4afdd8c21d2eaa968eae34a13ca66554b9a31b79 100644 --- a/peerconn.go +++ b/peerconn.go @@ -1152,8 +1152,7 @@ err = c.onPeerSentHaveAll() case pp.HaveNone: err = c.peerSentHaveNone() case pp.Reject: - c.deleteRequest(newRequestFromMessage(&msg)) - c.decExpectedChunkReceive(newRequestFromMessage(&msg)) + c.remoteRejectedRequest(newRequestFromMessage(&msg)) case pp.AllowedFast: torrent.Add("allowed fasts received", 1) log.Fmsg("peer allowed fast: %d", msg.Index).AddValues(c).SetLevel(log.Debug).Log(c.t.logger) @@ -1168,6 +1167,11 @@ if err != nil { return err } } +} + +func (c *peer) remoteRejectedRequest(r request) { + c.deleteRequest(r) + c.decExpectedChunkReceive(r) } func (c *peer) decExpectedChunkReceive(r request) { diff --git a/web_seed.go b/web_seed.go index 3163ac4dc94927d0d60e9cdb15ac0c09dd9ba5c4..297a817ff88fc96b86bff518098c104262dd6e9f 100644 --- a/web_seed.go +++ b/web_seed.go @@ -3,6 +3,7 @@ import ( "net/http" + "github.com/anacrolix/log" "github.com/anacrolix/torrent/common" "github.com/anacrolix/torrent/metainfo" pp "github.com/anacrolix/torrent/peer_protocol" @@ -76,16 +77,21 @@ func (ws *webSeed) Close() {} func (ws *webSeed) requestResultHandler(r request, webseedRequest webseed.Request) { - webseedRequestResult := <-webseedRequest.Result + result := <-webseedRequest.Result ws.peer.t.cl.lock() - err := ws.peer.receiveChunk(&pp.Message{ - Type: pp.Piece, - Index: r.Index, - Begin: r.Begin, - Piece: webseedRequestResult.Bytes, - }) - ws.peer.t.cl.unlock() - if err != nil { - panic(err) + defer ws.peer.t.cl.unlock() + if result.Err != nil { + log.Printf("webseed request rejected: %v", result.Err) + ws.peer.remoteRejectedRequest(r) + } else { + err := ws.peer.receiveChunk(&pp.Message{ + Type: pp.Piece, + Index: r.Index, + Begin: r.Begin, + Piece: result.Bytes, + }) + if err != nil { + panic(err) + } } }