torrent.go | 2 +- web_seed.go | 101 ----------------------------------------------------- webseed-peer.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/torrent.go b/torrent.go index 749a5dae7d48d0238a45e7c5219958c385cb54b4..322ee230f54d5db33e141e40a412b128b8ca8246 100644 --- a/torrent.go +++ b/torrent.go @@ -2033,7 +2033,7 @@ if _, ok := t.webSeeds[url]; ok { return } const maxRequests = 10 - ws := webSeed{ + ws := webseedPeer{ peer: peer{ t: t, connString: url, diff --git a/web_seed.go b/web_seed.go deleted file mode 100644 index c2bb78e1bddb1a0285d59ee8a39ed147fd4b9224..0000000000000000000000000000000000000000 --- a/web_seed.go +++ /dev/null @@ -1,101 +0,0 @@ -package torrent - -import ( - "fmt" - "net/http" - - "github.com/anacrolix/torrent/common" - "github.com/anacrolix/torrent/metainfo" - pp "github.com/anacrolix/torrent/peer_protocol" - "github.com/anacrolix/torrent/segments" - "github.com/anacrolix/torrent/webseed" -) - -type httpRequestResult struct { - resp *http.Response - err error -} - -type requestPart struct { - req *http.Request - e segments.Extent - result chan httpRequestResult -} - -type webseedRequest struct { - cancel func() -} - -type webSeed struct { - client webseed.Client - requests map[request]webseed.Request - peer peer -} - -var _ peerImpl = (*webSeed)(nil) - -func (ws *webSeed) String() string { - return fmt.Sprintf("webseed peer for %q", ws.client.Url) -} - -func (ws *webSeed) onGotInfo(info *metainfo.Info) { - ws.client.FileIndex = segments.NewIndex(common.LengthIterFromUpvertedFiles(info.UpvertedFiles())) - ws.client.Info = info -} - -func (ws *webSeed) _postCancel(r request) { - ws.cancel(r) -} - -func (ws *webSeed) writeInterested(interested bool) bool { - return true -} - -func (ws *webSeed) cancel(r request) bool { - ws.requests[r].Cancel() - return true -} - -func (ws *webSeed) intoSpec(r request) webseed.RequestSpec { - return webseed.RequestSpec{ws.peer.t.requestOffset(r), int64(r.Length)} -} - -func (ws *webSeed) request(r request) bool { - webseedRequest := ws.client.NewRequest(ws.intoSpec(r)) - ws.requests[r] = webseedRequest - go ws.requestResultHandler(r, webseedRequest) - return true -} - -func (ws *webSeed) connectionFlags() string { - return "WS" -} - -func (ws *webSeed) drop() { -} - -func (ws *webSeed) updateRequests() { - ws.peer.doRequestState() -} - -func (ws *webSeed) _close() {} - -func (ws *webSeed) requestResultHandler(r request, webseedRequest webseed.Request) { - result := <-webseedRequest.Result - ws.peer.t.cl.lock() - defer ws.peer.t.cl.unlock() - if result.Err != nil { - ws.peer.logger.Printf("request %v rejected: %v", r, 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) - } - } -} diff --git a/webseed-peer.go b/webseed-peer.go new file mode 100644 index 0000000000000000000000000000000000000000..3511635ab9cdd2ed46d2d0aa03b1ecfa4b36bebf --- /dev/null +++ b/webseed-peer.go @@ -0,0 +1,85 @@ +package torrent + +import ( + "fmt" + + "github.com/anacrolix/torrent/common" + "github.com/anacrolix/torrent/metainfo" + pp "github.com/anacrolix/torrent/peer_protocol" + "github.com/anacrolix/torrent/segments" + "github.com/anacrolix/torrent/webseed" +) + +type webseedPeer struct { + client webseed.Client + requests map[request]webseed.Request + peer peer +} + +var _ peerImpl = (*webseedPeer)(nil) + +func (ws *webseedPeer) String() string { + return fmt.Sprintf("webseed peer for %q", ws.client.Url) +} + +func (ws *webseedPeer) onGotInfo(info *metainfo.Info) { + ws.client.FileIndex = segments.NewIndex(common.LengthIterFromUpvertedFiles(info.UpvertedFiles())) + ws.client.Info = info +} + +func (ws *webseedPeer) _postCancel(r request) { + ws.cancel(r) +} + +func (ws *webseedPeer) writeInterested(interested bool) bool { + return true +} + +func (ws *webseedPeer) cancel(r request) bool { + ws.requests[r].Cancel() + return true +} + +func (ws *webseedPeer) intoSpec(r request) webseed.RequestSpec { + return webseed.RequestSpec{ws.peer.t.requestOffset(r), int64(r.Length)} +} + +func (ws *webseedPeer) request(r request) bool { + webseedRequest := ws.client.NewRequest(ws.intoSpec(r)) + ws.requests[r] = webseedRequest + go ws.requestResultHandler(r, webseedRequest) + return true +} + +func (ws *webseedPeer) connectionFlags() string { + return "WS" +} + +// TODO: This is called when banning peers. Perhaps we want to be able to ban webseeds too. +func (ws *webseedPeer) drop() {} + +func (ws *webseedPeer) updateRequests() { + ws.peer.doRequestState() +} + +func (ws *webseedPeer) _close() {} + +func (ws *webseedPeer) requestResultHandler(r request, webseedRequest webseed.Request) { + result := <-webseedRequest.Result + ws.peer.t.cl.lock() + defer ws.peer.t.cl.unlock() + if result.Err != nil { + ws.peer.logger.Printf("request %v rejected: %v", r, 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) + } + } +}