mirror of
https://github.com/aykhans/dodo.git
synced 2025-09-05 10:43:37 +00:00
🔨 Restructure entire project logic
- Moved readers to the config package - Added an option to read remote config files - Moved the validation package to the config package and removed the validator dependency - Moved the customerrors package to the config package - Replaced fatih/color with jedib0t/go-pretty/v6/text - Removed proxy check functionality - Added param, header, cookie, body, and proxy flags to the CLI - Allowed multiple values for the same key in params, headers, and cookies
This commit is contained in:
128
main.go
128
main.go
@@ -2,118 +2,57 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/aykhans/dodo/config"
|
||||
customerrors "github.com/aykhans/dodo/custom_errors"
|
||||
"github.com/aykhans/dodo/readers"
|
||||
"github.com/aykhans/dodo/requests"
|
||||
"github.com/aykhans/dodo/types"
|
||||
"github.com/aykhans/dodo/utils"
|
||||
"github.com/aykhans/dodo/validation"
|
||||
"github.com/fatih/color"
|
||||
goValidator "github.com/go-playground/validator/v10"
|
||||
"github.com/jedib0t/go-pretty/v6/text"
|
||||
)
|
||||
|
||||
func main() {
|
||||
validator := validation.NewValidator()
|
||||
conf := config.NewConfig("", 0, 0, 0, nil)
|
||||
jsonConf := config.NewJSONConfig(
|
||||
config.NewConfig("", 0, 0, 0, nil), nil, nil, nil, nil, nil,
|
||||
)
|
||||
|
||||
cliConf, err := readers.CLIConfigReader()
|
||||
if err != nil {
|
||||
utils.PrintAndExit(err.Error())
|
||||
}
|
||||
if cliConf == nil {
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
if err := validator.StructPartial(cliConf, "ConfigFile"); err != nil {
|
||||
utils.PrintErrAndExit(
|
||||
customerrors.ValidationErrorsFormater(
|
||||
err.(goValidator.ValidationErrors),
|
||||
),
|
||||
)
|
||||
}
|
||||
if cliConf.ConfigFile != "" {
|
||||
jsonConfNew, err := readers.JSONConfigReader(cliConf.ConfigFile)
|
||||
if err != nil {
|
||||
utils.PrintErrAndExit(err)
|
||||
}
|
||||
if err := validator.StructFiltered(
|
||||
jsonConfNew,
|
||||
func(ns []byte) bool {
|
||||
return strings.LastIndex(string(ns), "Proxies") == -1
|
||||
}); err != nil {
|
||||
utils.PrintErrAndExit(
|
||||
customerrors.ValidationErrorsFormater(
|
||||
err.(goValidator.ValidationErrors),
|
||||
),
|
||||
)
|
||||
}
|
||||
jsonConf = jsonConfNew
|
||||
conf.MergeConfigs(jsonConf.Config)
|
||||
}
|
||||
|
||||
conf.MergeConfigs(cliConf.Config)
|
||||
conf.SetDefaults()
|
||||
if err := validator.Struct(conf); err != nil {
|
||||
utils.PrintErrAndExit(
|
||||
customerrors.ValidationErrorsFormater(
|
||||
err.(goValidator.ValidationErrors),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
parsedURL, err := url.Parse(conf.URL)
|
||||
conf := config.NewConfig()
|
||||
configFile, err := conf.ReadCLI()
|
||||
if err != nil {
|
||||
utils.PrintErrAndExit(err)
|
||||
}
|
||||
requestConf := &config.RequestConfig{
|
||||
Method: conf.Method,
|
||||
URL: parsedURL,
|
||||
Timeout: time.Duration(conf.Timeout) * time.Millisecond,
|
||||
DodosCount: conf.DodosCount,
|
||||
RequestCount: conf.RequestCount,
|
||||
Params: jsonConf.Params,
|
||||
Headers: jsonConf.Headers,
|
||||
Cookies: jsonConf.Cookies,
|
||||
Proxies: jsonConf.Proxies,
|
||||
Body: jsonConf.Body,
|
||||
Yes: cliConf.Yes.ValueOr(false),
|
||||
NoProxyCheck: conf.NoProxyCheck.ValueOr(false),
|
||||
}
|
||||
requestConf.Print()
|
||||
if !cliConf.Yes.ValueOr(false) {
|
||||
response := readers.CLIYesOrNoReader("Do you want to continue?", true)
|
||||
if !response {
|
||||
utils.PrintAndExit("Exiting...")
|
||||
|
||||
if configFile.String() != "" {
|
||||
tempConf := config.NewConfig()
|
||||
if err := tempConf.ReadFile(configFile); err != nil {
|
||||
utils.PrintErrAndExit(err)
|
||||
}
|
||||
tempConf.MergeConfig(conf)
|
||||
conf = tempConf
|
||||
}
|
||||
conf.SetDefaults()
|
||||
|
||||
if errs := conf.Validate(); len(errs) > 0 {
|
||||
utils.PrintErrAndExit(errors.Join(errs...))
|
||||
}
|
||||
|
||||
requestConf := config.NewRequestConfig(conf)
|
||||
requestConf.Print()
|
||||
|
||||
if !requestConf.Yes {
|
||||
response := config.CLIYesOrNoReader("Do you want to continue?", false)
|
||||
if !response {
|
||||
utils.PrintAndExit("Exiting...\n")
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
sigChan := make(chan os.Signal, 1)
|
||||
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
||||
go func() {
|
||||
<-sigChan
|
||||
cancel()
|
||||
}()
|
||||
go listenForTermination(func() { cancel() })
|
||||
|
||||
responses, err := requests.Run(ctx, requestConf)
|
||||
if err != nil {
|
||||
if customerrors.Is(err, customerrors.ErrInterrupt) {
|
||||
color.Yellow(err.Error())
|
||||
return
|
||||
} else if customerrors.Is(err, customerrors.ErrNoInternet) {
|
||||
utils.PrintAndExit("No internet connection")
|
||||
if err == types.ErrInterrupt {
|
||||
fmt.Println(text.FgYellow.Sprint(err.Error()))
|
||||
return
|
||||
}
|
||||
utils.PrintErrAndExit(err)
|
||||
@@ -121,3 +60,10 @@ func main() {
|
||||
|
||||
responses.Print()
|
||||
}
|
||||
|
||||
func listenForTermination(do func()) {
|
||||
sigChan := make(chan os.Signal, 1)
|
||||
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-sigChan
|
||||
do()
|
||||
}
|
||||
|
Reference in New Issue
Block a user