package main import ( "bytes" "encoding/json" "io" "net/http" "time" ) // KVSClient maintains the connection state and configuration type KVSClient struct { baseURL string currentToken string currentUser string httpClient *http.Client profiles map[string]Profile activeProfile string } // NewKVSClient creates a new KVS client instance func NewKVSClient(baseURL string) *KVSClient { return &KVSClient{ baseURL: baseURL, httpClient: &http.Client{ Timeout: 30 * time.Second, }, profiles: make(map[string]Profile), } } // doRequest performs an HTTP request with JSON body and auth headers func (c *KVSClient) doRequest(method, path string, body interface{}) ([]byte, int, error) { var reqBody io.Reader if body != nil { jsonData, err := json.Marshal(body) if err != nil { return nil, 0, err } reqBody = bytes.NewBuffer(jsonData) } req, err := http.NewRequest(method, c.baseURL+path, reqBody) if err != nil { return nil, 0, err } req.Header.Set("Content-Type", "application/json") if c.currentToken != "" { req.Header.Set("Authorization", "Bearer "+c.currentToken) } resp, err := c.httpClient.Do(req) if err != nil { return nil, 0, err } defer resp.Body.Close() respBody, err := io.ReadAll(resp.Body) return respBody, resp.StatusCode, err }