response wrapper to fix json unmarshal issues (#21)

* chore: change wrapping

* fix: fix mapping bugs

Co-authored-by: Stefan Martinov <stefan.martinov@gmail.com>
This commit is contained in:
Frederik Löffert 2020-04-01 12:25:55 +02:00 committed by GitHub
parent f75f3a09ae
commit 0ab7935a05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 39 deletions

View File

@ -33,49 +33,69 @@ func NewHTTPClient(server string) (c *Client, err error) {
} }
// Update tell the server to update itself // Update tell the server to update itself
func (c *Client) Update() (response *responses.Update, err error) { func (c *Client) Update() (*responses.Update, error) {
response = &responses.Update{} type serverResponse struct {
err = c.t.call(server.HandlerUpdate, &requests.Update{}, response) Reply *responses.Update
return }
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 // GetContent request site content
func (c *Client) GetContent(request *requests.Content) (response *content.SiteContent, err error) { func (c *Client) GetContent(request *requests.Content) (*content.SiteContent, error) {
response = &content.SiteContent{} type serverResponse struct {
err = c.t.call(server.HandlerGetContent, request, response) Reply *content.SiteContent
return }
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 // GetURIs resolve uris for ids in a dimension
func (c *Client) GetURIs(dimension string, IDs []string) (uriMap map[string]string, err error) { func (c *Client) GetURIs(dimension string, IDs []string) (map[string]string, error) {
uriMap = map[string]string{} type serverResponse struct {
err = c.t.call( Reply map[string]string
server.HandlerGetURIs, }
&requests.URIs{
Dimension: dimension, resp := serverResponse{}
IDs: IDs, if err := c.t.call(server.HandlerGetURIs, &requests.URIs{Dimension: dimension, IDs: IDs}, &resp); err != nil {
}, return nil, err
&uriMap, }
) return resp.Reply, nil
return
} }
// GetNodes request nodes // 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{ r := &requests.Nodes{
Env: env, Env: env,
Nodes: nodes, Nodes: nodes,
} }
nodesResponse = map[string]*content.Node{} type serverResponse struct {
err = c.t.call(server.HandlerGetNodes, r, &nodesResponse) Reply map[string]*content.Node
return }
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 // GetRepo get the whole repo
func (c *Client) GetRepo() (response map[string]*content.RepoNode, err error) { func (c *Client) GetRepo() (map[string]*content.RepoNode, error) {
response = map[string]*content.RepoNode{} type serverResponse struct {
err = c.t.call(server.HandlerGetRepo, &requests.Repo{}, &response) Reply map[string]*content.RepoNode
return }
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() { func (c *Client) ShutDown() {

View File

@ -42,6 +42,8 @@ func (ht *httpTransport) call(handler server.Handler, request interface{}, respo
if errDo != nil { if errDo != nil {
return errDo return errDo
} }
defer httpResponse.Body.Close()
if httpResponse.StatusCode != http.StatusOK { if httpResponse.StatusCode != http.StatusOK {
return errors.New("non 200 reply") return errors.New("non 200 reply")
} }
@ -49,13 +51,8 @@ func (ht *httpTransport) call(handler server.Handler, request interface{}, respo
return errors.New("empty response body") return errors.New("empty response body")
} }
responseBytes, errRead := ioutil.ReadAll(httpResponse.Body) responseBytes, errRead := ioutil.ReadAll(httpResponse.Body)
httpResponse.Body.Close()
if errRead != nil { if errRead != nil {
return errRead return errRead
} }
errUnmarshal := json.Unmarshal(responseBytes, &serverResponse{Reply: response}) return json.Unmarshal(responseBytes, response)
if errUnmarshal != nil {
return errUnmarshal
}
return errUnmarshal
} }

View File

@ -15,10 +15,6 @@ import (
var json = jsoniter.ConfigCompatibleWithStandardLibrary var json = jsoniter.ConfigCompatibleWithStandardLibrary
type serverResponse struct {
Reply interface{}
}
type connReturn struct { type connReturn struct {
conn net.Conn conn net.Conn
err error err error
@ -113,8 +109,8 @@ func (c *socketTransport) call(handler server.Handler, request interface{}, resp
} }
// unmarshal response // unmarshal response
responseJSONErr := json.Unmarshal(responseBytes, &serverResponse{Reply: response}) errResponse := json.Unmarshal(responseBytes, response)
if responseJSONErr != nil { if errResponse != nil {
// is it an error ? // is it an error ?
var ( var (
remoteErr = responses.Error{} remoteErr = responses.Error{}