feat: parseHeaders

This commit is contained in:
debugtalk
2021-09-30 10:37:38 +08:00
parent 11a77f0189
commit 41c8aca424
3 changed files with 33 additions and 11 deletions
+9 -4
View File
@@ -15,16 +15,21 @@ func TestCaseVariables(t *testing.T) {
}, },
TestSteps: []httpboomer.IStep{ TestSteps: []httpboomer.IStep{
httpboomer.Step("get with params"). 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"). GET("/get").
WithParams(map[string]interface{}{"foo1": "$var1", "foo2": "bar2"}). WithParams(map[string]interface{}{"foo1": "$var1", "foo2": "bar2"}).
WithHeaders(map[string]string{"User-Agent": "HttpBoomer"}). WithHeaders(map[string]string{"User-Agent": "$agent"}).
Validate(). Validate().
AssertEqual("status_code", "$expectedStatusCode", "check status code"). AssertEqual("status_code", "$expectedStatusCode", "check status code").
AssertEqual("headers.Connection", "keep-alive", "check header Connection"). AssertEqual("headers.Connection", "keep-alive", "check header Connection").
AssertEqual("headers.\"Content-Type\"", "application/json; charset=utf-8", "check header Content-Type"). AssertEqual("headers.\"Content-Type\"", "application/json; charset=utf-8", "check header Content-Type").
AssertEqual("body.args.foo1", "$var1", "check args foo1"). AssertEqual("body.args.foo1", "bar1", "check args foo1").
AssertEqual("body.args.foo2", "bar2", "check args foo2"), AssertEqual("body.args.foo2", "bar2", "check args foo2").
AssertEqual("body.headers.\"user-agent\"", "HttpBoomer", "check header user agent"),
}, },
} }
+22 -5
View File
@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"log" "log"
"net/url" "net/url"
"reflect"
"regexp" "regexp"
"strings" "strings"
) )
@@ -31,15 +32,31 @@ func buildURL(baseURL, stepURL string) string {
return uStep.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{} { func parseData(raw interface{}, variablesMapping map[string]interface{}) interface{} {
switch value := raw.(type) { rawValue := reflect.ValueOf(raw)
case string: switch rawValue.Kind() {
case reflect.String:
value := rawValue.String()
value = strings.TrimSpace(value) value = strings.TrimSpace(value)
return parseString(value, variablesMapping) return parseString(value, variablesMapping)
case map[string]interface{}: case reflect.Map: // convert any map to map[string]interface{}
parsedMap := make(map[string]interface{}) parsedMap := make(map[string]interface{})
for k, v := range value { for _, k := range rawValue.MapKeys() {
parsedMap[k] = parseData(v, variablesMapping) v := rawValue.MapIndex(k)
parsedMap[k.String()] = parseData(v.Interface(), variablesMapping)
} }
return parsedMap return parsedMap
default: default:
+2 -2
View File
@@ -78,8 +78,8 @@ func (r *Runner) runStepRequest(step *TStep) error {
// prepare request args // prepare request args
var v []interface{} var v []interface{}
if len(step.Request.Headers) > 0 { if len(step.Request.Headers) > 0 {
headers := parseData(step.Request.Headers, step.Variables) headers := parseHeaders(step.Request.Headers, step.Variables)
v = append(v, req.Header(headers.(map[string]string))) v = append(v, req.Header(headers))
} }
if len(step.Request.Params) > 0 { if len(step.Request.Params) > 0 {
params := parseData(step.Request.Params, step.Variables) params := parseData(step.Request.Params, step.Variables)