106 lines
2.6 KiB
Go
106 lines
2.6 KiB
Go
// Package golink 连接
|
||
package golink
|
||
|
||
import (
|
||
"compress/gzip"
|
||
"context"
|
||
"fmt"
|
||
"io"
|
||
"io/ioutil"
|
||
"net/http"
|
||
"sync"
|
||
|
||
"go_dreamfactory/stress/model"
|
||
"go_dreamfactory/stress/server/client"
|
||
)
|
||
|
||
// HTTP 请求
|
||
func HTTP(ctx context.Context, chanID uint64, ch chan<- *model.RequestResults, totalNumber uint64, wg *sync.WaitGroup,
|
||
request *model.Request) {
|
||
defer func() {
|
||
wg.Done()
|
||
}()
|
||
// fmt.Printf("启动协程 编号:%05d \n", chanID)
|
||
for i := uint64(0); i < totalNumber; i++ {
|
||
if ctx.Err() != nil {
|
||
fmt.Printf("ctx.Err err: %v \n", ctx.Err())
|
||
break
|
||
}
|
||
|
||
list := getRequestList(request)
|
||
isSucceed, errCode, requestTime, contentLength := sendList(chanID, list)
|
||
requestResults := &model.RequestResults{
|
||
Time: requestTime,
|
||
IsSucceed: isSucceed,
|
||
ErrCode: errCode,
|
||
ReceivedBytes: contentLength,
|
||
}
|
||
requestResults.SetID(chanID, i)
|
||
ch <- requestResults
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
// sendList 多个接口分步压测
|
||
func sendList(chanID uint64, requestList []*model.Request) (isSucceed bool, errCode int, requestTime uint64,
|
||
contentLength int64) {
|
||
errCode = model.HTTPOk
|
||
for _, request := range requestList {
|
||
succeed, code, u, length := send(chanID, request)
|
||
isSucceed = succeed
|
||
errCode = code
|
||
requestTime = requestTime + u
|
||
contentLength = contentLength + length
|
||
if succeed == false {
|
||
break
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
// send 发送一次请求
|
||
func send(chanID uint64, request *model.Request) (bool, int, uint64, int64) {
|
||
var (
|
||
// startTime = time.Now()
|
||
isSucceed = false
|
||
errCode = model.HTTPOk
|
||
contentLength = int64(0)
|
||
err error
|
||
resp *http.Response
|
||
requestTime uint64
|
||
)
|
||
newRequest := getRequest(request)
|
||
|
||
resp, requestTime, err = client.HTTPRequest(chanID, newRequest)
|
||
|
||
if err != nil {
|
||
errCode = model.RequestErr // 请求错误
|
||
} else {
|
||
// 此处原方式获取的数据长度可能是 -1,换成如下方式获取可获取到正确的长度
|
||
contentLength, err = getBodyLength(resp)
|
||
if err != nil {
|
||
contentLength = resp.ContentLength
|
||
}
|
||
// 验证请求是否成功
|
||
errCode, isSucceed = newRequest.GetVerifyHTTP()(newRequest, resp)
|
||
}
|
||
return isSucceed, errCode, requestTime, contentLength
|
||
}
|
||
|
||
// getBodyLength 获取响应数据长度
|
||
func getBodyLength(response *http.Response) (length int64, err error) {
|
||
var reader io.ReadCloser
|
||
switch response.Header.Get("Content-Encoding") {
|
||
case "gzip":
|
||
reader, err = gzip.NewReader(response.Body)
|
||
defer func() {
|
||
_ = reader.Close()
|
||
}()
|
||
default:
|
||
reader = response.Body
|
||
}
|
||
body, err := ioutil.ReadAll(reader)
|
||
return int64(len(body)), err
|
||
}
|