diff --git a/config/config.go b/config/config.go index bc43ed3..443426a 100644 --- a/config/config.go +++ b/config/config.go @@ -10,14 +10,14 @@ import ( ) const ( - VERSION = "0.4.1" - DefaultUserAgent = "Dodo/" + VERSION - ProxyCheckURL = "https://www.google.com" - DefaultMethod = "GET" - DefaultTimeout = 10000 // Milliseconds (10 seconds) - DefaultDodosCount = 1 - DefaultRequestCount = 1000 - MaxDodosCountForProxies = 20 // Max dodos count for proxy check + VERSION string = "0.4.1" + DefaultUserAgent string = "Dodo/" + VERSION + ProxyCheckURL string = "https://www.google.com" + DefaultMethod string = "GET" + DefaultTimeout uint32 = 10000 // Milliseconds (10 seconds) + DefaultDodosCount uint = 1 + DefaultRequestCount uint = 1000 + MaxDodosCountForProxies uint = 20 // Max dodos count for proxy check ) type IConfig interface { @@ -28,8 +28,8 @@ type RequestConfig struct { Method string URL *url.URL Timeout time.Duration - DodosCount int - RequestCount int + DodosCount uint + RequestCount uint Params map[string]string Headers map[string]string Cookies map[string]string @@ -68,12 +68,12 @@ func (config *RequestConfig) Print() { t.Render() } -func (config *RequestConfig) GetValidDodosCountForRequests() int { +func (config *RequestConfig) GetValidDodosCountForRequests() uint { return min(config.DodosCount, config.RequestCount) } -func (config *RequestConfig) GetValidDodosCountForProxies() int { - return min(config.DodosCount, len(config.Proxies), MaxDodosCountForProxies) +func (config *RequestConfig) GetValidDodosCountForProxies() uint { + return min(config.DodosCount, uint(len(config.Proxies)), MaxDodosCountForProxies) } func (config *RequestConfig) GetMaxConns(minConns uint) uint { @@ -86,9 +86,9 @@ func (config *RequestConfig) GetMaxConns(minConns uint) uint { type Config struct { Method string `json:"method" validate:"http_method"` // custom validations: http_method URL string `json:"url" validate:"http_url,required"` - Timeout int `json:"timeout" validate:"gte=1,lte=100000"` - DodosCount int `json:"dodos_count" validate:"gte=1"` - RequestCount int `json:"request_count" validation_name:"request-count" validate:"gte=1"` + Timeout uint32 `json:"timeout" validate:"gte=1,lte=100000"` + DodosCount uint `json:"dodos_count" validate:"gte=1"` + RequestCount uint `json:"request_count" validation_name:"request-count" validate:"gte=1"` } func (config *Config) MergeConfigs(newConfig *Config) { diff --git a/readers/cli.go b/readers/cli.go index 920613d..3880a1d 100644 --- a/readers/cli.go +++ b/readers/cli.go @@ -14,9 +14,9 @@ func CLIConfigReader() (*config.CLIConfig, error) { var ( returnNil = false cliConfig = &config.CLIConfig{} - dodosCount int - requestCount int - timeout int + dodosCount uint + requestCount uint + timeout uint32 rootCmd = &cobra.Command{ Use: "dodo [flags]", Example: ` Simple usage only with URL: @@ -48,9 +48,9 @@ func CLIConfigReader() (*config.CLIConfig, error) { rootCmd.Flags().BoolVarP(&cliConfig.Yes, "yes", "y", false, "Answer yes to all questions") rootCmd.Flags().StringVarP(&cliConfig.Method, "method", "m", "", fmt.Sprintf("HTTP Method (default %s)", config.DefaultMethod)) rootCmd.Flags().StringVarP(&cliConfig.URL, "url", "u", "", "URL for stress testing") - rootCmd.Flags().IntVarP(&dodosCount, "dodos-count", "d", config.DefaultDodosCount, "Number of dodos(threads)") - rootCmd.Flags().IntVarP(&requestCount, "request-count", "r", config.DefaultRequestCount, "Number of total requests") - rootCmd.Flags().IntVarP(&timeout, "timeout", "t", config.DefaultTimeout, "Timeout for each request in milliseconds") + rootCmd.Flags().UintVarP(&dodosCount, "dodos-count", "d", config.DefaultDodosCount, "Number of dodos(threads)") + rootCmd.Flags().UintVarP(&requestCount, "request-count", "r", config.DefaultRequestCount, "Number of total requests") + rootCmd.Flags().Uint32VarP(&timeout, "timeout", "t", config.DefaultTimeout, "Timeout for each request in milliseconds") if err := rootCmd.Execute(); err != nil { utils.PrintErr(err) rootCmd.Println(rootCmd.UsageString()) diff --git a/requests/client.go b/requests/client.go index 5e33378..afc7a6c 100644 --- a/requests/client.go +++ b/requests/client.go @@ -32,7 +32,7 @@ func getClientDoFunc( ctx context.Context, timeout time.Duration, proxies []config.Proxy, - dodosCount int, + dodosCount uint, maxConns uint, yes bool, URL *url.URL, @@ -46,7 +46,7 @@ func getClientDoFunc( if ctx.Err() != nil { return nil } - activeProxyClientsCount := len(activeProxyClients) + activeProxyClientsCount := uint(len(activeProxyClients)) var yesOrNoMessage string var yesOrNoDefault bool if activeProxyClientsCount == 0 { @@ -114,18 +114,19 @@ func getActiveProxyClients( ctx context.Context, proxies []config.Proxy, timeout time.Duration, - dodosCount int, + dodosCount uint, maxConns uint, URL *url.URL, ) []*fasthttp.HostClient { activeProxyClientsArray := make([][]*fasthttp.HostClient, dodosCount) proxiesCount := len(proxies) + dodosCountInt := int(dodosCount) var ( wg sync.WaitGroup streamWG sync.WaitGroup ) - wg.Add(dodosCount) + wg.Add(dodosCountInt) streamWG.Add(1) var proxiesSlice []config.Proxy increase := make(chan int64, proxiesCount) @@ -133,11 +134,11 @@ func getActiveProxyClients( streamCtx, streamCtxCancel := context.WithCancel(context.Background()) go streamProgress(streamCtx, &streamWG, int64(proxiesCount), "Searching for active proxies🌐", increase) - for i := 0; i < dodosCount; i++ { - if i+1 == dodosCount { - proxiesSlice = proxies[i*proxiesCount/dodosCount:] + for i := range dodosCountInt { + if i+1 == dodosCountInt { + proxiesSlice = proxies[i*proxiesCount/dodosCountInt:] } else { - proxiesSlice = proxies[i*proxiesCount/dodosCount : (i+1)*proxiesCount/dodosCount] + proxiesSlice = proxies[i*proxiesCount/dodosCountInt : (i+1)*proxiesCount/dodosCountInt] } go findActiveProxyClients( ctx, @@ -305,11 +306,12 @@ func getDialFunc(proxy *config.Proxy, timeout time.Duration) (fasthttp.DialFunc, // getSharedRandomClientDoFunc is equivalent to getSharedClientDoFunc but uses a random client from the provided slice. func getSharedRandomClientDoFunc( clients []*fasthttp.HostClient, - clientsCount int, + clientsCount uint, timeout time.Duration, ) ClientDoFunc { + clientsCountInt := int(clientsCount) return func(ctx context.Context, request *fasthttp.Request) (*fasthttp.Response, error) { - client := clients[rand.Intn(clientsCount)] + client := clients[rand.Intn(clientsCountInt)] defer client.CloseIdleConnections() response := fasthttp.AcquireResponse() ch := make(chan error) diff --git a/requests/run.go b/requests/run.go index 7c67247..bdbdbb8 100644 --- a/requests/run.go +++ b/requests/run.go @@ -67,16 +67,17 @@ func releaseDodos( ctx context.Context, mainRequest *fasthttp.Request, clientDoFunc ClientDoFunc, - dodosCount int, - requestCount int, + dodosCount uint, + requestCount uint, ) Responses { var ( wg sync.WaitGroup streamWG sync.WaitGroup - requestCountPerDodo int + requestCountPerDodo uint + dodosCountInt = int(dodosCount) ) - wg.Add(dodosCount) + wg.Add(dodosCountInt) streamWG.Add(1) responses := make([][]Response, dodosCount) increase := make(chan int64, requestCount) @@ -84,10 +85,9 @@ func releaseDodos( streamCtx, streamCtxCancel := context.WithCancel(context.Background()) go streamProgress(streamCtx, &streamWG, int64(requestCount), "Dodos Working🔥", increase) - for i := 0; i < dodosCount; i++ { + for i := range dodosCount { if i+1 == dodosCount { - requestCountPerDodo = requestCount - - (i * requestCount / dodosCount) + requestCountPerDodo = requestCount - (i * requestCount / dodosCount) } else { requestCountPerDodo = ((i + 1) * requestCount / dodosCount) - (i * requestCount / dodosCount) @@ -129,7 +129,7 @@ func sendRequest( request *fasthttp.Request, responseData *[]Response, increase chan<- int64, - requestCount int, + requestCount uint, clientDo ClientDoFunc, wg *sync.WaitGroup, ) {