From 41c8aca42456af4d475b751bd5330b2c4fcf083c Mon Sep 17 00:00:00 2001 From: debugtalk Date: Thu, 30 Sep 2021 10:34:40 +0800 Subject: [PATCH] feat: parseHeaders --- examples/postman_echo/variables_test.go | 13 ++++++++---- parser.go | 27 ++++++++++++++++++++----- runner.go | 4 ++-- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/examples/postman_echo/variables_test.go b/examples/postman_echo/variables_test.go index 3fc6b3f7..e184034b 100644 --- a/examples/postman_echo/variables_test.go +++ b/examples/postman_echo/variables_test.go @@ -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"), }, } diff --git a/parser.go b/parser.go index d32026b4..d19b9e08 100644 --- a/parser.go +++ b/parser.go @@ -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: diff --git a/runner.go b/runner.go index a2747e90..971ef76b 100644 --- a/runner.go +++ b/runner.go @@ -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)