diff options
author | Igor Drozdov <idrozdov@gitlab.com> | 2019-05-20 12:35:03 +0300 |
---|---|---|
committer | Igor Drozdov <idrozdov@gitlab.com> | 2019-05-22 15:04:11 +0300 |
commit | a36cf8de6c2b5c03c68a54e207190627b5c651f2 (patch) | |
tree | 6d3a763536f7c9677347f2842c7b4b5b413408f5 /go | |
parent | 60280bbfc1a1cfb591bf01f3a06e828dcf97728a (diff) | |
download | gitlab-shell-a36cf8de6c2b5c03c68a54e207190627b5c651f2.tar.gz |
Introduce gitlabnet.ParseJSON to DRY
Diffstat (limited to 'go')
-rw-r--r-- | go/internal/gitlabnet/client.go | 12 | ||||
-rw-r--r-- | go/internal/gitlabnet/discover/client.go | 48 | ||||
-rw-r--r-- | go/internal/gitlabnet/discover/client_test.go | 17 | ||||
-rw-r--r-- | go/internal/gitlabnet/twofactorrecover/client.go | 31 |
4 files changed, 48 insertions, 60 deletions
diff --git a/go/internal/gitlabnet/client.go b/go/internal/gitlabnet/client.go index c0f7f97..86add04 100644 --- a/go/internal/gitlabnet/client.go +++ b/go/internal/gitlabnet/client.go @@ -17,6 +17,10 @@ const ( secretHeaderName = "Gitlab-Shared-Secret" ) +var ( + ParsingError = fmt.Errorf("Parsing failed") +) + type ErrorResponse struct { Message string `json:"message"` } @@ -120,3 +124,11 @@ func (c *GitlabClient) doRequest(method, path string, data interface{}) (*http.R return response, nil } + +func ParseJSON(hr *http.Response, response interface{}) error { + if err := json.NewDecoder(hr.Body).Decode(response); err != nil { + return ParsingError + } + + return nil +} diff --git a/go/internal/gitlabnet/discover/client.go b/go/internal/gitlabnet/discover/client.go index 1266379..675670d 100644 --- a/go/internal/gitlabnet/discover/client.go +++ b/go/internal/gitlabnet/discover/client.go @@ -1,7 +1,6 @@ package discover import ( - "encoding/json" "fmt" "net/http" "net/url" @@ -32,56 +31,39 @@ func NewClient(config *config.Config) (*Client, error) { } func (c *Client) GetByCommandArgs(args *commandargs.CommandArgs) (*Response, error) { - if args.GitlabKeyId != "" { - return c.GetByKeyId(args.GitlabKeyId) - } else if args.GitlabUsername != "" { - return c.GetByUsername(args.GitlabUsername) + params := url.Values{} + if args.GitlabUsername != "" { + params.Add("username", args.GitlabUsername) + } else if args.GitlabKeyId != "" { + params.Add("key_id", args.GitlabKeyId) } else { // There was no 'who' information, this matches the ruby error // message. return nil, fmt.Errorf("who='' is invalid") } -} - -func (c *Client) GetByKeyId(keyId string) (*Response, error) { - params := url.Values{} - params.Add("key_id", keyId) - - return c.getResponse(params) -} - -func (c *Client) GetByUsername(username string) (*Response, error) { - params := url.Values{} - params.Add("username", username) return c.getResponse(params) } -func (c *Client) parseResponse(resp *http.Response) (*Response, error) { - parsedResponse := &Response{} - - if err := json.NewDecoder(resp.Body).Decode(parsedResponse); err != nil { - return nil, err - } else { - return parsedResponse, nil - } -} - func (c *Client) getResponse(params url.Values) (*Response, error) { path := "/discover?" + params.Encode() - response, err := c.client.Get(path) + response, err := c.client.Get(path) if err != nil { return nil, err } - defer response.Body.Close() - parsedResponse, err := c.parseResponse(response) - if err != nil { - return nil, fmt.Errorf("Parsing failed") + + return parse(response) +} + +func parse(hr *http.Response) (*Response, error) { + response := &Response{} + if err := gitlabnet.ParseJSON(hr, response); err != nil { + return nil, err } - return parsedResponse, nil + return response, nil } func (r *Response) IsAnonymous() bool { diff --git a/go/internal/gitlabnet/discover/client_test.go b/go/internal/gitlabnet/discover/client_test.go index 006568a..8eabdd7 100644 --- a/go/internal/gitlabnet/discover/client_test.go +++ b/go/internal/gitlabnet/discover/client_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "net/url" "testing" "gitlab.com/gitlab-org/gitlab-shell/go/internal/config" @@ -59,7 +60,9 @@ func TestGetByKeyId(t *testing.T) { client, cleanup := setup(t) defer cleanup() - result, err := client.GetByKeyId("1") + params := url.Values{} + params.Add("key_id", "1") + result, err := client.getResponse(params) assert.NoError(t, err) assert.Equal(t, &Response{UserId: 2, Username: "alex-doe", Name: "Alex Doe"}, result) } @@ -68,7 +71,9 @@ func TestGetByUsername(t *testing.T) { client, cleanup := setup(t) defer cleanup() - result, err := client.GetByUsername("jane-doe") + params := url.Values{} + params.Add("username", "jane-doe") + result, err := client.getResponse(params) assert.NoError(t, err) assert.Equal(t, &Response{UserId: 1, Username: "jane-doe", Name: "Jane Doe"}, result) } @@ -77,7 +82,9 @@ func TestMissingUser(t *testing.T) { client, cleanup := setup(t) defer cleanup() - result, err := client.GetByUsername("missing") + params := url.Values{} + params.Add("username", "missing") + result, err := client.getResponse(params) assert.NoError(t, err) assert.True(t, result.IsAnonymous()) } @@ -110,7 +117,9 @@ func TestErrorResponses(t *testing.T) { for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { - resp, err := client.GetByUsername(tc.fakeUsername) + params := url.Values{} + params.Add("username", tc.fakeUsername) + resp, err := client.getResponse(params) assert.EqualError(t, err, tc.expectedError) assert.Nil(t, resp) diff --git a/go/internal/gitlabnet/twofactorrecover/client.go b/go/internal/gitlabnet/twofactorrecover/client.go index d26b141..f90a85c 100644 --- a/go/internal/gitlabnet/twofactorrecover/client.go +++ b/go/internal/gitlabnet/twofactorrecover/client.go @@ -1,10 +1,8 @@ package twofactorrecover import ( - "encoding/json" "errors" "fmt" - "io/ioutil" "net/http" "gitlab.com/gitlab-org/gitlab-shell/go/internal/command/commandargs" @@ -46,38 +44,25 @@ func (c *Client) GetRecoveryCodes(args *commandargs.CommandArgs) ([]string, erro } response, err := c.client.Post("/two_factor_recovery_codes", requestBody) - if err != nil { return nil, err } - defer response.Body.Close() - parsedResponse, err := c.parseResponse(response) - - if err != nil { - return nil, fmt.Errorf("Parsing failed") - } - if parsedResponse.Success { - return parsedResponse.RecoveryCodes, nil - } else { - return nil, errors.New(parsedResponse.Message) - } + return parse(response) } -func (c *Client) parseResponse(resp *http.Response) (*Response, error) { - parsedResponse := &Response{} - body, err := ioutil.ReadAll(resp.Body) - - if err != nil { +func parse(hr *http.Response) ([]string, error) { + response := &Response{} + if err := gitlabnet.ParseJSON(hr, response); err != nil { return nil, err } - if err := json.Unmarshal(body, parsedResponse); err != nil { - return nil, err - } else { - return parsedResponse, nil + if !response.Success { + return nil, errors.New(response.Message) } + + return response.RecoveryCodes, nil } func (c *Client) getRequestBody(args *commandargs.CommandArgs) (*RequestBody, error) { |