package internal import ( "bytes" "encoding/json" "fmt" "io" "net/http" ) // DoRequest sends a POST request to the local AigcPanel HTTP server. func DoRequest(cfg *AuthConfig, urlPath string, body any) (map[string]any, error) { var reqBody io.Reader if body != nil { b, err := json.Marshal(body) if err != nil { return nil, fmt.Errorf("marshal request body: %w", err) } reqBody = bytes.NewReader(b) } url := fmt.Sprintf("http://127.0.0.1:%d%s", cfg.Port, urlPath) req, err := http.NewRequest(http.MethodPost, url, reqBody) if err != nil { return nil, fmt.Errorf("create request: %w", err) } req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer "+cfg.Token) resp, err := http.DefaultClient.Do(req) if err != nil { return nil, fmt.Errorf("request failed: %w (is AigcPanel running?)", err) } defer resp.Body.Close() respBytes, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("read response: %w", err) } if resp.StatusCode == http.StatusUnauthorized { return nil, fmt.Errorf("unauthorized: token mismatch, restart AigcPanel and try again") } var result map[string]any if err := json.Unmarshal(respBytes, &result); err != nil { return nil, fmt.Errorf("parse response: %w", err) } return result, nil } // PrintJSON outputs a value as indented JSON to stdout. func PrintJSON(v any) error { b, err := json.MarshalIndent(v, "", " ") if err != nil { return err } fmt.Println(string(b)) return nil }