Skip to content

Commit

Permalink
response wrapper to fix json unmarshal issues (#21)
Browse files Browse the repository at this point in the history
* chore: change wrapping

* fix: fix mapping bugs

Co-authored-by: Stefan Martinov <[email protected]>
  • Loading branch information
loeffert and smartinov authored Apr 1, 2020
1 parent f75f3a0 commit 0ab7935
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 39 deletions.
74 changes: 47 additions & 27 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,49 +33,69 @@ func NewHTTPClient(server string) (c *Client, err error) {
}

// Update tell the server to update itself
func (c *Client) Update() (response *responses.Update, err error) {
response = &responses.Update{}
err = c.t.call(server.HandlerUpdate, &requests.Update{}, response)
return
func (c *Client) Update() (*responses.Update, error) {
type serverResponse struct {
Reply *responses.Update
}
resp := serverResponse{}
if err := c.t.call(server.HandlerUpdate, &requests.Update{}, &resp); err != nil {
return nil, err
}
return resp.Reply, nil
}

// GetContent request site content
func (c *Client) GetContent(request *requests.Content) (response *content.SiteContent, err error) {
response = &content.SiteContent{}
err = c.t.call(server.HandlerGetContent, request, response)
return
func (c *Client) GetContent(request *requests.Content) (*content.SiteContent, error) {
type serverResponse struct {
Reply *content.SiteContent
}
resp := serverResponse{}
if err := c.t.call(server.HandlerGetContent, request, &resp); err != nil {
return nil, err
}

return resp.Reply, nil
}

// GetURIs resolve uris for ids in a dimension
func (c *Client) GetURIs(dimension string, IDs []string) (uriMap map[string]string, err error) {
uriMap = map[string]string{}
err = c.t.call(
server.HandlerGetURIs,
&requests.URIs{
Dimension: dimension,
IDs: IDs,
},
&uriMap,
)
return
func (c *Client) GetURIs(dimension string, IDs []string) (map[string]string, error) {
type serverResponse struct {
Reply map[string]string
}

resp := serverResponse{}
if err := c.t.call(server.HandlerGetURIs, &requests.URIs{Dimension: dimension, IDs: IDs}, &resp); err != nil {
return nil, err
}
return resp.Reply, nil
}

// GetNodes request nodes
func (c *Client) GetNodes(env *requests.Env, nodes map[string]*requests.Node) (nodesResponse map[string]*content.Node, err error) {
func (c *Client) GetNodes(env *requests.Env, nodes map[string]*requests.Node) (map[string]*content.Node, error) {
r := &requests.Nodes{
Env: env,
Nodes: nodes,
}
nodesResponse = map[string]*content.Node{}
err = c.t.call(server.HandlerGetNodes, r, &nodesResponse)
return
type serverResponse struct {
Reply map[string]*content.Node
}
resp := serverResponse{}
if err := c.t.call(server.HandlerGetNodes, r, &resp); err != nil {
return nil, err
}
return resp.Reply, nil
}

// GetRepo get the whole repo
func (c *Client) GetRepo() (response map[string]*content.RepoNode, err error) {
response = map[string]*content.RepoNode{}
err = c.t.call(server.HandlerGetRepo, &requests.Repo{}, &response)
return
func (c *Client) GetRepo() (map[string]*content.RepoNode, error) {
type serverResponse struct {
Reply map[string]*content.RepoNode
}
resp := serverResponse{}
if err := c.t.call(server.HandlerGetRepo, &requests.Repo{}, &resp); err != nil {
return nil, err
}
return resp.Reply, nil
}

func (c *Client) ShutDown() {
Expand Down
9 changes: 3 additions & 6 deletions client/httptransport.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,17 @@ func (ht *httpTransport) call(handler server.Handler, request interface{}, respo
if errDo != nil {
return errDo
}
defer httpResponse.Body.Close()

if httpResponse.StatusCode != http.StatusOK {
return errors.New("non 200 reply")
}
if httpResponse.Body == nil {
return errors.New("empty response body")
}
responseBytes, errRead := ioutil.ReadAll(httpResponse.Body)
httpResponse.Body.Close()
if errRead != nil {
return errRead
}
errUnmarshal := json.Unmarshal(responseBytes, &serverResponse{Reply: response})
if errUnmarshal != nil {
return errUnmarshal
}
return errUnmarshal
return json.Unmarshal(responseBytes, response)
}
8 changes: 2 additions & 6 deletions client/sockettransport.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@ import (

var json = jsoniter.ConfigCompatibleWithStandardLibrary

type serverResponse struct {
Reply interface{}
}

type connReturn struct {
conn net.Conn
err error
Expand Down Expand Up @@ -113,8 +109,8 @@ func (c *socketTransport) call(handler server.Handler, request interface{}, resp
}

// unmarshal response
responseJSONErr := json.Unmarshal(responseBytes, &serverResponse{Reply: response})
if responseJSONErr != nil {
errResponse := json.Unmarshal(responseBytes, response)
if errResponse != nil {
// is it an error ?
var (
remoteErr = responses.Error{}
Expand Down

0 comments on commit 0ab7935

Please sign in to comment.