diff --git a/jira.go b/jira.go index aee7305..2288b34 100644 --- a/jira.go +++ b/jira.go @@ -97,8 +97,6 @@ func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) { return nil, err } - defer resp.Body.Close() - err = CheckResponse(resp) if err != nil { // Even though there was an error, we still return the response @@ -107,6 +105,8 @@ func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) { } if v != nil { + // Open a NewDecoder and defer closing the reader only if there is a provided interface to decode to + defer resp.Body.Close() err = json.NewDecoder(resp.Body).Decode(v) } diff --git a/jira_test.go b/jira_test.go index 33dd63d..6f3a9a9 100644 --- a/jira_test.go +++ b/jira_test.go @@ -215,6 +215,33 @@ func TestDo(t *testing.T) { } } +func TestDo_HTTPResponse(t *testing.T) { + setup() + defer teardown() + + type foo struct { + A string + } + + testMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + if m := "GET"; m != r.Method { + t.Errorf("Request method = %v, want %v", r.Method, m) + } + fmt.Fprint(w, `{"A":"a"}`) + }) + + req, _ := testClient.NewRequest("GET", "/", nil) + body := new(foo) + res, _ := testClient.Do(req, body) + _, err := ioutil.ReadAll(res.Body) + + if err != nil { + t.Errorf("Error on parsing HTTP Response = %v", err.Error()) + } else if res.StatusCode != 200 { + t.Errorf("Response code = %v, want %v", res.StatusCode, 200) + } +} + func TestDo_HTTPError(t *testing.T) { setup() defer teardown()