Merge pull request #24 from aykhans/refactor/config

Refactor config package
This commit is contained in:
Aykhan Shahsuvarov 2024-09-10 21:07:09 +04:00 committed by GitHub
commit d0e5c343ea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 52 additions and 45 deletions

View File

@ -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.2"
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
@ -42,7 +42,9 @@ func (config *RequestConfig) Print() {
t := table.NewWriter()
t.SetOutputMirror(os.Stdout)
t.SetStyle(table.StyleLight)
t.SetAllowedRowLength(125)
t.SetColumnConfigs([]table.ColumnConfig{
{Number: 2, WidthMax: 50},
})
t.AppendHeader(table.Row{"Request Configuration"})
t.AppendRow(table.Row{"Method", config.Method})
@ -68,12 +70,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 +88,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) {

View File

@ -2,6 +2,7 @@ package main
import (
"context"
"fmt"
"net/url"
"os"
"os/signal"
@ -84,11 +85,10 @@ func main() {
requestConf.Print()
if !cliConf.Yes {
response := readers.CLIYesOrNoReader("Do you want to continue?", true)
if response {
utils.PrintlnC(utils.Colors.Green, "Starting Dodo\n")
} else {
if !response {
utils.PrintAndExit("Exiting...")
}
fmt.Println()
}
ctx, cancel := context.WithCancel(context.Background())

View File

@ -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())

View File

@ -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)

View File

@ -57,7 +57,10 @@ func (respones Responses) Print() {
t := table.NewWriter()
t.SetOutputMirror(os.Stdout)
t.SetStyle(table.StyleLight)
t.SetAllowedRowLength(125)
t.SetColumnConfigs([]table.ColumnConfig{
{Number: 1, WidthMax: 80},
})
t.AppendHeader(table.Row{
"Response",
"Count",

View File

@ -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,
) {