Files
flux/internal/util/cli/request.go
Zoe c51eca5dab Expand logging, and daemonless command support.
This adds more logging in certain places, and adds logging to the CLI.
It also allows for certain commands in the CLI to be used without a
daemon connection, namely `init`, which previously required the daemon
to be connected, but now does not since it doesnt need it.
2025-05-08 09:53:41 -05:00

100 lines
2.4 KiB
Go

package cli_util
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"go.uber.org/zap"
)
func isOk(statusCode int) bool {
return statusCode >= 200 && statusCode < 300
}
// make a function that makes an http GET request to the daemon and returns data of type T
func GetRequest[T any](url string, logger *zap.SugaredLogger) (*T, error) {
resp, err := http.Get(url)
if err != nil {
logger.Debugw("GET request failed", zap.String("url", url), zap.Error(err))
return nil, fmt.Errorf("http get request failed: %v", err)
}
defer resp.Body.Close()
logger.Debugw("GET request", zap.String("url", url), resp)
if !isOk(resp.StatusCode) {
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %v", err)
}
responseBody = []byte(strings.TrimSuffix(string(responseBody), "\n"))
return nil, fmt.Errorf("http get request failed: %s", responseBody)
}
var data T
if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
return nil, fmt.Errorf("failed to decode http response: %v", err)
}
return &data, nil
}
func DeleteRequest(url string, logger *zap.SugaredLogger) error {
req, err := http.NewRequest("DELETE", url, nil)
if err != nil {
return fmt.Errorf("failed to delete: %v", err)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("failed to delete: %v", err)
}
defer resp.Body.Close()
logger.Debugw("DELETE request", zap.String("url", url), resp)
if !isOk(resp.StatusCode) {
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("error reading response body: %v", err)
}
responseBody = []byte(strings.TrimSuffix(string(responseBody), "\n"))
return fmt.Errorf("delete failed: %s", responseBody)
}
return nil
}
func PutRequest(url string, data io.Reader, logger *zap.SugaredLogger) error {
req, err := http.NewRequest("PUT", url, data)
if err != nil {
return fmt.Errorf("failed to put: %v", err)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("failed to put: %v", err)
}
defer resp.Body.Close()
logger.Debugw("PUT request", zap.String("url", url), resp)
if !isOk(resp.StatusCode) {
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("error reading response body: %v", err)
}
responseBody = []byte(strings.TrimSuffix(string(responseBody), "\n"))
return fmt.Errorf("put failed: %s", responseBody)
}
return nil
}