76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
|
package grafana
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
"path"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var DefaultHTTPClient = http.DefaultClient
|
||
|
|
||
|
type Client struct {
|
||
|
baseURL string
|
||
|
key string
|
||
|
basicAuth bool
|
||
|
client *http.Client
|
||
|
}
|
||
|
|
||
|
func NewClient(apiURL, authString string, client *http.Client) (*Client, error) {
|
||
|
basicAuth := strings.Contains(authString, ":")
|
||
|
baseURL, err := url.Parse(apiURL)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var key string
|
||
|
if len(authString) > 0 {
|
||
|
if !basicAuth {
|
||
|
key = fmt.Sprintf("Bearer %s", authString)
|
||
|
} else {
|
||
|
parts := strings.SplitN(authString, ":", 2)
|
||
|
baseURL.User = url.UserPassword(parts[0], parts[1])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return &Client{
|
||
|
baseURL: baseURL.String(),
|
||
|
basicAuth: basicAuth,
|
||
|
key: key,
|
||
|
client: client,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func (c *Client) doRequest(ctx context.Context, method, query string, params url.Values, buf io.Reader) ([]byte, int, error) {
|
||
|
u, _ := url.Parse(c.baseURL)
|
||
|
u.Path = path.Join(u.Path, query)
|
||
|
if params != nil {
|
||
|
u.RawQuery = params.Encode()
|
||
|
}
|
||
|
req, err := http.NewRequest(method, u.String(), buf)
|
||
|
if err != nil {
|
||
|
return nil, 0, err
|
||
|
}
|
||
|
req = req.WithContext(ctx)
|
||
|
if !c.basicAuth && len(c.key) > 0 {
|
||
|
req.Header.Set("Authorization", c.key)
|
||
|
}
|
||
|
req.Header.Set("Accept", "application/json")
|
||
|
req.Header.Set("Content-Type", "application/json")
|
||
|
req.Header.Set("User-Agent", "grafana-backuper")
|
||
|
resp, err := c.client.Do(req)
|
||
|
if err != nil {
|
||
|
return nil, 0, err
|
||
|
}
|
||
|
data, err := io.ReadAll(resp.Body)
|
||
|
resp.Body.Close()
|
||
|
return data, resp.StatusCode, err
|
||
|
}
|
||
|
|
||
|
func (c *Client) get(ctx context.Context, query string, params url.Values) ([]byte, int, error) {
|
||
|
return c.doRequest(ctx, "GET", query, params, nil)
|
||
|
}
|