1 Star 1 Fork 0

k3x/urlx

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
progress.go 1.63 KB
一键复制 编辑 原始数据 按行查看 历史
k3x 提交于 2022-01-24 10:35 +08:00 . sync
package urlx
import (
"net/http"
"time"
)
// ProgressReport 进度报告方法
type ProgressReport = func(total float64, cur float64, speed float64)
// Progress 下载进度, reportInterval 报告的时间间隔, 最小1秒, 默认2秒
func Progress(report ProgressReport, reportInterval ...time.Duration) ProcessMw {
var interval time.Duration
for _, ri := range reportInterval {
if ri > time.Second {
interval = ri
break
}
}
if interval < time.Second {
interval = time.Second * 2
}
return func(next Process) Process {
return func(resp *http.Response) error {
var (
body = resp.Body
total = float64(resp.ContentLength)
cur = float64(0) //当前已读取
cTime time.Time //上一次计算速度的时间
cBytes float64 //从上一次计算速度的时间之后新读取的字节数
)
calc := func(n ...time.Time) {
var now time.Time
if len(n) > 0 {
now = n[0]
} else {
now = time.Now()
}
if d := now.Sub(cTime); len(n) == 0 || d >= interval {
report(total, cur, cBytes/d.Seconds())
cTime = now
cBytes = 0
}
}
reader := func(p []byte) (n int, err error) {
if cTime.IsZero() {
cTime = time.Now()
}
if n, err = body.Read(p); err != nil {
return
}
fv := float64(n)
cur += fv
cBytes += fv
if report != nil {
calc(time.Now())
}
return
}
defer calc()
resp.Body = rFunc(reader)
return next(resp)
}
}
}
type rFunc func(p []byte) (n int, err error)
func (f rFunc) Read(p []byte) (n int, err error) { return f(p) }
func (rFunc) Close() error { return nil }
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/k3x/urlx.git
git@gitee.com:k3x/urlx.git
k3x
urlx
urlx
master

搜索帮助