|
@@ -174,3 +174,38 @@ func (sc *SharedConn) WriteBuff(buffer []byte) (err error) {
|
|
|
_, err = sc.buf.Write(buffer)
|
|
|
return err
|
|
|
}
|
|
|
+
|
|
|
+type StatsConn struct {
|
|
|
+ Conn
|
|
|
+
|
|
|
+ totalRead int64
|
|
|
+ totalWrite int64
|
|
|
+ statsFunc func(totalRead, totalWrite int64)
|
|
|
+}
|
|
|
+
|
|
|
+func WrapStatsConn(conn Conn, statsFunc func(total, totalWrite int64)) *StatsConn {
|
|
|
+ return &StatsConn{
|
|
|
+ Conn: conn,
|
|
|
+ statsFunc: statsFunc,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (statsConn *StatsConn) Read(p []byte) (n int, err error) {
|
|
|
+ n, err = statsConn.Conn.Read(p)
|
|
|
+ statsConn.totalRead += int64(n)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (statsConn *StatsConn) Write(p []byte) (n int, err error) {
|
|
|
+ n, err = statsConn.Conn.Write(p)
|
|
|
+ statsConn.totalWrite += int64(n)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (statsConn *StatsConn) Close() (err error) {
|
|
|
+ err = statsConn.Conn.Close()
|
|
|
+ if statsConn.statsFunc != nil {
|
|
|
+ statsConn.statsFunc(statsConn.totalRead, statsConn.totalWrite)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|