@@ -6,55 +6,57 @@ package lfs
6
6
import (
7
7
"bytes"
8
8
"context"
9
- "errors"
10
- "fmt"
11
9
"io"
12
10
"net/http"
13
11
14
12
"code.gitea.io/gitea/modules/json"
15
13
"code.gitea.io/gitea/modules/log"
16
14
)
17
15
18
- // TransferAdapter represents an adapter for downloading/uploading LFS objects
16
+ // TransferAdapter represents an adapter for downloading/uploading LFS objects.
19
17
type TransferAdapter interface {
20
18
Name () string
21
19
Download (ctx context.Context , l * Link ) (io.ReadCloser , error )
22
20
Upload (ctx context.Context , l * Link , p Pointer , r io.Reader ) error
23
21
Verify (ctx context.Context , l * Link , p Pointer ) error
24
22
}
25
23
26
- // BasicTransferAdapter implements the "basic" adapter
24
+ // BasicTransferAdapter implements the "basic" adapter.
27
25
type BasicTransferAdapter struct {
28
26
client * http.Client
29
27
}
30
28
31
- // Name returns the name of the adapter
29
+ // Name returns the name of the adapter.
32
30
func (a * BasicTransferAdapter ) Name () string {
33
31
return "basic"
34
32
}
35
33
36
- // Download reads the download location and downloads the data
34
+ // Download reads the download location and downloads the data.
37
35
func (a * BasicTransferAdapter ) Download (ctx context.Context , l * Link ) (io.ReadCloser , error ) {
38
- resp , err := a .performRequest (ctx , "GET" , l , nil , nil )
36
+ req , err := createRequest (ctx , http .MethodGet , l .Href , "" , nil , nil )
37
+ if err != nil {
38
+ return nil , err
39
+ }
40
+ resp , err := performRequest (ctx , a .client , req )
39
41
if err != nil {
40
42
return nil , err
41
43
}
42
44
return resp .Body , nil
43
45
}
44
46
45
- // Upload sends the content to the LFS server
47
+ // Upload sends the content to the LFS server.
46
48
func (a * BasicTransferAdapter ) Upload (ctx context.Context , l * Link , p Pointer , r io.Reader ) error {
47
- res , err := a .performRequest (ctx , "PUT" , l , r , func (req * http.Request ) {
48
- if len (req .Header .Get ("Content-Type" )) == 0 {
49
- req .Header .Set ("Content-Type" , "application/octet-stream" )
50
- }
51
-
52
- if req .Header .Get ("Transfer-Encoding" ) == "chunked" {
53
- req .TransferEncoding = []string {"chunked" }
54
- }
49
+ contentType := "application/octet-stream"
50
+ req , err := createRequest (ctx , http .MethodPut , l .Href , contentType , nil , r )
51
+ if err != nil {
52
+ return err
53
+ }
54
+ if req .Header .Get ("Transfer-Encoding" ) == "chunked" {
55
+ req .TransferEncoding = []string {"chunked" }
56
+ }
57
+ req .ContentLength = p .Size
55
58
56
- req .ContentLength = p .Size
57
- })
59
+ res , err := performRequest (ctx , a .client , req )
58
60
if err != nil {
59
61
return err
60
62
}
@@ -70,70 +72,15 @@ func (a *BasicTransferAdapter) Verify(ctx context.Context, l *Link, p Pointer) e
70
72
return err
71
73
}
72
74
73
- res , err := a .performRequest (ctx , "POST" , l , bytes .NewReader (b ), func (req * http.Request ) {
74
- req .Header .Set ("Content-Type" , MediaType )
75
- })
75
+ contentType := MediaType
76
+ req , err := createRequest (ctx , http .MethodPost , l .Href , contentType , nil , bytes .NewReader (b ))
76
77
if err != nil {
77
78
return err
78
79
}
79
- defer res .Body .Close ()
80
- return nil
81
- }
82
-
83
- // performRequest sends a request, optionally performs a callback on the request and returns the response.
84
- // If the status code is 200, the response is returned, and it will contain a non-nil Body.
85
- // Otherwise, it will return an error, and the Body will be nil or closed.
86
- func (a * BasicTransferAdapter ) performRequest (ctx context.Context , method string , l * Link , body io.Reader , callback func (* http.Request )) (* http.Response , error ) {
87
- log .Trace ("Calling: %s %s" , method , l .Href )
88
-
89
- req , err := http .NewRequestWithContext (ctx , method , l .Href , body )
80
+ res , err := performRequest (ctx , a .client , req )
90
81
if err != nil {
91
- log .Error ("Error creating request: %v" , err )
92
- return nil , err
93
- }
94
- for key , value := range l .Header {
95
- req .Header .Set (key , value )
96
- }
97
- req .Header .Set ("Accept" , MediaType )
98
-
99
- if callback != nil {
100
- callback (req )
101
- }
102
-
103
- res , err := a .client .Do (req )
104
- if err != nil {
105
- select {
106
- case <- ctx .Done ():
107
- return res , ctx .Err ()
108
- default :
109
- }
110
- log .Error ("Error while processing request: %v" , err )
111
- return res , err
112
- }
113
-
114
- if res .StatusCode != http .StatusOK {
115
- return res , handleErrorResponse (res )
116
- }
117
-
118
- return res , nil
119
- }
120
-
121
- func handleErrorResponse (resp * http.Response ) error {
122
- defer resp .Body .Close ()
123
-
124
- er , err := decodeResponseError (resp .Body )
125
- if err != nil {
126
- return fmt .Errorf ("request failed with status %s" , resp .Status )
127
- }
128
- log .Trace ("ErrorRespone: %v" , er )
129
- return errors .New (er .Message )
130
- }
131
-
132
- func decodeResponseError (r io.Reader ) (ErrorResponse , error ) {
133
- var er ErrorResponse
134
- err := json .NewDecoder (r ).Decode (& er )
135
- if err != nil {
136
- log .Error ("Error decoding json: %v" , err )
82
+ return err
137
83
}
138
- return er , err
84
+ defer res .Body .Close ()
85
+ return nil
139
86
}
0 commit comments