Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package lfs
  4. import (
  5. "bytes"
  6. "context"
  7. "io"
  8. "net/http"
  9. "code.gitea.io/gitea/modules/json"
  10. "code.gitea.io/gitea/modules/log"
  11. )
  12. // TransferAdapter represents an adapter for downloading/uploading LFS objects.
  13. type TransferAdapter interface {
  14. Name() string
  15. Download(ctx context.Context, l *Link) (io.ReadCloser, error)
  16. Upload(ctx context.Context, l *Link, p Pointer, r io.Reader) error
  17. Verify(ctx context.Context, l *Link, p Pointer) error
  18. }
  19. // BasicTransferAdapter implements the "basic" adapter.
  20. type BasicTransferAdapter struct {
  21. client *http.Client
  22. }
  23. // Name returns the name of the adapter.
  24. func (a *BasicTransferAdapter) Name() string {
  25. return "basic"
  26. }
  27. // Download reads the download location and downloads the data.
  28. func (a *BasicTransferAdapter) Download(ctx context.Context, l *Link) (io.ReadCloser, error) {
  29. req, err := createRequest(ctx, http.MethodGet, l.Href, l.Header, nil)
  30. if err != nil {
  31. return nil, err
  32. }
  33. resp, err := performRequest(ctx, a.client, req)
  34. if err != nil {
  35. return nil, err
  36. }
  37. return resp.Body, nil
  38. }
  39. // Upload sends the content to the LFS server.
  40. func (a *BasicTransferAdapter) Upload(ctx context.Context, l *Link, p Pointer, r io.Reader) error {
  41. req, err := createRequest(ctx, http.MethodPut, l.Href, l.Header, r)
  42. if err != nil {
  43. return err
  44. }
  45. if req.Header.Get("Content-Type") == "" {
  46. req.Header.Set("Content-Type", "application/octet-stream")
  47. }
  48. if req.Header.Get("Transfer-Encoding") == "chunked" {
  49. req.TransferEncoding = []string{"chunked"}
  50. }
  51. req.ContentLength = p.Size
  52. res, err := performRequest(ctx, a.client, req)
  53. if err != nil {
  54. return err
  55. }
  56. defer res.Body.Close()
  57. return nil
  58. }
  59. // Verify calls the verify handler on the LFS server
  60. func (a *BasicTransferAdapter) Verify(ctx context.Context, l *Link, p Pointer) error {
  61. b, err := json.Marshal(p)
  62. if err != nil {
  63. log.Error("Error encoding json: %v", err)
  64. return err
  65. }
  66. req, err := createRequest(ctx, http.MethodPost, l.Href, l.Header, bytes.NewReader(b))
  67. if err != nil {
  68. return err
  69. }
  70. req.Header.Set("Content-Type", MediaType)
  71. res, err := performRequest(ctx, a.client, req)
  72. if err != nil {
  73. return err
  74. }
  75. defer res.Body.Close()
  76. return nil
  77. }