Skip to content

Commit 4d8a3b3

Browse files
authored
Handle failed status code in provider requests (#313)
1 parent 195495c commit 4d8a3b3

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

api/provider/provider.go

+19
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package provider
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
7+
"io/ioutil"
68

79
"golang.org/x/oauth2"
810
)
@@ -49,6 +51,15 @@ func chooseHost(base, defaultHost string) string {
4951
return base
5052
}
5153

54+
type RequestError struct {
55+
code int
56+
body string
57+
}
58+
59+
func (r *RequestError) Error() string {
60+
return fmt.Sprintf("Request failed with status %d:\n%s", r.code, r.body)
61+
}
62+
5263
func makeRequest(ctx context.Context, tok *oauth2.Token, g *oauth2.Config, url string, dst interface{}) error {
5364
client := g.Client(ctx, tok)
5465
res, err := client.Get(url)
@@ -57,6 +68,14 @@ func makeRequest(ctx context.Context, tok *oauth2.Token, g *oauth2.Config, url s
5768
}
5869
defer res.Body.Close()
5970

71+
if res.StatusCode/100 != 2 {
72+
body, err := ioutil.ReadAll(res.Body)
73+
if err != nil {
74+
return err
75+
}
76+
return &RequestError{code: res.StatusCode, body: string(body)}
77+
}
78+
6079
if err := json.NewDecoder(res.Body).Decode(dst); err != nil {
6180
return err
6281
}

api/provider/provider_test.go

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package provider_test
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
"net/http/httptest"
8+
"testing"
9+
"time"
10+
11+
"github.com/netlify/gotrue/api/provider"
12+
"github.com/netlify/gotrue/conf"
13+
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
15+
"golang.org/x/oauth2"
16+
)
17+
18+
func TestGithubFail(t *testing.T) {
19+
ctx, cancel := context.WithCancel(context.Background())
20+
t.Cleanup(cancel)
21+
22+
srv := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
23+
rw.WriteHeader(http.StatusTeapot)
24+
fmt.Fprint(rw, "Something failed")
25+
}))
26+
t.Cleanup(srv.Close)
27+
28+
gh, err := provider.NewGithubProvider(conf.OAuthProviderConfiguration{
29+
ClientID: "client-id",
30+
Secret: "secret",
31+
RedirectURI: "https://redirect.example.org/callback",
32+
URL: srv.URL,
33+
Enabled: true,
34+
})
35+
require.NoError(t, err)
36+
37+
user, err := gh.GetUserData(ctx, &oauth2.Token{
38+
AccessToken: "my-token",
39+
Expiry: time.Now().Add(time.Minute),
40+
})
41+
require.Error(t, err)
42+
require.Nil(t, user)
43+
assert.Equal(t, "Request failed with status 418:\nSomething failed", err.Error())
44+
}

0 commit comments

Comments
 (0)