master
Bel LaPointe 2021-09-07 11:07:13 -06:00
parent ca9c1b5f7c
commit db23e9152a
1 changed files with 38 additions and 13 deletions

49
main.go
View File

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