Commit a36cf8de authored by Igor Drozdov's avatar Igor Drozdov

Introduce gitlabnet.ParseJSON to DRY

parent 60280bbf
...@@ -17,6 +17,10 @@ const ( ...@@ -17,6 +17,10 @@ const (
secretHeaderName = "Gitlab-Shared-Secret" secretHeaderName = "Gitlab-Shared-Secret"
) )
var (
ParsingError = fmt.Errorf("Parsing failed")
)
type ErrorResponse struct { type ErrorResponse struct {
Message string `json:"message"` Message string `json:"message"`
} }
...@@ -120,3 +124,11 @@ func (c *GitlabClient) doRequest(method, path string, data interface{}) (*http.R ...@@ -120,3 +124,11 @@ func (c *GitlabClient) doRequest(method, path string, data interface{}) (*http.R
return response, nil 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
}
package discover package discover
import ( import (
"encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"net/url" "net/url"
...@@ -32,56 +31,39 @@ func NewClient(config *config.Config) (*Client, error) { ...@@ -32,56 +31,39 @@ func NewClient(config *config.Config) (*Client, error) {
} }
func (c *Client) GetByCommandArgs(args *commandargs.CommandArgs) (*Response, error) { func (c *Client) GetByCommandArgs(args *commandargs.CommandArgs) (*Response, error) {
if args.GitlabKeyId != "" { params := url.Values{}
return c.GetByKeyId(args.GitlabKeyId) if args.GitlabUsername != "" {
} else if args.GitlabUsername != "" { params.Add("username", args.GitlabUsername)
return c.GetByUsername(args.GitlabUsername) } else if args.GitlabKeyId != "" {
params.Add("key_id", args.GitlabKeyId)
} else { } else {
// There was no 'who' information, this matches the ruby error // There was no 'who' information, this matches the ruby error
// message. // message.
return nil, fmt.Errorf("who='' is invalid") 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) 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) { func (c *Client) getResponse(params url.Values) (*Response, error) {
path := "/discover?" + params.Encode() path := "/discover?" + params.Encode()
response, err := c.client.Get(path)
response, err := c.client.Get(path)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer response.Body.Close() defer response.Body.Close()
parsedResponse, err := c.parseResponse(response)
if err != nil { return parse(response)
return nil, fmt.Errorf("Parsing failed") }
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 { func (r *Response) IsAnonymous() bool {
......
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"net/url"
"testing" "testing"
"gitlab.com/gitlab-org/gitlab-shell/go/internal/config" "gitlab.com/gitlab-org/gitlab-shell/go/internal/config"
...@@ -59,7 +60,9 @@ func TestGetByKeyId(t *testing.T) { ...@@ -59,7 +60,9 @@ func TestGetByKeyId(t *testing.T) {
client, cleanup := setup(t) client, cleanup := setup(t)
defer cleanup() 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.NoError(t, err)
assert.Equal(t, &Response{UserId: 2, Username: "alex-doe", Name: "Alex Doe"}, result) assert.Equal(t, &Response{UserId: 2, Username: "alex-doe", Name: "Alex Doe"}, result)
} }
...@@ -68,7 +71,9 @@ func TestGetByUsername(t *testing.T) { ...@@ -68,7 +71,9 @@ func TestGetByUsername(t *testing.T) {
client, cleanup := setup(t) client, cleanup := setup(t)
defer cleanup() 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.NoError(t, err)
assert.Equal(t, &Response{UserId: 1, Username: "jane-doe", Name: "Jane Doe"}, result) assert.Equal(t, &Response{UserId: 1, Username: "jane-doe", Name: "Jane Doe"}, result)
} }
...@@ -77,7 +82,9 @@ func TestMissingUser(t *testing.T) { ...@@ -77,7 +82,9 @@ func TestMissingUser(t *testing.T) {
client, cleanup := setup(t) client, cleanup := setup(t)
defer cleanup() defer cleanup()
result, err := client.GetByUsername("missing") params := url.Values{}
params.Add("username", "missing")
result, err := client.getResponse(params)
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, result.IsAnonymous()) assert.True(t, result.IsAnonymous())
} }
...@@ -110,7 +117,9 @@ func TestErrorResponses(t *testing.T) { ...@@ -110,7 +117,9 @@ func TestErrorResponses(t *testing.T) {
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) { 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.EqualError(t, err, tc.expectedError)
assert.Nil(t, resp) assert.Nil(t, resp)
......
package twofactorrecover package twofactorrecover
import ( import (
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"io/ioutil"
"net/http" "net/http"
"gitlab.com/gitlab-org/gitlab-shell/go/internal/command/commandargs" "gitlab.com/gitlab-org/gitlab-shell/go/internal/command/commandargs"
...@@ -46,38 +44,25 @@ func (c *Client) GetRecoveryCodes(args *commandargs.CommandArgs) ([]string, erro ...@@ -46,38 +44,25 @@ func (c *Client) GetRecoveryCodes(args *commandargs.CommandArgs) ([]string, erro
} }
response, err := c.client.Post("/two_factor_recovery_codes", requestBody) response, err := c.client.Post("/two_factor_recovery_codes", requestBody)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer response.Body.Close() defer response.Body.Close()
parsedResponse, err := c.parseResponse(response)
if err != nil {
return nil, fmt.Errorf("Parsing failed")
}
if parsedResponse.Success { return parse(response)
return parsedResponse.RecoveryCodes, nil
} else {
return nil, errors.New(parsedResponse.Message)
}
} }
func (c *Client) parseResponse(resp *http.Response) (*Response, error) { func parse(hr *http.Response) ([]string, error) {
parsedResponse := &Response{} response := &Response{}
body, err := ioutil.ReadAll(resp.Body) if err := gitlabnet.ParseJSON(hr, response); err != nil {
if err != nil {
return nil, err return nil, err
} }
if err := json.Unmarshal(body, parsedResponse); err != nil { if !response.Success {
return nil, err return nil, errors.New(response.Message)
} else {
return parsedResponse, nil
} }
return response.RecoveryCodes, nil
} }
func (c *Client) getRequestBody(args *commandargs.CommandArgs) (*RequestBody, error) { func (c *Client) getRequestBody(args *commandargs.CommandArgs) (*RequestBody, error) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment