@@ -2,7 +2,6 @@ package providers
22
33import (
44 "context"
5− "encoding/json"
65 "errors"
76 "fmt"
87 "io/ioutil"
@@ -15,6 +14,7 @@ import (
1514
1615 "github.com/oauth2-proxy/oauth2-proxy/pkg/apis/sessions"
1716 "github.com/oauth2-proxy/oauth2-proxy/pkg/logger"
17+ "github.com/oauth2-proxy/oauth2-proxy/pkg/requests"
1818)
1919
2020// GitHubProvider represents an GitHub based Identity Provider
@@ -111,27 +111,16 @@ func (p *GitHubProvider) hasOrg(ctx context.Context, accessToken string) (bool,
111111 Path: path.Join(p.ValidateURL.Path, "/user/orgs"),
112112 RawQuery: params.Encode(),
113113 }
114− req, _ := http.NewRequestWithContext(ctx, "GET", endpoint.String(), nil)
115− req.Header = getGitHubHeader(accessToken)
116− resp, err := http.DefaultClient.Do(req)
117− if err != nil {
118− return false, err
119− }
120114
121− body, err := ioutil.ReadAll(resp.Body)
122− resp.Body.Close()
115+ var op orgsPage
116+ err := requests.New(endpoint.String()).
117+ WithContext(ctx).
118+ WithHeaders(getGitHubHeader(accessToken)).
119+ UnmarshalInto(&op)
123120 if err != nil {
124121 return false, err
125122 }
126− if resp.StatusCode != 200 {
127− return false, fmt.Errorf(
128− "got %d from %q %s", resp.StatusCode, endpoint.String(), body)
129− }
130123
131− var op orgsPage
132− if err := json.Unmarshal(body, &op); err != nil {
133− return false, err
134− }
135124 if len(op) == 0 {
136125 break
137126 }
@@ -187,9 +176,13 @@ func (p *GitHubProvider) hasOrgAndTeam(ctx context.Context, accessToken string)
187176 RawQuery: params.Encode(),
188177 }
189178
190− req, _ := http.NewRequestWithContext(ctx, "GET", endpoint.String(), nil)
191− req.Header = getGitHubHeader(accessToken)
192− resp, err := http.DefaultClient.Do(req)
179+ // bodyclose cannot detect that the body is being closed later in requests.Into,
180+ // so have to skip the linting for the next line.
181+ // nolint:bodyclose
182+ resp, err := requests.New(endpoint.String()).
183+ WithContext(ctx).
184+ WithHeaders(getGitHubHeader(accessToken)).
185+ Do()
193186 if err != nil {
194187 return false, err
195188 }
@@ -217,21 +210,9 @@ func (p *GitHubProvider) hasOrgAndTeam(ctx context.Context, accessToken string)
217210 }
218211 }
219212
220− body, err := ioutil.ReadAll(resp.Body)
221− if err != nil {
222− resp.Body.Close()
223− return false, err
224− }
225− resp.Body.Close()
226−
227− if resp.StatusCode != 200 {
228− return false, fmt.Errorf(
229− "got %d from %q %s", resp.StatusCode, endpoint.String(), body)
230− }
231−
232213 var tp teamsPage
233− if err := json.Unmarshal(body, &tp); err != nil {
234− return false, fmt.Errorf("%s unmarshaling %s", err, body)
214+ if err := requests.UnmarshalInto(resp, &tp); err != nil {
215+ return false, err
235216 }
236217 if len(tp) == 0 {
237218 break
@@ -297,25 +278,12 @@ func (p *GitHubProvider) hasRepo(ctx context.Context, accessToken string) (bool,
297278 Path: path.Join(p.ValidateURL.Path, "/repo/", p.Repo),
298279 }
299280
300− req, _ := http.NewRequestWithContext(ctx, "GET", endpoint.String(), nil)
301− req.Header = getGitHubHeader(accessToken)
302− resp, err := http.DefaultClient.Do(req)
303− if err != nil {
304− return false, err
305− }
306−
307− body, err := ioutil.ReadAll(resp.Body)
308− resp.Body.Close()
309− if err != nil {
310− return false, err
311− }
312− if resp.StatusCode != 200 {
313− return false, fmt.Errorf(
314− "got %d from %q %s", resp.StatusCode, endpoint.String(), body)
315− }
316−
317281 var repo repository
318− if err := json.Unmarshal(body, &repo); err != nil {
282+ err := requests.New(endpoint.String()).
283+ WithContext(ctx).
284+ WithHeaders(getGitHubHeader(accessToken)).
285+ UnmarshalInto(&repo)
286+ if err != nil {
319287 return false, err
320288 }
321289
@@ -337,26 +305,14 @@ func (p *GitHubProvider) hasUser(ctx context.Context, accessToken string) (bool,
337305 Host: p.ValidateURL.Host,
338306 Path: path.Join(p.ValidateURL.Path, "/user"),
339307 }
340− req, _ := http.NewRequestWithContext(ctx, "GET", endpoint.String(), nil)
341− req.Header = getGitHubHeader(accessToken)
342− resp, err := http.DefaultClient.Do(req)
343− if err != nil {
344− return false, err
345− }
346− defer resp.Body.Close()
347308
348− body, err := ioutil.ReadAll(resp.Body)
309+ err := requests.New(endpoint.String()).
310+ WithContext(ctx).
311+ WithHeaders(getGitHubHeader(accessToken)).
312+ UnmarshalInto(&user)
349313 if err != nil {
350314 return false, err
351315 }
352− if resp.StatusCode != 200 {
353− return false, fmt.Errorf("got %d from %q %s",
354− resp.StatusCode, stripToken(endpoint.String()), body)
355− }
356−
357− if err := json.Unmarshal(body, &user); err != nil {
358− return false, err
359− }
360316
361317 if p.isVerifiedUser(user.Login) {
362318 return true, nil
@@ -372,12 +328,14 @@ func (p *GitHubProvider) isCollaborator(ctx context.Context, username, accessTok
372328 Host: p.ValidateURL.Host,
373329 Path: path.Join(p.ValidateURL.Path, "/repos/", p.Repo, "/collaborators/", username),
374330 }
375− req, _ := http.NewRequestWithContext(ctx, "GET", endpoint.String(), nil)
376− req.Header = getGitHubHeader(accessToken)
377− resp, err := http.DefaultClient.Do(req)
331+ resp, err := requests.New(endpoint.String()).
332+ WithContext(ctx).
333+ WithHeaders(getGitHubHeader(accessToken)).
334+ Do()
378335 if err != nil {
379336 return false, err
380337 }
338+
381339 body, err := ioutil.ReadAll(resp.Body)
382340 resp.Body.Close()
383341 if err != nil {
@@ -440,29 +398,14 @@ func (p *GitHubProvider) GetEmailAddress(ctx context.Context, s *sessions.Sessio
440398 Host: p.ValidateURL.Host,
441399 Path: path.Join(p.ValidateURL.Path, "/user/emails"),
442400 }
443− req, _ := http.NewRequestWithContext(ctx, "GET", endpoint.String(), nil)
444− req.Header = getGitHubHeader(s.AccessToken)
445− resp, err := http.DefaultClient.Do(req)
446− if err != nil {
447− return "", err
448− }
449− body, err := ioutil.ReadAll(resp.Body)
450− resp.Body.Close()
401+ err := requests.New(endpoint.String()).
402+ WithContext(ctx).
403+ WithHeaders(getGitHubHeader(s.AccessToken)).
404+ UnmarshalInto(&emails)
451405 if err != nil {
452406 return "", err
453407 }
454408
455− if resp.StatusCode != 200 {
456− return "", fmt.Errorf("got %d from %q %s",
457− resp.StatusCode, endpoint.String(), body)
458− }
459−
460− logger.Printf("got %d from %q %s", resp.StatusCode, endpoint.String(), body)
461−
462− if err := json.Unmarshal(body, &emails); err != nil {
463− return "", fmt.Errorf("%s unmarshaling %s", err, body)
464− }
465−
466409 returnEmail := ""
467410 for _, email := range emails {
468411 if email.Verified {
@@ -489,34 +432,14 @@ func (p *GitHubProvider) GetUserName(ctx context.Context, s *sessions.SessionSta
489432 Path: path.Join(p.ValidateURL.Path, "/user"),
490433 }
491434
492− req, err := http.NewRequestWithContext(ctx, "GET", endpoint.String(), nil)
493− if err != nil {
494− return "", fmt.Errorf("could not create new GET request: %v", err)
495− }
496−
497− req.Header = getGitHubHeader(s.AccessToken)
498− resp, err := http.DefaultClient.Do(req)
499− if err != nil {
500− return "", err
501− }
502−
503− body, err := ioutil.ReadAll(resp.Body)
504− defer resp.Body.Close()
435+ err := requests.New(endpoint.String()).
436+ WithContext(ctx).
437+ WithHeaders(getGitHubHeader(s.AccessToken)).
438+ UnmarshalInto(&user)
505439 if err != nil {
506440 return "", err
507441 }
508442
509− if resp.StatusCode != 200 {
510− return "", fmt.Errorf("got %d from %q %s",
511− resp.StatusCode, endpoint.String(), body)
512− }
513−
514− logger.Printf("got %d from %q %s", resp.StatusCode, endpoint.String(), body)
515−
516− if err := json.Unmarshal(body, &user); err != nil {
517− return "", fmt.Errorf("%s unmarshaling %s", err, body)
518− }
519−
520443 // Now that we have the username we can check collaborator status
521444 if !p.isVerifiedUser(user.Login) && p.Org == "" && p.Repo != "" && p.Token != "" {
522445 if ok, err := p.isCollaborator(ctx, user.Login, p.Token); err != nil || !ok {