feat: parseHeaders

This commit is contained in:
debugtalk
2021-09-30 10:34:40 +08:00
parent 11a77f0189
commit 41c8aca424
3 changed files with 33 additions and 11 deletions

View File

@@ -15,16 +15,21 @@ func TestCaseVariables(t *testing.T) {
},
TestSteps: []httpboomer.IStep{
httpboomer.Step("get with params").
WithVariables(map[string]interface{}{"var1": "bar1", "expectedStatusCode": 200}).
WithVariables(map[string]interface{}{
"var1": "bar1",
"agent": "HttpBoomer",
"expectedStatusCode": 200,
}).
GET("/get").
WithParams(map[string]interface{}{"foo1": "$var1", "foo2": "bar2"}).
WithHeaders(map[string]string{"User-Agent": "HttpBoomer"}).
WithHeaders(map[string]string{"User-Agent": "$agent"}).
Validate().
AssertEqual("status_code", "$expectedStatusCode", "check status code").
AssertEqual("headers.Connection", "keep-alive", "check header Connection").
AssertEqual("headers.\"Content-Type\"", "application/json; charset=utf-8", "check header Content-Type").
AssertEqual("body.args.foo1", "$var1", "check args foo1").
AssertEqual("body.args.foo2", "bar2", "check args foo2"),
AssertEqual("body.args.foo1", "bar1", "check args foo1").
AssertEqual("body.args.foo2", "bar2", "check args foo2").
AssertEqual("body.headers.\"user-agent\"", "HttpBoomer", "check header user agent"),
},
}

View File

@@ -4,6 +4,7 @@ import (
"fmt"
"log"
"net/url"
"reflect"
"regexp"
"strings"
)
@@ -31,15 +32,31 @@ func buildURL(baseURL, stepURL string) string {
return uStep.String()
}
func parseHeaders(rawHeaders map[string]string, variablesMapping map[string]interface{}) map[string]string {
parsedHeaders := make(map[string]string)
for k, v := range rawHeaders {
parsedValue := parseString(v, variablesMapping)
if value, ok := parsedValue.(string); ok {
parsedHeaders[k] = value
} else {
parsedHeaders[k] = fmt.Sprintf("%v", parsedValue)
}
}
return parsedHeaders
}
func parseData(raw interface{}, variablesMapping map[string]interface{}) interface{} {
switch value := raw.(type) {
case string:
rawValue := reflect.ValueOf(raw)
switch rawValue.Kind() {
case reflect.String:
value := rawValue.String()
value = strings.TrimSpace(value)
return parseString(value, variablesMapping)
case map[string]interface{}:
case reflect.Map: // convert any map to map[string]interface{}
parsedMap := make(map[string]interface{})
for k, v := range value {
parsedMap[k] = parseData(v, variablesMapping)
for _, k := range rawValue.MapKeys() {
v := rawValue.MapIndex(k)
parsedMap[k.String()] = parseData(v.Interface(), variablesMapping)
}
return parsedMap
default:

View File

@@ -78,8 +78,8 @@ func (r *Runner) runStepRequest(step *TStep) error {
// prepare request args
var v []interface{}
if len(step.Request.Headers) > 0 {
headers := parseData(step.Request.Headers, step.Variables)
v = append(v, req.Header(headers.(map[string]string)))
headers := parseHeaders(step.Request.Headers, step.Variables)
v = append(v, req.Header(headers))
}
if len(step.Request.Params) > 0 {
params := parseData(step.Request.Params, step.Variables)