return nil
}
start := (1 << 14) * piece
+ c.logger.Printf("sending metadata piece %d", piece)
c.Post(t.newMetadataExtensionMessage(c, pp.DataMetadataExtensionMsgType, piece, t.metadataBytes[start:start+t.metadataPieceSize(piece)]))
return nil
case pp.RejectMetadataExtensionMsgType:
remoteAddr: remoteAddr,
network: network,
}
+ c.logger = cl.logger.WithValues(c,
+ log.Debug, // I want messages to default to debug, and can set it here as it's only used by new code
+ ).WithText(func(m log.Msg) string {
+ return fmt.Sprintf("%v: %s", c, m.Text())
+ })
c.writerCond.L = cl.locker()
c.setRW(connStatsReadWriter{nc, c})
c.r = &rateLimitedReader{
l: cl.config.DownloadRateLimiter,
r: c.r,
}
+ c.logger.Printf("initialized with remote %v over network %v (outgoing=%t)", remoteAddr, network, outgoing)
return
}
writeBuffer *bytes.Buffer
uploadTimer *time.Timer
writerCond sync.Cond
+
+ logger log.Logger
}
func (cn *connection) updateExpectingChunks() {
if index < len(cn.metadataRequests) && cn.metadataRequests[index] {
return
}
+ cn.logger.Printf("requesting metadata piece %d", index)
cn.Post(pp.Message{
Type: pp.Extended,
ExtendedID: eID,
case metadataExtendedId:
err := cl.gotMetadataExtensionMsg(payload, t, c)
if err != nil {
- return fmt.Errorf("error handling metadata extension message: %s", err)
+ return fmt.Errorf("handling metadata extension message: %w", err)
}
return nil
case pexExtendedId:
panic("connection already associated with a torrent")
}
c.t = t
+ c.logger.Printf("torrent=%v", t)
t.reconcileHandshakeStats(c)
}
}
func (c *connection) String() string {
- return fmt.Sprintf("%p", c)
+ return fmt.Sprintf("connection %p", c)
}
// Ensure that no race exists between sending a bitfield, and a subsequent
// Have that would potentially alter it.
func TestSendBitfieldThenHave(t *testing.T) {
- r, w := io.Pipe()
cl := Client{
- config: &ClientConfig{DownloadRateLimiter: unlimited},
+ config: TestingConfig(),
}
cl.initLogger()
c := cl.newConnection(nil, false, IpPort{}, "")
c.t.setInfo(&metainfo.Info{
Pieces: make([]byte, metainfo.HashSize*3),
})
+ r, w := io.Pipe()
c.r = r
c.w = w
go c.writer(time.Minute)