mirror of
https://github.com/aykhans/dodo.git
synced 2025-04-20 11:11:26 +00:00
Merge pull request #24 from aykhans/refactor/config
Refactor config package
This commit is contained in:
commit
d0e5c343ea
@ -10,14 +10,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
VERSION = "0.4.1"
|
VERSION string = "0.4.2"
|
||||||
DefaultUserAgent = "Dodo/" + VERSION
|
DefaultUserAgent string = "Dodo/" + VERSION
|
||||||
ProxyCheckURL = "https://www.google.com"
|
ProxyCheckURL string = "https://www.google.com"
|
||||||
DefaultMethod = "GET"
|
DefaultMethod string = "GET"
|
||||||
DefaultTimeout = 10000 // Milliseconds (10 seconds)
|
DefaultTimeout uint32 = 10000 // Milliseconds (10 seconds)
|
||||||
DefaultDodosCount = 1
|
DefaultDodosCount uint = 1
|
||||||
DefaultRequestCount = 1000
|
DefaultRequestCount uint = 1000
|
||||||
MaxDodosCountForProxies = 20 // Max dodos count for proxy check
|
MaxDodosCountForProxies uint = 20 // Max dodos count for proxy check
|
||||||
)
|
)
|
||||||
|
|
||||||
type IConfig interface {
|
type IConfig interface {
|
||||||
@ -28,8 +28,8 @@ type RequestConfig struct {
|
|||||||
Method string
|
Method string
|
||||||
URL *url.URL
|
URL *url.URL
|
||||||
Timeout time.Duration
|
Timeout time.Duration
|
||||||
DodosCount int
|
DodosCount uint
|
||||||
RequestCount int
|
RequestCount uint
|
||||||
Params map[string]string
|
Params map[string]string
|
||||||
Headers map[string]string
|
Headers map[string]string
|
||||||
Cookies map[string]string
|
Cookies map[string]string
|
||||||
@ -42,7 +42,9 @@ func (config *RequestConfig) Print() {
|
|||||||
t := table.NewWriter()
|
t := table.NewWriter()
|
||||||
t.SetOutputMirror(os.Stdout)
|
t.SetOutputMirror(os.Stdout)
|
||||||
t.SetStyle(table.StyleLight)
|
t.SetStyle(table.StyleLight)
|
||||||
t.SetAllowedRowLength(125)
|
t.SetColumnConfigs([]table.ColumnConfig{
|
||||||
|
{Number: 2, WidthMax: 50},
|
||||||
|
})
|
||||||
|
|
||||||
t.AppendHeader(table.Row{"Request Configuration"})
|
t.AppendHeader(table.Row{"Request Configuration"})
|
||||||
t.AppendRow(table.Row{"Method", config.Method})
|
t.AppendRow(table.Row{"Method", config.Method})
|
||||||
@ -68,12 +70,12 @@ func (config *RequestConfig) Print() {
|
|||||||
t.Render()
|
t.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *RequestConfig) GetValidDodosCountForRequests() int {
|
func (config *RequestConfig) GetValidDodosCountForRequests() uint {
|
||||||
return min(config.DodosCount, config.RequestCount)
|
return min(config.DodosCount, config.RequestCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *RequestConfig) GetValidDodosCountForProxies() int {
|
func (config *RequestConfig) GetValidDodosCountForProxies() uint {
|
||||||
return min(config.DodosCount, len(config.Proxies), MaxDodosCountForProxies)
|
return min(config.DodosCount, uint(len(config.Proxies)), MaxDodosCountForProxies)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *RequestConfig) GetMaxConns(minConns uint) uint {
|
func (config *RequestConfig) GetMaxConns(minConns uint) uint {
|
||||||
@ -86,9 +88,9 @@ func (config *RequestConfig) GetMaxConns(minConns uint) uint {
|
|||||||
type Config struct {
|
type Config struct {
|
||||||
Method string `json:"method" validate:"http_method"` // custom validations: http_method
|
Method string `json:"method" validate:"http_method"` // custom validations: http_method
|
||||||
URL string `json:"url" validate:"http_url,required"`
|
URL string `json:"url" validate:"http_url,required"`
|
||||||
Timeout int `json:"timeout" validate:"gte=1,lte=100000"`
|
Timeout uint32 `json:"timeout" validate:"gte=1,lte=100000"`
|
||||||
DodosCount int `json:"dodos_count" validate:"gte=1"`
|
DodosCount uint `json:"dodos_count" validate:"gte=1"`
|
||||||
RequestCount int `json:"request_count" validation_name:"request-count" validate:"gte=1"`
|
RequestCount uint `json:"request_count" validation_name:"request-count" validate:"gte=1"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (config *Config) MergeConfigs(newConfig *Config) {
|
func (config *Config) MergeConfigs(newConfig *Config) {
|
||||||
|
6
main.go
6
main.go
@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
@ -84,11 +85,10 @@ func main() {
|
|||||||
requestConf.Print()
|
requestConf.Print()
|
||||||
if !cliConf.Yes {
|
if !cliConf.Yes {
|
||||||
response := readers.CLIYesOrNoReader("Do you want to continue?", true)
|
response := readers.CLIYesOrNoReader("Do you want to continue?", true)
|
||||||
if response {
|
if !response {
|
||||||
utils.PrintlnC(utils.Colors.Green, "Starting Dodo\n")
|
|
||||||
} else {
|
|
||||||
utils.PrintAndExit("Exiting...")
|
utils.PrintAndExit("Exiting...")
|
||||||
}
|
}
|
||||||
|
fmt.Println()
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
@ -14,9 +14,9 @@ func CLIConfigReader() (*config.CLIConfig, error) {
|
|||||||
var (
|
var (
|
||||||
returnNil = false
|
returnNil = false
|
||||||
cliConfig = &config.CLIConfig{}
|
cliConfig = &config.CLIConfig{}
|
||||||
dodosCount int
|
dodosCount uint
|
||||||
requestCount int
|
requestCount uint
|
||||||
timeout int
|
timeout uint32
|
||||||
rootCmd = &cobra.Command{
|
rootCmd = &cobra.Command{
|
||||||
Use: "dodo [flags]",
|
Use: "dodo [flags]",
|
||||||
Example: ` Simple usage only with URL:
|
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().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.Method, "method", "m", "", fmt.Sprintf("HTTP Method (default %s)", config.DefaultMethod))
|
||||||
rootCmd.Flags().StringVarP(&cliConfig.URL, "url", "u", "", "URL for stress testing")
|
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().UintVarP(&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().UintVarP(&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().Uint32VarP(&timeout, "timeout", "t", config.DefaultTimeout, "Timeout for each request in milliseconds")
|
||||||
if err := rootCmd.Execute(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
utils.PrintErr(err)
|
utils.PrintErr(err)
|
||||||
rootCmd.Println(rootCmd.UsageString())
|
rootCmd.Println(rootCmd.UsageString())
|
||||||
|
@ -32,7 +32,7 @@ func getClientDoFunc(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
timeout time.Duration,
|
timeout time.Duration,
|
||||||
proxies []config.Proxy,
|
proxies []config.Proxy,
|
||||||
dodosCount int,
|
dodosCount uint,
|
||||||
maxConns uint,
|
maxConns uint,
|
||||||
yes bool,
|
yes bool,
|
||||||
URL *url.URL,
|
URL *url.URL,
|
||||||
@ -46,7 +46,7 @@ func getClientDoFunc(
|
|||||||
if ctx.Err() != nil {
|
if ctx.Err() != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
activeProxyClientsCount := len(activeProxyClients)
|
activeProxyClientsCount := uint(len(activeProxyClients))
|
||||||
var yesOrNoMessage string
|
var yesOrNoMessage string
|
||||||
var yesOrNoDefault bool
|
var yesOrNoDefault bool
|
||||||
if activeProxyClientsCount == 0 {
|
if activeProxyClientsCount == 0 {
|
||||||
@ -114,18 +114,19 @@ func getActiveProxyClients(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
proxies []config.Proxy,
|
proxies []config.Proxy,
|
||||||
timeout time.Duration,
|
timeout time.Duration,
|
||||||
dodosCount int,
|
dodosCount uint,
|
||||||
maxConns uint,
|
maxConns uint,
|
||||||
URL *url.URL,
|
URL *url.URL,
|
||||||
) []*fasthttp.HostClient {
|
) []*fasthttp.HostClient {
|
||||||
activeProxyClientsArray := make([][]*fasthttp.HostClient, dodosCount)
|
activeProxyClientsArray := make([][]*fasthttp.HostClient, dodosCount)
|
||||||
proxiesCount := len(proxies)
|
proxiesCount := len(proxies)
|
||||||
|
dodosCountInt := int(dodosCount)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
streamWG sync.WaitGroup
|
streamWG sync.WaitGroup
|
||||||
)
|
)
|
||||||
wg.Add(dodosCount)
|
wg.Add(dodosCountInt)
|
||||||
streamWG.Add(1)
|
streamWG.Add(1)
|
||||||
var proxiesSlice []config.Proxy
|
var proxiesSlice []config.Proxy
|
||||||
increase := make(chan int64, proxiesCount)
|
increase := make(chan int64, proxiesCount)
|
||||||
@ -133,11 +134,11 @@ func getActiveProxyClients(
|
|||||||
streamCtx, streamCtxCancel := context.WithCancel(context.Background())
|
streamCtx, streamCtxCancel := context.WithCancel(context.Background())
|
||||||
go streamProgress(streamCtx, &streamWG, int64(proxiesCount), "Searching for active proxies🌐", increase)
|
go streamProgress(streamCtx, &streamWG, int64(proxiesCount), "Searching for active proxies🌐", increase)
|
||||||
|
|
||||||
for i := 0; i < dodosCount; i++ {
|
for i := range dodosCountInt {
|
||||||
if i+1 == dodosCount {
|
if i+1 == dodosCountInt {
|
||||||
proxiesSlice = proxies[i*proxiesCount/dodosCount:]
|
proxiesSlice = proxies[i*proxiesCount/dodosCountInt:]
|
||||||
} else {
|
} else {
|
||||||
proxiesSlice = proxies[i*proxiesCount/dodosCount : (i+1)*proxiesCount/dodosCount]
|
proxiesSlice = proxies[i*proxiesCount/dodosCountInt : (i+1)*proxiesCount/dodosCountInt]
|
||||||
}
|
}
|
||||||
go findActiveProxyClients(
|
go findActiveProxyClients(
|
||||||
ctx,
|
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.
|
// getSharedRandomClientDoFunc is equivalent to getSharedClientDoFunc but uses a random client from the provided slice.
|
||||||
func getSharedRandomClientDoFunc(
|
func getSharedRandomClientDoFunc(
|
||||||
clients []*fasthttp.HostClient,
|
clients []*fasthttp.HostClient,
|
||||||
clientsCount int,
|
clientsCount uint,
|
||||||
timeout time.Duration,
|
timeout time.Duration,
|
||||||
) ClientDoFunc {
|
) ClientDoFunc {
|
||||||
|
clientsCountInt := int(clientsCount)
|
||||||
return func(ctx context.Context, request *fasthttp.Request) (*fasthttp.Response, error) {
|
return func(ctx context.Context, request *fasthttp.Request) (*fasthttp.Response, error) {
|
||||||
client := clients[rand.Intn(clientsCount)]
|
client := clients[rand.Intn(clientsCountInt)]
|
||||||
defer client.CloseIdleConnections()
|
defer client.CloseIdleConnections()
|
||||||
response := fasthttp.AcquireResponse()
|
response := fasthttp.AcquireResponse()
|
||||||
ch := make(chan error)
|
ch := make(chan error)
|
||||||
|
@ -57,7 +57,10 @@ func (respones Responses) Print() {
|
|||||||
t := table.NewWriter()
|
t := table.NewWriter()
|
||||||
t.SetOutputMirror(os.Stdout)
|
t.SetOutputMirror(os.Stdout)
|
||||||
t.SetStyle(table.StyleLight)
|
t.SetStyle(table.StyleLight)
|
||||||
t.SetAllowedRowLength(125)
|
t.SetColumnConfigs([]table.ColumnConfig{
|
||||||
|
{Number: 1, WidthMax: 80},
|
||||||
|
})
|
||||||
|
|
||||||
t.AppendHeader(table.Row{
|
t.AppendHeader(table.Row{
|
||||||
"Response",
|
"Response",
|
||||||
"Count",
|
"Count",
|
||||||
|
@ -67,16 +67,17 @@ func releaseDodos(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
mainRequest *fasthttp.Request,
|
mainRequest *fasthttp.Request,
|
||||||
clientDoFunc ClientDoFunc,
|
clientDoFunc ClientDoFunc,
|
||||||
dodosCount int,
|
dodosCount uint,
|
||||||
requestCount int,
|
requestCount uint,
|
||||||
) Responses {
|
) Responses {
|
||||||
var (
|
var (
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
streamWG sync.WaitGroup
|
streamWG sync.WaitGroup
|
||||||
requestCountPerDodo int
|
requestCountPerDodo uint
|
||||||
|
dodosCountInt = int(dodosCount)
|
||||||
)
|
)
|
||||||
|
|
||||||
wg.Add(dodosCount)
|
wg.Add(dodosCountInt)
|
||||||
streamWG.Add(1)
|
streamWG.Add(1)
|
||||||
responses := make([][]Response, dodosCount)
|
responses := make([][]Response, dodosCount)
|
||||||
increase := make(chan int64, requestCount)
|
increase := make(chan int64, requestCount)
|
||||||
@ -84,10 +85,9 @@ func releaseDodos(
|
|||||||
streamCtx, streamCtxCancel := context.WithCancel(context.Background())
|
streamCtx, streamCtxCancel := context.WithCancel(context.Background())
|
||||||
go streamProgress(streamCtx, &streamWG, int64(requestCount), "Dodos Working🔥", increase)
|
go streamProgress(streamCtx, &streamWG, int64(requestCount), "Dodos Working🔥", increase)
|
||||||
|
|
||||||
for i := 0; i < dodosCount; i++ {
|
for i := range dodosCount {
|
||||||
if i+1 == dodosCount {
|
if i+1 == dodosCount {
|
||||||
requestCountPerDodo = requestCount -
|
requestCountPerDodo = requestCount - (i * requestCount / dodosCount)
|
||||||
(i * requestCount / dodosCount)
|
|
||||||
} else {
|
} else {
|
||||||
requestCountPerDodo = ((i + 1) * requestCount / dodosCount) -
|
requestCountPerDodo = ((i + 1) * requestCount / dodosCount) -
|
||||||
(i * requestCount / dodosCount)
|
(i * requestCount / dodosCount)
|
||||||
@ -129,7 +129,7 @@ func sendRequest(
|
|||||||
request *fasthttp.Request,
|
request *fasthttp.Request,
|
||||||
responseData *[]Response,
|
responseData *[]Response,
|
||||||
increase chan<- int64,
|
increase chan<- int64,
|
||||||
requestCount int,
|
requestCount uint,
|
||||||
clientDo ClientDoFunc,
|
clientDo ClientDoFunc,
|
||||||
wg *sync.WaitGroup,
|
wg *sync.WaitGroup,
|
||||||
) {
|
) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user