diff --git a/main.go b/main.go index 4bb7ba9..cb26a9d 100755 --- a/main.go +++ b/main.go @@ -31,17 +31,19 @@ func main() { } } +var bodyRepeat, n int +var path, host, method, body, headers, brandID, userID, issuer, basicAuth, claims string +var ca, cert, key, secret string +var needJWT, verbose, jsonPP, quiet, responseHeaders bool +var timeout, lag time.Duration + func Main() error { - var bodyRepeat int - var path, host, method, body, headers, brandID, userID, issuer, basicAuth, claims string - var ca, cert, key, secret string - var needJWT, verbose, jsonPP, quiet bool - var timeout, lag time.Duration flag.StringVar(&method, "method", "get", "method for request") flag.StringVar(&path, "path", "fieldsetdefinitions/v1/index/surveys/SV_031sm3MMOPSa8Tz/fieldsets?assumeHasPermission=true", "path for request") flag.StringVar(&host, "host", "data-platform.service.b1-prv.consul:8080", "host and port for request") flag.StringVar(&body, "body", "", "body for request") flag.IntVar(&bodyRepeat, "bodyrepeat", 1, "repeat body for request") + flag.IntVar(&n, "n", 1, "how many times to execute") flag.StringVar(&brandID, "brand", "testencresponse", "brandID for request JWT") flag.StringVar(&userID, "user", "breel", "userid for request JWT") flag.StringVar(&basicAuth, "auth", "", "comma separated user,password for basic auth") @@ -50,6 +52,7 @@ func Main() error { flag.BoolVar(&needJWT, "jwt", true, "need jwt boolean") flag.BoolVar(&jsonPP, "jpp", true, "try json pretty print") flag.BoolVar(&verbose, "v", false, "is verbose") + flag.BoolVar(&responseHeaders, "i", false, "print response headers") flag.BoolVar(&quiet, "q", false, "is quiet") flag.DurationVar(&timeout, "t", time.Second*10, "request timeout") flag.DurationVar(&lag, "lag", time.Second*0, "writing request lag after connecting") @@ -69,6 +72,15 @@ func Main() error { host = "http://" + host } + for i := 0; i < n; i++ { + if err := do(); err != nil { + return err + } + } + return nil +} + +func do() error { c := makeClient(timeout, ca, cert, key) var reqBody io.Reader if bodyRepeat >= 1 { @@ -85,14 +97,16 @@ func Main() error { if err != nil { return err } - req.Header.Set("brandId", brandID) req.Header.Set("Content-Type", "application/json") if len(headers) > 0 { for _, pair := range strings.Split(headers, ",") { kv := strings.Split(pair, "=") - req.Header.Set(kv[0], kv[1]) + req.Header.Add(kv[0], strings.Join(kv[1:], "=")) } } + if req.Header.Get("brandId") == "" { + req.Header.Set("brandId", brandID) + } if needJWT { setJWT(verbose, req, brandID, userID, issuer, secret, claims) } @@ -105,7 +119,10 @@ func Main() error { } if verbose { - fmt.Fprintf(os.Stderr, "%v\n", req) + fmt.Fprintf(os.Stderr, "%+v\n", req) + for k, v := range req.Header { + fmt.Fprintf(os.Stderr, "\t[%s] = (%d) %+v\n", k, len(v), v) + } } start := time.Now() resp, err := c.Do(req) @@ -113,9 +130,6 @@ func Main() error { if err != nil { return fmt.Errorf("DO failed: %v", err) } - if verbose { - fmt.Fprintf(os.Stderr, "%v\n", resp.Header) - } b, err := ioutil.ReadAll(resp.Body) if err != nil { return fmt.Errorf("READ BODY failed: %v", err) @@ -123,6 +137,16 @@ func Main() error { defer resp.Body.Close() fmt.Fprintf(os.Stderr, "(%d / %v) ", resp.StatusCode, elapsed) + if responseHeaders || verbose { + f := os.Stdout + if verbose { + f = os.Stderr + } + fmt.Fprintf(f, "\n") + for k := range resp.Header { + fmt.Fprintf(f, "%s: %s\n", k, resp.Header.Get(k)) + } + } if jsonPP { var v interface{} if err := json.Unmarshal(b, &v); err == nil { @@ -169,7 +193,8 @@ func makeClient(timeout time.Duration, ca, cert, key string) *http.Client { func setJWT(verbose bool, r *http.Request, brandID, userID string, issuer, secret, claims string) { signer := &jwt.Signer{ - Key: []byte(secret), + Timeout: time.Hour, + Key: []byte(secret), DefaultClaims: jwt.Claims{ Audience: "qualtrics", Issuer: issuer, @@ -195,7 +220,7 @@ func setJWT(verbose bool, r *http.Request, brandID, userID string, issuer, secre } if verbose { - log.Println(*signer) + log.Printf("%+v", *signer) } }