webseed-peer.go | 25 +++++++------------------ diff --git a/webseed-peer.go b/webseed-peer.go index f15ecf6692f82f9da0b8193b1240ed9e97b42acc..0b877738108a3e697134ddea3af24a58267c4abc 100644 --- a/webseed-peer.go +++ b/webseed-peer.go @@ -4,8 +4,6 @@ import ( "context" "errors" "fmt" - "net/http" - "strings" "sync" "github.com/RoaringBitmap/roaring" @@ -118,6 +116,7 @@ } func (ws *webseedPeer) onClose() { ws.peer.logger.WithLevel(log.Debug).Print("closing") + ws.peer.deleteAllRequests() for _, r := range ws.activeRequests { r.Cancel() } @@ -134,25 +133,15 @@ ws.peer.readBytes(int64(len(result.Bytes))) ws.peer.t.cl.lock() defer ws.peer.t.cl.unlock() if result.Err != nil { - if !errors.Is(result.Err, context.Canceled) { + if !errors.Is(result.Err, context.Canceled) && !ws.peer.closed.IsSet() { ws.peer.logger.Printf("Request %v rejected: %v", r, result.Err) - } - // We need to filter out temporary errors, but this is a nightmare in Go. Currently a bad - // webseed URL can starve out the good ones due to the chunk selection algorithm. - const closeOnAllErrors = false - if closeOnAllErrors || - strings.Contains(result.Err.Error(), "unsupported protocol scheme") || - func() bool { - var err webseed.ErrBadResponse - if !errors.As(result.Err, &err) { - return false - } - return err.Response.StatusCode == http.StatusNotFound - }() { + // cfg := spew.NewDefaultConfig() + // cfg.DisableMethods = true + // cfg.Dump(result.Err) + log.Printf("closing %v", ws) ws.peer.close() - } else { - ws.peer.remoteRejectedRequest(ws.peer.t.requestIndexFromRequest(r)) } + ws.peer.remoteRejectedRequest(ws.peer.t.requestIndexFromRequest(r)) } else { err := ws.peer.receiveChunk(&pp.Message{ Type: pp.Piece,