gitech

Форк
0
/
transferadapter.go 
88 строк · 2.2 Кб
1
// Copyright 2021 The Gitea Authors. All rights reserved.
2
// SPDX-License-Identifier: MIT
3

4
package lfs
5

6
import (
7
	"bytes"
8
	"context"
9
	"io"
10
	"net/http"
11

12
	"code.gitea.io/gitea/modules/json"
13
	"code.gitea.io/gitea/modules/log"
14
)
15

16
// TransferAdapter represents an adapter for downloading/uploading LFS objects.
17
type TransferAdapter interface {
18
	Name() string
19
	Download(ctx context.Context, l *Link) (io.ReadCloser, error)
20
	Upload(ctx context.Context, l *Link, p Pointer, r io.Reader) error
21
	Verify(ctx context.Context, l *Link, p Pointer) error
22
}
23

24
// BasicTransferAdapter implements the "basic" adapter.
25
type BasicTransferAdapter struct {
26
	client *http.Client
27
}
28

29
// Name returns the name of the adapter.
30
func (a *BasicTransferAdapter) Name() string {
31
	return "basic"
32
}
33

34
// Download reads the download location and downloads the data.
35
func (a *BasicTransferAdapter) Download(ctx context.Context, l *Link) (io.ReadCloser, error) {
36
	req, err := createRequest(ctx, http.MethodGet, l.Href, l.Header, nil)
37
	if err != nil {
38
		return nil, err
39
	}
40
	resp, err := performRequest(ctx, a.client, req)
41
	if err != nil {
42
		return nil, err
43
	}
44
	return resp.Body, nil
45
}
46

47
// Upload sends the content to the LFS server.
48
func (a *BasicTransferAdapter) Upload(ctx context.Context, l *Link, p Pointer, r io.Reader) error {
49
	req, err := createRequest(ctx, http.MethodPut, l.Href, l.Header, r)
50
	if err != nil {
51
		return err
52
	}
53
	if req.Header.Get("Content-Type") == "" {
54
		req.Header.Set("Content-Type", "application/octet-stream")
55
	}
56
	if req.Header.Get("Transfer-Encoding") == "chunked" {
57
		req.TransferEncoding = []string{"chunked"}
58
	}
59
	req.ContentLength = p.Size
60

61
	res, err := performRequest(ctx, a.client, req)
62
	if err != nil {
63
		return err
64
	}
65
	defer res.Body.Close()
66
	return nil
67
}
68

69
// Verify calls the verify handler on the LFS server
70
func (a *BasicTransferAdapter) Verify(ctx context.Context, l *Link, p Pointer) error {
71
	b, err := json.Marshal(p)
72
	if err != nil {
73
		log.Error("Error encoding json: %v", err)
74
		return err
75
	}
76

77
	req, err := createRequest(ctx, http.MethodPost, l.Href, l.Header, bytes.NewReader(b))
78
	if err != nil {
79
		return err
80
	}
81
	req.Header.Set("Content-Type", MediaType)
82
	res, err := performRequest(ctx, a.client, req)
83
	if err != nil {
84
		return err
85
	}
86
	defer res.Body.Close()
87
	return nil
88
}
89

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.