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)
}
}
+func (c *peer) remoteRejectedRequest(r request) {
+ c.deleteRequest(r)
+ c.decExpectedChunkReceive(r)
+}
+
func (c *peer) decExpectedChunkReceive(r request) {
count := c.validReceiveChunks[r]
if count == 1 {
import (
"net/http"
+ "github.com/anacrolix/log"
"github.com/anacrolix/torrent/common"
"github.com/anacrolix/torrent/metainfo"
pp "github.com/anacrolix/torrent/peer_protocol"
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)
+ }
}
}