From fcfe2432e0e1cc6cf732a2c82d8348b94b6f4491 Mon Sep 17 00:00:00 2001 From: FFMMM Date: Mon, 27 Sep 2021 09:22:48 -0700 Subject: [PATCH 1/3] wrap getInternal doRequest call in requireHttpCodes Signed-off-by: FFMMM --- api/kv.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/kv.go b/api/kv.go index 1d5c11295e97..51e2bef757e9 100644 --- a/api/kv.go +++ b/api/kv.go @@ -129,6 +129,8 @@ func (k *KV) getInternal(key string, params map[string]string, q *QueryOptions) r.params.Set(param, val) } rtt, resp, err := k.c.doRequest(r) + rtt, resp, err = requireHttpCodes(rtt, resp, err, 200, 404) + if err != nil { return nil, nil, err } From 437200d0997fab5aabb11968f28dd0d3eee8c76d Mon Sep 17 00:00:00 2001 From: FFMMM Date: Mon, 27 Sep 2021 10:04:00 -0700 Subject: [PATCH 2/3] refactor degub.go to use requireOK for doRequest calls Signed-off-by: FFMMM --- api/debug.go | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/api/debug.go b/api/debug.go index 2e7bb94b5b27..326ac3bc8332 100644 --- a/api/debug.go +++ b/api/debug.go @@ -25,16 +25,12 @@ func (c *Client) Debug() *Debug { // Heap returns a pprof heap dump func (d *Debug) Heap() ([]byte, error) { r := d.c.newRequest("GET", "/debug/pprof/heap") - _, resp, err := d.c.doRequest(r) + _, resp, err := requireOK(d.c.doRequest(r)) if err != nil { return nil, fmt.Errorf("error making request: %s", err) } defer closeResponseBody(resp) - if resp.StatusCode != 200 { - return nil, generateUnexpectedResponseCodeError(resp) - } - // We return a raw response because we're just passing through a response // from the pprof handlers body, err := ioutil.ReadAll(resp.Body) @@ -52,16 +48,12 @@ func (d *Debug) Profile(seconds int) ([]byte, error) { // Capture a profile for the specified number of seconds r.params.Set("seconds", strconv.Itoa(seconds)) - _, resp, err := d.c.doRequest(r) + _, resp, err := requireOK(d.c.doRequest(r)) if err != nil { return nil, fmt.Errorf("error making request: %s", err) } defer closeResponseBody(resp) - if resp.StatusCode != 200 { - return nil, generateUnexpectedResponseCodeError(resp) - } - // We return a raw response because we're just passing through a response // from the pprof handlers body, err := ioutil.ReadAll(resp.Body) @@ -81,14 +73,11 @@ func (d *Debug) PProf(ctx context.Context, name string, seconds int) (io.ReadClo // Capture a profile for the specified number of seconds r.params.Set("seconds", strconv.Itoa(seconds)) - _, resp, err := d.c.doRequest(r) + _, resp, err := requireOK(d.c.doRequest(r)) if err != nil { return nil, fmt.Errorf("error making request: %s", err) } - if resp.StatusCode != 200 { - return nil, generateUnexpectedResponseCodeError(resp) - } return resp.Body, nil } @@ -99,16 +88,12 @@ func (d *Debug) Trace(seconds int) ([]byte, error) { // Capture a trace for the specified number of seconds r.params.Set("seconds", strconv.Itoa(seconds)) - _, resp, err := d.c.doRequest(r) + _, resp, err := requireOK(d.c.doRequest(r)) if err != nil { return nil, fmt.Errorf("error making request: %s", err) } defer closeResponseBody(resp) - if resp.StatusCode != 200 { - return nil, generateUnexpectedResponseCodeError(resp) - } - // We return a raw response because we're just passing through a response // from the pprof handlers body, err := ioutil.ReadAll(resp.Body) @@ -123,16 +108,12 @@ func (d *Debug) Trace(seconds int) ([]byte, error) { func (d *Debug) Goroutine() ([]byte, error) { r := d.c.newRequest("GET", "/debug/pprof/goroutine") - _, resp, err := d.c.doRequest(r) + _, resp, err := requireOK(d.c.doRequest(r)) if err != nil { return nil, fmt.Errorf("error making request: %s", err) } defer closeResponseBody(resp) - if resp.StatusCode != 200 { - return nil, generateUnexpectedResponseCodeError(resp) - } - // We return a raw response because we're just passing through a response // from the pprof handlers body, err := ioutil.ReadAll(resp.Body) From 7ad59828cf209e61ff5569d674dddfd0a79723bb Mon Sep 17 00:00:00 2001 From: FFMMM Date: Mon, 27 Sep 2021 11:43:54 -0700 Subject: [PATCH 3/3] refactor updateTokenOnce to use requireOK Signed-off-by: FFMMM --- api/agent.go | 27 ++++++++++++++++----------- api/kv.go | 4 +--- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/api/agent.go b/api/agent.go index 6b81367818ff..feac04e7e748 100644 --- a/api/agent.go +++ b/api/agent.go @@ -2,8 +2,8 @@ package api import ( "bufio" - "bytes" "context" + "errors" "fmt" "io" "net/http" @@ -602,6 +602,8 @@ func (a *Agent) AgentHealthServiceByIDOpts(serviceID string, q *QueryOptions) (s r.setQueryOptions(q) r.params.Add("format", "json") r.header.Set("Accept", "application/json") + // not a lot of value in wrapping the doRequest call in a requireHttpCodes call + // we manipulate the resp body and the require calls "swallow" the content on err _, resp, err := a.c.doRequest(r) if err != nil { return "", nil, err @@ -641,6 +643,8 @@ func (a *Agent) AgentHealthServiceByNameOpts(service string, q *QueryOptions) (s r.setQueryOptions(q) r.params.Add("format", "json") r.header.Set("Accept", "application/json") + // not a lot of value in wrapping the doRequest call in a requireHttpCodes call + // we manipulate the resp body and the require calls "swallow" the content on err _, resp, err := a.c.doRequest(r) if err != nil { return "", nil, err @@ -1233,19 +1237,20 @@ func (a *Agent) updateTokenOnce(target, token string, q *WriteOptions) (*WriteMe r.setWriteOptions(q) r.obj = &AgentToken{Token: token} - rtt, resp, err := a.c.doRequest(r) - if err != nil { - return nil, 0, err - } - defer closeResponseBody(resp) - + rtt, resp, err := requireOK(a.c.doRequest(r)) wm := &WriteMeta{RequestTime: rtt} - if resp.StatusCode != 200 { - var buf bytes.Buffer - io.Copy(&buf, resp.Body) - return wm, resp.StatusCode, fmt.Errorf("Unexpected response code: %d (%s)", resp.StatusCode, buf.Bytes()) + if err != nil { + // if the error was bc of a non 200 response + // from requireOK + var statusE StatusError + if errors.As(err, &statusE) { + return wm, statusE.Code, statusE + } + // otherwise, the error came via doRequest + return nil, 500, err } + defer closeResponseBody(resp) return wm, resp.StatusCode, nil } diff --git a/api/kv.go b/api/kv.go index 51e2bef757e9..300a73ece4f8 100644 --- a/api/kv.go +++ b/api/kv.go @@ -142,10 +142,8 @@ func (k *KV) getInternal(key string, params map[string]string, q *QueryOptions) if resp.StatusCode == 404 { closeResponseBody(resp) return nil, qm, nil - } else if resp.StatusCode != 200 { - closeResponseBody(resp) - return nil, nil, fmt.Errorf("Unexpected response code: %d", resp.StatusCode) } + return resp, qm, nil }