205 lines
3.9 KiB
Go
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
|
|
}
|