Path: blob/dev/examples/with_speed_control/main.go
2070 views
package main12import (3"context"4"log"5"sync"6"time"78nuclei "github.com/projectdiscovery/nuclei/v3/lib"9"github.com/projectdiscovery/nuclei/v3/pkg/templates/types"10)1112func main() {13ne, err := initializeNucleiEngine()14if err != nil {15panic(err)16}17defer ne.Close()1819ne.LoadTargets([]string{"http://honey.scanme.sh"}, false)2021var wg sync.WaitGroup22wg.Add(3)2324go testRateLimit(&wg, ne)25go testThreadsAndBulkSize(&wg, ne)26go testPayloadConcurrency(&wg, ne)2728err = ne.ExecuteWithCallback(nil)29if err != nil {30panic(err)31}3233wg.Wait()34}3536func initializeNucleiEngine() (*nuclei.NucleiEngine, error) {37return nuclei.NewNucleiEngineCtx(context.TODO(),38nuclei.WithTemplateFilters(nuclei.TemplateFilters{Tags: []string{"oast"}}),39nuclei.EnableStatsWithOpts(nuclei.StatsOptions{MetricServerPort: 6064}),40nuclei.WithGlobalRateLimit(1, time.Second),41nuclei.WithConcurrency(nuclei.Concurrency{42TemplateConcurrency: 1,43HostConcurrency: 1,44HeadlessHostConcurrency: 1,45HeadlessTemplateConcurrency: 1,46JavascriptTemplateConcurrency: 1,47TemplatePayloadConcurrency: 1,48ProbeConcurrency: 1,49}),50)51}5253func testRateLimit(wg *sync.WaitGroup, ne *nuclei.NucleiEngine) {54defer wg.Done()55verifyRateLimit(ne, 1, 5000)56}5758func testThreadsAndBulkSize(wg *sync.WaitGroup, ne *nuclei.NucleiEngine) {59defer wg.Done()60initialTemplateThreads, initialBulkSize := 1, 161verifyThreadsAndBulkSize(ne, initialTemplateThreads, initialBulkSize, 25, 25)62}6364func testPayloadConcurrency(wg *sync.WaitGroup, ne *nuclei.NucleiEngine) {65defer wg.Done()66verifyPayloadConcurrency(ne, 1, 500)67}6869func verifyRateLimit(ne *nuclei.NucleiEngine, initialRate, finalRate int) {70if ne.GetExecuterOptions().RateLimiter.GetLimit() != uint(initialRate) {71panic("wrong initial rate limit")72}73time.Sleep(5 * time.Second)74ne.Options().RateLimit = finalRate75time.Sleep(20 * time.Second)76if ne.GetExecuterOptions().RateLimiter.GetLimit() != uint(finalRate) {77panic("wrong final rate limit")78}79}8081func verifyThreadsAndBulkSize(ne *nuclei.NucleiEngine, initialThreads, initialBulk, finalThreads, finalBulk int) {82if ne.Options().TemplateThreads != initialThreads || ne.Options().BulkSize != initialBulk {83panic("wrong initial standard concurrency")84}85time.Sleep(5 * time.Second)86ne.Options().TemplateThreads = finalThreads87ne.Options().BulkSize = finalBulk88time.Sleep(20 * time.Second)89if ne.Engine().GetWorkPool().InputPool(types.HTTPProtocol).Size != finalBulk || ne.Engine().WorkPool().Default.Size != finalThreads {90log.Fatal("wrong final concurrency", ne.Engine().WorkPool().Default.Size, finalThreads, ne.Engine().GetWorkPool().InputPool(types.HTTPProtocol).Size, finalBulk)91}92}9394func verifyPayloadConcurrency(ne *nuclei.NucleiEngine, initialPayloadConcurrency, finalPayloadConcurrency int) {95if ne.Options().PayloadConcurrency != initialPayloadConcurrency {96panic("wrong initial payload concurrency")97}98time.Sleep(5 * time.Second)99ne.Options().PayloadConcurrency = finalPayloadConcurrency100time.Sleep(20 * time.Second)101if ne.GetExecuterOptions().GetThreadsForNPayloadRequests(100, 0) != finalPayloadConcurrency {102panic("wrong final payload concurrency")103}104}105106107