优化resume在因为错误退出时的逻辑

This commit is contained in:
M09Ic 2022-12-16 11:56:27 +08:00
parent 2f24baf27c
commit a55397eaea
4 changed files with 28 additions and 9 deletions

View File

@ -36,7 +36,7 @@ func NewPool(ctx context.Context, config *pkg.Config) (*Pool, error) {
client: ihttp.NewClient(config.Thread, 2, config.ClientType), client: ihttp.NewClient(config.Thread, 2, config.ClientType),
baselines: make(map[int]*pkg.Baseline), baselines: make(map[int]*pkg.Baseline),
tempCh: make(chan *pkg.Baseline, config.Thread), tempCh: make(chan *pkg.Baseline, config.Thread),
checkCh: make(chan *Unit), checkCh: make(chan sourceType),
wg: sync.WaitGroup{}, wg: sync.WaitGroup{},
initwg: sync.WaitGroup{}, initwg: sync.WaitGroup{},
reqCount: 1, reqCount: 1,
@ -107,7 +107,7 @@ func NewPool(ctx context.Context, config *pkg.Config) (*Pool, error) {
logs.Log.Warn("[check.fuzzy] maybe trigger risk control, " + bl.String()) logs.Log.Warn("[check.fuzzy] maybe trigger risk control, " + bl.String())
} }
} else { } else {
pool.failedCount++ pool.failedCount += 2
logs.Log.Warn("[check.failed] maybe trigger risk control, " + bl.String()) logs.Log.Warn("[check.failed] maybe trigger risk control, " + bl.String())
pool.failedBaselines = append(pool.failedBaselines, bl) pool.failedBaselines = append(pool.failedBaselines, bl)
} }
@ -207,9 +207,10 @@ type Pool struct {
ctx context.Context ctx context.Context
cancel context.CancelFunc cancel context.CancelFunc
tempCh chan *pkg.Baseline // 待处理的baseline tempCh chan *pkg.Baseline // 待处理的baseline
checkCh chan *Unit checkCh chan sourceType
reqCount int reqCount int
failedCount int failedCount int
isFailed bool
failedBaselines []*pkg.Baseline failedBaselines []*pkg.Baseline
random *pkg.Baseline random *pkg.Baseline
index *pkg.Baseline index *pkg.Baseline
@ -275,6 +276,7 @@ func (pool *Pool) addRedirect(bl *pkg.Baseline, reCount int) {
if uu, err := url.Parse(bl.RedirectURL); err == nil && uu.Hostname() == pool.index.Url.Hostname() { if uu, err := url.Parse(bl.RedirectURL); err == nil && uu.Hostname() == pool.index.Url.Hostname() {
pool.wg.Add(1) pool.wg.Add(1)
_ = pool.reqPool.Invoke(&Unit{ _ = pool.reqPool.Invoke(&Unit{
number: bl.Number,
path: uu.Path, path: uu.Path,
source: RedirectSource, source: RedirectSource,
frontUrl: bl.UrlString, frontUrl: bl.UrlString,
@ -288,13 +290,14 @@ func (pool *Pool) check() {
// 当报错次数超过上限是, 结束任务 // 当报错次数超过上限是, 结束任务
pool.recover() pool.recover()
pool.cancel() pool.cancel()
pool.isFailed = true
return return
} }
if pool.Mod == pkg.HostSpray { if pool.Mod == pkg.HostSpray {
pool.checkCh <- newUnit(pkg.RandHost(), CheckSource) pool.checkCh <- CheckSource
} else if pool.Mod == pkg.PathSpray { } else if pool.Mod == pkg.PathSpray {
pool.checkCh <- newUnit(pkg.RandPath(), CheckSource) pool.checkCh <- CheckSource
} }
} }
@ -329,10 +332,15 @@ Loop:
continue continue
} }
pool.wg.Add(1) pool.wg.Add(1)
_ = pool.reqPool.Invoke(newUnit(u, WordSource)) _ = pool.reqPool.Invoke(newUnitWithNumber(u, WordSource, pool.Statistor.End))
case unit := <-pool.checkCh: case source := <-pool.checkCh:
pool.Statistor.CheckNumber++ pool.Statistor.CheckNumber++
pool.reqPool.Invoke(unit) if pool.Mod == pkg.HostSpray {
pool.reqPool.Invoke(newUnitWithNumber(pkg.RandHost(), source, pool.Statistor.End))
} else if pool.Mod == pkg.PathSpray {
pool.reqPool.Invoke(newUnitWithNumber(pkg.RandPath(), source, pool.Statistor.End))
}
case <-ctx.Done(): case <-ctx.Done():
break Loop break Loop
case <-pool.ctx.Done(): case <-pool.ctx.Done():

View File

@ -199,6 +199,11 @@ func (r *Runner) Prepare(ctx context.Context) error {
} }
pool.Run(ctx, pool.Statistor.Offset, limit) pool.Run(ctx, pool.Statistor.Offset, limit)
if pool.isFailed && len(pool.failedBaselines) > 0 {
// 如果因为错误积累退出, end将指向第一个错误发生时, 防止resume时跳过大量目标
pool.Statistor.End = pool.failedBaselines[0].Number
}
if r.Color { if r.Color {
logs.Log.Important(pool.Statistor.ColorString()) logs.Log.Important(pool.Statistor.ColorString())
logs.Log.Important(pool.Statistor.ColorDetail()) logs.Log.Important(pool.Statistor.ColorDetail())

View File

@ -59,11 +59,16 @@ func newUnit(path string, source sourceType) *Unit {
return &Unit{path: path, source: source} return &Unit{path: path, source: source}
} }
func newUnitWithNumber(path string, source sourceType, number int) *Unit {
return &Unit{number: number, path: path, source: source}
}
type Unit struct { type Unit struct {
number int
path string path string
source sourceType source sourceType
frontUrl string frontUrl string
reCount int reCount int // redirect number
} }
type Task struct { type Task struct {

View File

@ -63,6 +63,7 @@ func NewInvalidBaseline(u, host string, resp *ihttp.Response, reason string) *Ba
} }
type Baseline struct { type Baseline struct {
Number int `json:"number"`
Url *url.URL `json:"-"` Url *url.URL `json:"-"`
UrlString string `json:"url"` UrlString string `json:"url"`
Path string `json:"path"` Path string `json:"path"`