metadata_downloader.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package metadata
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "os"
  8. )
  9. type HTTPRequestDoer interface {
  10. Do(req *http.Request) (*http.Response, error)
  11. }
  12. func ReadCache(cachePath string) ([]byte, error) {
  13. fp, err := os.Open(cachePath)
  14. if err != nil {
  15. if os.IsNotExist(err) {
  16. return nil, nil
  17. }
  18. return nil, err
  19. }
  20. defer fp.Close()
  21. s, err := io.ReadAll(fp)
  22. if err != nil {
  23. return nil, err
  24. }
  25. return s, nil
  26. }
  27. // Download the metadata for aur packages.
  28. // create cache file
  29. // write to cache file.
  30. func MakeCache(ctx context.Context, httpClient HTTPRequestDoer, cachePath string) ([]byte, error) {
  31. body, err := downloadAURMetadata(ctx, httpClient)
  32. if err != nil {
  33. return nil, err
  34. }
  35. defer body.Close()
  36. s, err := io.ReadAll(body)
  37. if err != nil {
  38. return nil, err
  39. }
  40. f, err := os.Create(cachePath)
  41. if err != nil {
  42. return nil, err
  43. }
  44. defer f.Close()
  45. if _, err = f.Write(s); err != nil {
  46. return nil, err
  47. }
  48. return s, err
  49. }
  50. func downloadAURMetadata(ctx context.Context, httpClient HTTPRequestDoer) (io.ReadCloser, error) {
  51. req, err := http.NewRequestWithContext(ctx, "GET", "https://aur.archlinux.org/packages-meta-ext-v1.json.gz", http.NoBody)
  52. if err != nil {
  53. return nil, fmt.Errorf("failed to create request: %w", err)
  54. }
  55. resp, err := httpClient.Do(req)
  56. if err != nil {
  57. return nil, err
  58. }
  59. if resp.StatusCode != http.StatusOK {
  60. return nil, fmt.Errorf("failed to download metadata: %s", resp.Status)
  61. }
  62. return resp.Body, nil
  63. }