go_dreamfactory/stress/model/curl_model.go
2022-11-24 21:30:50 +08:00

205 lines
3.9 KiB
Go

// Package model 数据模型
package model
import (
"encoding/json"
"errors"
"io/ioutil"
"os"
"strings"
"go_dreamfactory/stress/helper"
)
// CURL curl参数解析
type CURL struct {
Data map[string][]string
}
// getDataValue 获取数据
func (c *CURL) getDataValue(keys []string) []string {
var (
value = make([]string, 0)
)
for _, key := range keys {
var (
ok bool
)
value, ok = c.Data[key]
if ok {
break
}
}
return value
}
// ParseTheFile 从文件中解析curl
func ParseTheFile(path string) (curl *CURL, err error) {
if path == "" {
err = errors.New("路径不能为空")
return
}
curl = &CURL{
Data: make(map[string][]string),
}
file, err := os.Open(path)
if err != nil {
err = errors.New("打开文件失败:" + err.Error())
return
}
defer func() {
_ = file.Close()
}()
dataBytes, err := ioutil.ReadAll(file)
if err != nil {
err = errors.New("读取文件失败:" + err.Error())
return
}
data := string(dataBytes)
for len(data) > 0 {
if strings.HasPrefix(data, "curl") {
data = data[5:]
}
data = strings.TrimSpace(data)
var (
key string
value string
)
index := strings.Index(data, " ")
if index <= 0 {
break
}
key = strings.TrimSpace(data[:index])
data = data[index+1:]
data = strings.TrimSpace(data)
// url
if !strings.HasPrefix(key, "-") {
key = strings.Trim(key, "'")
curl.Data["curl"] = []string{key}
// 去除首尾空格
data = strings.TrimFunc(data, func(r rune) bool {
if r == ' ' || r == '\\' || r == '\n' {
return true
}
return false
})
continue
}
if strings.HasPrefix(data, "-") {
continue
}
var (
endSymbol = " "
)
if strings.HasPrefix(data, "'") {
endSymbol = "'"
data = data[1:]
}
index = strings.Index(data, endSymbol)
if index <= -1 {
index = len(data)
// break
}
value = data[:index]
if len(data) >= index+1 {
data = data[index+1:]
} else {
data = ""
}
// 去除首尾空格
data = strings.TrimFunc(data, func(r rune) bool {
if r == ' ' || r == '\\' || r == '\n' {
return true
}
return false
})
if key == "" {
continue
}
curl.Data[key] = append(curl.Data[key], value)
}
return
}
// String string
func (c *CURL) String() (url string) {
curlByte, _ := json.Marshal(c)
return string(curlByte)
}
// GetURL 获取url
func (c *CURL) GetURL() (url string) {
keys := []string{"curl", "--url"}
value := c.getDataValue(keys)
if len(value) <= 0 {
return
}
url = value[0]
return
}
// GetMethod 获取 请求方式
func (c *CURL) GetMethod() (method string) {
keys := []string{"-X", "--request"}
value := c.getDataValue(keys)
if len(value) <= 0 {
return c.defaultMethod()
}
method = strings.ToUpper(value[0])
if helper.InArrayStr(method, []string{"GET", "POST", "PUT", "DELETE"}) {
return method
}
return c.defaultMethod()
}
// defaultMethod 获取默认方法
func (c *CURL) defaultMethod() (method string) {
method = "GET"
body := c.GetBody()
if len(body) > 0 {
return "POST"
}
return
}
// GetHeaders 获取请求头
func (c *CURL) GetHeaders() (headers map[string]string) {
headers = make(map[string]string, 0)
keys := []string{"-H", "--header"}
value := c.getDataValue(keys)
for _, v := range value {
getHeaderValue(v, headers)
}
return
}
// GetHeadersStr 获取请求头string
func (c *CURL) GetHeadersStr() string {
headers := c.GetHeaders()
bytes, _ := json.Marshal(&headers)
return string(bytes)
}
// GetBody 获取body
func (c *CURL) GetBody() (body string) {
keys := []string{"--data", "-d", "--data-urlencode", "--data-raw", "--data-binary"}
value := c.getDataValue(keys)
if len(value) <= 0 {
body = c.getPostForm()
return
}
body = value[0]
return
}
// getPostForm get post form
func (c *CURL) getPostForm() (body string) {
keys := []string{"--form", "-F", "--form-string"}
value := c.getDataValue(keys)
if len(value) <= 0 {
return
}
body = strings.Join(value, "&")
return
}