From 2086ecb3d13a31f46a96c2573ee3ad5a94fcccec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Fri, 17 Jul 2020 18:22:55 +0200 Subject: [PATCH] Fix printing network error in case for failed HTTP requests The CheckScopes middleware tried to read from `res.Headers` before it verified that `res` is available. --- api/client.go | 8 ++++++-- api/client_test.go | 14 +++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/api/client.go b/api/client.go index 89f8e75a0..f504269d8 100644 --- a/api/client.go +++ b/api/client.go @@ -104,11 +104,15 @@ func CheckScopes(wantedScope string, cb func(string) error) ClientOption { return func(tr http.RoundTripper) http.RoundTripper { return &funcTripper{roundTrip: func(req *http.Request) (*http.Response, error) { res, err := tr.RoundTrip(req) - _, hasHeader := res.Header[httpOAuthAppID] - if err != nil || res.StatusCode > 299 || !hasHeader || issuedScopesWarning { + if err != nil || res.StatusCode > 299 || issuedScopesWarning { return res, err } + _, hasHeader := res.Header[httpOAuthAppID] + if !hasHeader { + return res, nil + } + appID := res.Header.Get(httpOAuthAppID) hasScopes := strings.Split(res.Header.Get(httpOAuthScopes), ",") diff --git a/api/client_test.go b/api/client_test.go index 7f692eee1..7307ce2b6 100644 --- a/api/client_test.go +++ b/api/client_test.go @@ -102,6 +102,7 @@ func Test_CheckScopes(t *testing.T) { wantScope string responseApp string responseScopes string + responseError error expectCallback bool }{ { @@ -132,11 +133,22 @@ func Test_CheckScopes(t *testing.T) { responseScopes: "", expectCallback: false, }, + { + name: "errored response", + wantScope: "read:org", + responseApp: "", + responseScopes: "", + responseError: errors.New("Network Failed"), + expectCallback: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tr := &httpmock.Registry{} tr.Register(httpmock.MatchAny, func(*http.Request) (*http.Response, error) { + if tt.responseError != nil { + return nil, tt.responseError + } if tt.responseScopes == "" { return &http.Response{StatusCode: 200}, nil } @@ -165,7 +177,7 @@ func Test_CheckScopes(t *testing.T) { issuedScopesWarning = false _, err = rt.RoundTrip(req) - if err != nil { + if err != nil && !errors.Is(err, tt.responseError) { t.Fatalf("unexpected error: %v", err) }