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,22 @@ 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 {
193192 return nil , 0 , err
194193 }
194+ // no need to close the body "defer resp.Body.Close()", see below
195+
195196 if resp .StatusCode != http .StatusOK {
196197 return nil , 0 , statusCodeToErr (resp .StatusCode )
197198 }
198- defer resp .Body .Close ()
199- respBytes , err := io .ReadAll (resp .Body )
200- if err != nil {
201- return nil , 0 , err
202- }
203- respSize := int64 (len (respBytes ))
204- respBuf := io .NopCloser (bytes .NewBuffer (respBytes ))
205- return respBuf , respSize , nil
199+ respSize := int64 (0 ) // TODO: figure out the real size
200+ // transfer.Backend will check io.Closer interface and close this Body reader
201+ return resp .Body , respSize , nil
206202}
207203
208- // StartUpload implements transfer.Backend.
204+ // Upload implements transfer.Backend.
209205func (g * GiteaBackend ) Upload (oid string , size int64 , r io.Reader , args transfer.Args ) error {
210206 idMapStr , exists := args [argID ]
211207 if ! exists {
@@ -234,15 +230,14 @@ func (g *GiteaBackend) Upload(oid string, size int64, r io.Reader, args transfer
234230 headerContentType : mimeOctetStream ,
235231 headerContentLength : strconv .FormatInt (size , 10 ),
236232 }
237- reqBytes , err := io .ReadAll (r )
238- if err != nil {
239- return err
240- }
241- req := newInternalRequest (g .ctx , url , http .MethodPut , headers , reqBytes )
233+
234+ req := newInternalRequestLFS (g .ctx , url , http .MethodPut , headers , nil )
235+ req .Body (r )
242236 resp , err := req .Response ()
243237 if err != nil {
244238 return err
245239 }
240+ defer resp .Body .Close ()
246241 if resp .StatusCode != http .StatusOK {
247242 return statusCodeToErr (resp .StatusCode )
248243 }
@@ -284,11 +279,12 @@ func (g *GiteaBackend) Verify(oid string, size int64, args transfer.Args) (trans
284279 headerAccept : mimeGitLFS ,
285280 headerContentType : mimeGitLFS ,
286281 }
287- req := newInternalRequest (g .ctx , url , http .MethodPost , headers , bodyBytes )
282+ req := newInternalRequestLFS (g .ctx , url , http .MethodPost , headers , bodyBytes )
288283 resp , err := req .Response ()
289284 if err != nil {
290285 return transfer .NewStatus (transfer .StatusInternalServerError ), err
291286 }
287+ defer resp .Body .Close ()
292288 if resp .StatusCode != http .StatusOK {
293289 return transfer .NewStatus (uint32 (resp .StatusCode ), http .StatusText (resp .StatusCode )), statusCodeToErr (resp .StatusCode )
294290 }
0 commit comments