mirror of
https://github.com/aykhans/dodo.git
synced 2025-04-16 09:53:12 +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 (
|
||||
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) {
|
||||
|
6
main.go
6
main.go
@ -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())
|
||||
|
@ -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())
|
||||
|
@ -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)
|
||||
|
@ -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",
|
||||
|
@ -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,
|
||||
) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user