From fd5359c02d8f87b207c517886b9b7dd917c48211 Mon Sep 17 00:00:00 2001 From: buyuxiang <347586493@qq.com> Date: Wed, 3 Aug 2022 16:14:57 +0800 Subject: [PATCH] feat: support curl command --- hrp/cmd/dial.go | 15 ++++++++ hrp/internal/dial/curl.go | 72 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 hrp/internal/dial/curl.go diff --git a/hrp/cmd/dial.go b/hrp/cmd/dial.go index cb602234..df14f3b1 100644 --- a/hrp/cmd/dial.go +++ b/hrp/cmd/dial.go @@ -61,6 +61,19 @@ var traceRouteCmd = &cobra.Command{ }, } +var curlCmd = &cobra.Command{ + Use: "curl $url", + Short: "run integrated curl command", + Args: cobra.MinimumNArgs(1), + DisableFlagParsing: true, + PreRun: func(cmd *cobra.Command, args []string) { + setLogLevel(logLevel) + }, + RunE: func(cmd *cobra.Command, args []string) error { + return dial.DoCurl(args) + }, +} + func init() { rootCmd.AddCommand(pingCmd) pingCmd.Flags().IntVarP(&pingOptions.Count, "count", "c", 10, "Stop after sending (and receiving) N packets") @@ -78,4 +91,6 @@ func init() { traceRouteCmd.Flags().IntVarP(&traceRouteOptions.MaxTTL, "max-hops", "m", 30, "Set the max number of hops (max TTL to be reached)") traceRouteCmd.Flags().IntVarP(&traceRouteOptions.Queries, "queries", "q", 1, "Set the number of probes per each hop") traceRouteCmd.Flags().BoolVar(&traceRouteOptions.SaveTests, "save-tests", false, "Save traceroute result as json") + + rootCmd.AddCommand(curlCmd) } diff --git a/hrp/internal/dial/curl.go b/hrp/internal/dial/curl.go new file mode 100644 index 00000000..8cd3436a --- /dev/null +++ b/hrp/internal/dial/curl.go @@ -0,0 +1,72 @@ +package dial + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "path/filepath" + "time" + + "github.com/rs/zerolog/log" + + "github.com/httprunner/httprunner/v4/hrp/internal/builtin" +) + +const ( + normalResult = "STDOUT" + errorResult = "STDERR" + failedResult = "FAILED" +) + +type CurlResult struct { + Result string `json:"result"` + ErrorMsg string `json:"errorMsg"` + ResultType string `json:"resultType"` +} + +func DoCurl(args []string) (err error) { + var saveTests bool + for i, arg := range args { + if arg == "--save-tests" { + args = append(args[:i], args[i+1:]...) + saveTests = true + } + } + var curlResult CurlResult + defer func() { + if saveTests { + dir, _ := os.Getwd() + curlResultName := fmt.Sprintf("curl_result_%v.json", time.Now().Format("20060102150405")) + curlResultPath := filepath.Join(dir, curlResultName) + err = builtin.Dump2JSON(curlResult, curlResultPath) + if err != nil { + log.Error().Err(err).Msg("save dns resolution result failed") + } + } + }() + + cmd := exec.Command("curl", args...) + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + err = cmd.Run() + if err != nil { + log.Error().Err(err).Msgf("fail to run curl command") + curlResult.ErrorMsg = err.Error() + curlResult.Result = stderr.String() + curlResult.ResultType = errorResult + return + } + if stdout.String() != "" { + fmt.Printf(stdout.String()) + curlResult.Result = stdout.String() + curlResult.ResultType = normalResult + } else if stderr.String() != "" { + fmt.Printf(stderr.String()) + curlResult.ErrorMsg = stderr.String() + curlResult.ResultType = errorResult + } + return +}