7 "github.com/anacrolix/torrent/smartban"
10 type banPrefix = string
12 type smartBanCache = smartban.Cache[banPrefix, RequestIndex, [sha1.Size]byte]
14 type blockCheckingWriter struct {
16 requestIndex RequestIndex
17 // Peers that didn't match blocks written now.
18 badPeers map[banPrefix]struct{}
19 blockBuffer bytes.Buffer
23 func (me *blockCheckingWriter) checkBlock() {
24 b := me.blockBuffer.Next(me.chunkSize)
25 for _, peer := range me.cache.CheckBlock(me.requestIndex, b) {
26 me.badPeers[peer] = struct{}{}
31 func (me *blockCheckingWriter) checkFullBlocks() {
32 for me.blockBuffer.Len() >= me.chunkSize {
37 func (me *blockCheckingWriter) Write(b []byte) (int, error) {
38 n, err := me.blockBuffer.Write(b)
40 // bytes.Buffer.Write should never fail.
47 // Check any remaining block data. Terminal pieces or piece sizes that don't divide into the chunk
48 // size cleanly may leave fragments that should be checked.
49 func (me *blockCheckingWriter) Flush() {
50 for me.blockBuffer.Len() != 0 {