Skip to content

Commit

Permalink
Merge pull request #59 from link1st/feature/code_standard
Browse files Browse the repository at this point in the history
feat: code standard
  • Loading branch information
link1st committed Apr 14, 2021
2 parents 537c368 + 27f1c3f commit 0a3056a
Show file tree
Hide file tree
Showing 24 changed files with 293 additions and 620 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -569,8 +569,7 @@ go version: go1.12.9 linux/amd64

- go server

```golang
package main
```golangpackage main
import (
"log"
Expand Down
9 changes: 1 addition & 8 deletions helper/helper.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
/**
* Created by GoLand.
* User: link1st
* Date: 2019-08-21
* Time: 15:40
*/

// Package helper 帮助函数,时间、数组的通用处理
package helper

import (
Expand All @@ -27,4 +21,3 @@ func InArrayStr(str string, arr []string) (inArray bool) {
}
return
}

46 changes: 19 additions & 27 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,27 +1,25 @@
/**
* Created by GoLand.
* User: link1st
* Date: 2019-08-15
* Time: 13:44
*/

// Package main go 实现的压测工具
package main

import (
"flag"
"fmt"
"go-stress-testing/model"
"go-stress-testing/server"
"runtime"
"strings"

"go-stress-testing/model"
"go-stress-testing/server"
)

// array 自定义数组参数
type array []string

// String string
func (a *array) String() string {
return fmt.Sprint(*a)
}

// Set set
func (a *array) Set(s string) error {
*a = append(*a, s)

Expand All @@ -32,53 +30,47 @@ var (
concurrency uint64 = 1 // 并发数
totalNumber uint64 = 1 // 请求数(单个并发/协程)
debugStr = "false" // 是否是debug
requestUrl string // 压测的url 目前支持,http/https ws/wss
path string // curl文件路径 http接口压测,自定义参数设置
verify string // verify 验证方法 在server/verify中 http 支持:statusCode、json webSocket支持:json
requestURL = "" // 压测的url 目前支持,http/https ws/wss
path = "" // curl文件路径 http接口压测,自定义参数设置
verify = "" // verify 验证方法 在server/verify中 http 支持:statusCode、json webSocket支持:json
headers array // 自定义头信息传递给服务器
body string // HTTP POST方式传送数据
body = "" // HTTP POST方式传送数据
)

func init() {
flag.Uint64Var(&concurrency, "c", concurrency, "并发数")
flag.Uint64Var(&totalNumber, "n", totalNumber, "请求数(单个并发/协程)")
flag.StringVar(&debugStr, "d", debugStr, "调试模式")
flag.StringVar(&requestUrl, "u", "", "压测地址")
flag.StringVar(&path, "p", "", "curl文件路径")
flag.StringVar(&verify, "v", "", "验证方法 http 支持:statusCode、json webSocket支持:json")
flag.StringVar(&requestURL, "u", requestURL, "压测地址")
flag.StringVar(&path, "p", path, "curl文件路径")
flag.StringVar(&verify, "v", verify, "验证方法 http 支持:statusCode、json webSocket支持:json")
flag.Var(&headers, "H", "自定义头信息传递给服务器 示例:-H 'Content-Type: application/json'")
flag.StringVar(&body, "data", "", "HTTP POST方式传送数据")
flag.StringVar(&body, "data", body, "HTTP POST方式传送数据")
// 解析参数
flag.Parse()
}

// go 实现的压测工具
// main go 实现的压测工具
// 编译可执行文件
//go:generate go build main.go
func main() {

runtime.GOMAXPROCS(1)
if concurrency == 0 || totalNumber == 0 || (requestUrl == "" && path == "") {
if concurrency == 0 || totalNumber == 0 || (requestURL == "" && path == "") {
fmt.Printf("示例: go run main.go -c 1 -n 1 -u https://www.baidu.com/ \n")
fmt.Printf("压测地址或curl路径必填 \n")
fmt.Printf("当前请求参数: -c %d -n %d -d %v -u %s \n", concurrency, totalNumber, debugStr, requestUrl)
fmt.Printf("当前请求参数: -c %d -n %d -d %v -u %s \n", concurrency, totalNumber, debugStr, requestURL)
flag.Usage()

return
}
debug := strings.ToLower(debugStr) == "true"
request, err := model.NewRequest(requestUrl, verify, 0, debug, path, headers, body)
request, err := model.NewRequest(requestURL, verify, 0, debug, path, headers, body)
if err != nil {
fmt.Printf("参数不合法 %v \n", err)

return
}

fmt.Printf("\n 开始启动 并发数:%d 请求数:%d 请求参数: \n", concurrency, totalNumber)
request.Print()

// 开始处理
server.Dispose(concurrency, totalNumber, request)

return
}
84 changes: 13 additions & 71 deletions model/curl_model.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
/**
* Created by GoLand.
* User: link1st
* Date: 2019-08-19
* Time: 09:51
*/

// Package model 数据模型
package model

import (
Expand All @@ -17,110 +11,90 @@ import (
"go-stress-testing/helper"
)

// curl参数解析
// 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
}

// 从文件中解析curl
// 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()
_ = 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)
Expand All @@ -132,56 +106,39 @@ func ParseTheFile(path string) (curl *CURL, err error) {
} 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)

// break

}

// debug
// for key, value := range curl.Data {
// fmt.Println("key:", key, "value:", value)
// }

return
}

// String string
func (c *CURL) String() (url string) {
curlByte, _ := json.Marshal(c)

return string(curlByte)
}

// GetUrl
func (c *CURL) GetUrl() (url string) {

// 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
// GetMethod 获取 请求方式
func (c *CURL) GetMethod() (method string) {
keys := []string{"-X", "--request"}
value := c.getDataValue(keys)
Expand All @@ -205,58 +162,43 @@ func (c *CURL) defaultMethod() (method string) {
return
}

// GetHeaders
// 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
}

// GetHeaders
// GetHeadersStr 获取请求头string
func (c *CURL) GetHeadersStr() string {
headers := c.GetHeaders()
bytes, _ := json.Marshal(&headers)

return string(bytes)
}

// 获取body
// 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 = strings.NewReader(value[0])
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
}


Loading

0 comments on commit 0a3056a

Please sign in to comment.