mirror of
https://github.com/chainreactors/spray.git
synced 2025-09-15 11:40:13 +00:00
优化resume在因为错误退出时的逻辑
This commit is contained in:
parent
2f24baf27c
commit
a55397eaea
@ -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():
|
||||||
|
@ -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())
|
||||||
|
@ -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 {
|
||||||
|
@ -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"`
|
||||||
|
Loading…
x
Reference in New Issue
Block a user