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) }