go_dreamfactory/stress/server/golink/http_link.go
2022-11-24 21:30:50 +08:00

106 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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