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

51
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 {
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)
}
}