package apt import ( "context" "fmt" "io" "net/http" "os" "path/filepath" ) // fetchBytes performs a GET request and returns the response body. func fetchBytes(ctx context.Context, httpClient *http.Client, url string) ([]byte, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { return nil, err } resp, err := httpClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("HTTP %d for %s", resp.StatusCode, url) } return io.ReadAll(resp.Body) } // atomicWrite writes data to path via a temporary file and an atomic rename. func atomicWrite(path string, data []byte) error { if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return err } tmp := path + ".tmp" if err := os.WriteFile(tmp, data, 0o644); err != nil { return err } if err := os.Rename(tmp, path); err != nil { os.Remove(tmp) return err } return nil }