44package backend
55
66import (
7- "bytes"
87 "context"
98 "encoding/base64"
109 "fmt"
@@ -29,7 +28,7 @@ var Capabilities = []string{
2928 "locking" ,
3029}
3130
32- var _ transfer.Backend = & GiteaBackend {}
31+ var _ transfer.Backend = ( * GiteaBackend )( nil )
3332
3433// GiteaBackend is an adapter between git-lfs-transfer library and Gitea's internal LFS API
3534type GiteaBackend struct {
@@ -78,12 +77,13 @@ func (g *GiteaBackend) Batch(_ string, pointers []transfer.BatchItem, args trans
7877 headerAccept : mimeGitLFS ,
7978 headerContentType : mimeGitLFS ,
8079 }
81- req := newInternalRequest (g .ctx , url , http .MethodPost , headers , bodyBytes )
80+ req := newInternalRequestLFS (g .ctx , url , http .MethodPost , headers , bodyBytes )
8281 resp , err := req .Response ()
8382 if err != nil {
8483 g .logger .Log ("http request error" , err )
8584 return nil , err
8685 }
86+ defer resp .Body .Close ()
8787 if resp .StatusCode != http .StatusOK {
8888 g .logger .Log ("http statuscode error" , resp .StatusCode , statusCodeToErr (resp .StatusCode ))
8989 return nil , statusCodeToErr (resp .StatusCode )
@@ -158,8 +158,7 @@ func (g *GiteaBackend) Batch(_ string, pointers []transfer.BatchItem, args trans
158158 return pointers , nil
159159}
160160
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.
163162func (g * GiteaBackend ) Download (oid string , args transfer.Args ) (io.ReadCloser , int64 , error ) {
164163 idMapStr , exists := args [argID ]
165164 if ! exists {
@@ -187,25 +186,25 @@ func (g *GiteaBackend) Download(oid string, args transfer.Args) (io.ReadCloser,
187186 headerGiteaInternalAuth : g .internalAuth ,
188187 headerAccept : mimeOctetStream ,
189188 }
190- req := newInternalRequest (g .ctx , url , http .MethodGet , headers , nil )
189+ req := newInternalRequestLFS (g .ctx , url , http .MethodGet , headers , nil )
191190 resp , err := req .Response ()
192191 if err != nil {
193- return nil , 0 , err
192+ return nil , 0 , fmt . Errorf ( "failed to get response: %w" , err )
194193 }
194+ // no need to close the body here by "defer resp.Body.Close()", see below
195195 if resp .StatusCode != http .StatusOK {
196196 return nil , 0 , statusCodeToErr (resp .StatusCode )
197197 }
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 )
200200 if err != nil {
201- return nil , 0 , err
201+ return nil , 0 , fmt . Errorf ( "failed to parse content length: %w" , err )
202202 }
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
206205}
207206
208- // StartUpload implements transfer.Backend.
207+ // Upload implements transfer.Backend.
209208func (g * GiteaBackend ) Upload (oid string , size int64 , r io.Reader , args transfer.Args ) error {
210209 idMapStr , exists := args [argID ]
211210 if ! exists {
@@ -234,15 +233,14 @@ func (g *GiteaBackend) Upload(oid string, size int64, r io.Reader, args transfer
234233 headerContentType : mimeOctetStream ,
235234 headerContentLength : strconv .FormatInt (size , 10 ),
236235 }
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 )
242239 resp , err := req .Response ()
243240 if err != nil {
244241 return err
245242 }
243+ defer resp .Body .Close ()
246244 if resp .StatusCode != http .StatusOK {
247245 return statusCodeToErr (resp .StatusCode )
248246 }
@@ -284,11 +282,12 @@ func (g *GiteaBackend) Verify(oid string, size int64, args transfer.Args) (trans
284282 headerAccept : mimeGitLFS ,
285283 headerContentType : mimeGitLFS ,
286284 }
287- req := newInternalRequest (g .ctx , url , http .MethodPost , headers , bodyBytes )
285+ req := newInternalRequestLFS (g .ctx , url , http .MethodPost , headers , bodyBytes )
288286 resp , err := req .Response ()
289287 if err != nil {
290288 return transfer .NewStatus (transfer .StatusInternalServerError ), err
291289 }
290+ defer resp .Body .Close ()
292291 if resp .StatusCode != http .StatusOK {
293292 return transfer .NewStatus (uint32 (resp .StatusCode ), http .StatusText (resp .StatusCode )), statusCodeToErr (resp .StatusCode )
294293 }
0 commit comments