4
4
package backend
5
5
6
6
import (
7
- "bytes"
8
7
"context"
9
8
"encoding/base64"
10
9
"fmt"
@@ -29,7 +28,7 @@ var Capabilities = []string{
29
28
"locking" ,
30
29
}
31
30
32
- var _ transfer.Backend = & GiteaBackend {}
31
+ var _ transfer.Backend = ( * GiteaBackend )( nil )
33
32
34
33
// GiteaBackend is an adapter between git-lfs-transfer library and Gitea's internal LFS API
35
34
type GiteaBackend struct {
@@ -78,12 +77,13 @@ func (g *GiteaBackend) Batch(_ string, pointers []transfer.BatchItem, args trans
78
77
headerAccept : mimeGitLFS ,
79
78
headerContentType : mimeGitLFS ,
80
79
}
81
- req := newInternalRequest (g .ctx , url , http .MethodPost , headers , bodyBytes )
80
+ req := newInternalRequestLFS (g .ctx , url , http .MethodPost , headers , bodyBytes )
82
81
resp , err := req .Response ()
83
82
if err != nil {
84
83
g .logger .Log ("http request error" , err )
85
84
return nil , err
86
85
}
86
+ defer resp .Body .Close ()
87
87
if resp .StatusCode != http .StatusOK {
88
88
g .logger .Log ("http statuscode error" , resp .StatusCode , statusCodeToErr (resp .StatusCode ))
89
89
return nil , statusCodeToErr (resp .StatusCode )
@@ -158,8 +158,7 @@ func (g *GiteaBackend) Batch(_ string, pointers []transfer.BatchItem, args trans
158
158
return pointers , nil
159
159
}
160
160
161
- // Download implements transfer.Backend. The returned reader must be closed by the
162
- // caller.
161
+ // Download implements transfer.Backend. The returned reader must be closed by the caller.
163
162
func (g * GiteaBackend ) Download (oid string , args transfer.Args ) (io.ReadCloser , int64 , error ) {
164
163
idMapStr , exists := args [argID ]
165
164
if ! exists {
@@ -187,25 +186,25 @@ func (g *GiteaBackend) Download(oid string, args transfer.Args) (io.ReadCloser,
187
186
headerGiteaInternalAuth : g .internalAuth ,
188
187
headerAccept : mimeOctetStream ,
189
188
}
190
- req := newInternalRequest (g .ctx , url , http .MethodGet , headers , nil )
189
+ req := newInternalRequestLFS (g .ctx , url , http .MethodGet , headers , nil )
191
190
resp , err := req .Response ()
192
191
if err != nil {
193
- return nil , 0 , err
192
+ return nil , 0 , fmt . Errorf ( "failed to get response: %w" , err )
194
193
}
194
+ // no need to close the body here by "defer resp.Body.Close()", see below
195
195
if resp .StatusCode != http .StatusOK {
196
196
return nil , 0 , statusCodeToErr (resp .StatusCode )
197
197
}
198
- defer resp . Body . Close ()
199
- respBytes , err := io . ReadAll (resp .Body )
198
+
199
+ respSize , err := strconv . ParseInt (resp .Header . Get ( "X-Gitea-LFS-Content-Length" ), 10 , 64 )
200
200
if err != nil {
201
- return nil , 0 , err
201
+ return nil , 0 , fmt . Errorf ( "failed to parse content length: %w" , err )
202
202
}
203
- respSize := int64 (len (respBytes ))
204
- respBuf := io .NopCloser (bytes .NewBuffer (respBytes ))
205
- return respBuf , respSize , nil
203
+ // transfer.Backend will check io.Closer interface and close this Body reader
204
+ return resp .Body , respSize , nil
206
205
}
207
206
208
- // StartUpload implements transfer.Backend.
207
+ // Upload implements transfer.Backend.
209
208
func (g * GiteaBackend ) Upload (oid string , size int64 , r io.Reader , args transfer.Args ) error {
210
209
idMapStr , exists := args [argID ]
211
210
if ! exists {
@@ -234,15 +233,14 @@ func (g *GiteaBackend) Upload(oid string, size int64, r io.Reader, args transfer
234
233
headerContentType : mimeOctetStream ,
235
234
headerContentLength : strconv .FormatInt (size , 10 ),
236
235
}
237
- reqBytes , err := io .ReadAll (r )
238
- if err != nil {
239
- return err
240
- }
241
- req := newInternalRequest (g .ctx , url , http .MethodPut , headers , reqBytes )
236
+
237
+ req := newInternalRequestLFS (g .ctx , url , http .MethodPut , headers , nil )
238
+ req .Body (r )
242
239
resp , err := req .Response ()
243
240
if err != nil {
244
241
return err
245
242
}
243
+ defer resp .Body .Close ()
246
244
if resp .StatusCode != http .StatusOK {
247
245
return statusCodeToErr (resp .StatusCode )
248
246
}
@@ -284,11 +282,12 @@ func (g *GiteaBackend) Verify(oid string, size int64, args transfer.Args) (trans
284
282
headerAccept : mimeGitLFS ,
285
283
headerContentType : mimeGitLFS ,
286
284
}
287
- req := newInternalRequest (g .ctx , url , http .MethodPost , headers , bodyBytes )
285
+ req := newInternalRequestLFS (g .ctx , url , http .MethodPost , headers , bodyBytes )
288
286
resp , err := req .Response ()
289
287
if err != nil {
290
288
return transfer .NewStatus (transfer .StatusInternalServerError ), err
291
289
}
290
+ defer resp .Body .Close ()
292
291
if resp .StatusCode != http .StatusOK {
293
292
return transfer .NewStatus (uint32 (resp .StatusCode ), http .StatusText (resp .StatusCode )), statusCodeToErr (resp .StatusCode )
294
293
}
0 commit comments