Files
kopia/internal/serverapi/client.go
2019-05-11 12:34:14 -07:00

67 lines
1.7 KiB
Go

package serverapi
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"github.com/pkg/errors"
)
// Client provides helper methods for communicating with Kopia API serevr.
type Client struct {
baseURL string
client *http.Client
}
// Get sends HTTP GET request and decodes the JSON response into the provided payload structure.
func (c *Client) Get(path string, respPayload interface{}) error {
resp, err := c.client.Get(c.baseURL + path)
if err != nil {
return err
}
defer resp.Body.Close() //nolint:errcheck
if resp.StatusCode != 200 {
return fmt.Errorf("invalid server response: %v", resp.Status)
}
if err := json.NewDecoder(resp.Body).Decode(respPayload); err != nil {
return errors.Wrap(err, "malformed server response")
}
return nil
}
// Post sends HTTP post request with given JSON payload structure and decodes the JSON response into another payload structure.
func (c *Client) Post(path string, reqPayload, respPayload interface{}) error {
var buf bytes.Buffer
if err := json.NewEncoder(&buf).Encode(reqPayload); err != nil {
return errors.Wrap(err, "unable to encode request")
}
resp, err := c.client.Post(c.baseURL+path, "application/json", &buf)
if err != nil {
return err
}
defer resp.Body.Close() //nolint:errcheck
if resp.StatusCode != 200 {
return fmt.Errorf("invalid server response: %v", resp.Status)
}
if err := json.NewDecoder(resp.Body).Decode(respPayload); err != nil {
return errors.Wrap(err, "malformed server response")
}
return nil
}
// NewClient creates a client for connecting to Kopia HTTP API.
func NewClient(serverAddress string, cli *http.Client) *Client {
if cli == nil {
cli = http.DefaultClient
}
return &Client{"http://" + serverAddress + "/api/v1/", cli}
}