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,17 +77,17 @@ 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 )
9090 }
91- defer resp .Body .Close ()
9291 respBytes , err := io .ReadAll (resp .Body )
9392 if err != nil {
9493 g .logger .Log ("http read error" , err )
@@ -158,8 +157,7 @@ func (g *GiteaBackend) Batch(_ string, pointers []transfer.BatchItem, args trans
158157 return pointers , nil
159158}
160159
161- // Download implements transfer.Backend. The returned reader must be closed by the
162- // caller.
160+ // Download implements transfer.Backend. The returned reader must be closed by the caller.
163161func (g * GiteaBackend ) Download (oid string , args transfer.Args ) (io.ReadCloser , int64 , error ) {
164162 idMapStr , exists := args [argID ]
165163 if ! exists {
@@ -187,25 +185,25 @@ func (g *GiteaBackend) Download(oid string, args transfer.Args) (io.ReadCloser,
187185 headerGiteaInternalAuth : g .internalAuth ,
188186 headerAccept : mimeOctetStream ,
189187 }
190- req := newInternalRequest (g .ctx , url , http .MethodGet , headers , nil )
188+ req := newInternalRequestLFS (g .ctx , url , http .MethodGet , headers , nil )
191189 resp , err := req .Response ()
192190 if err != nil {
193- return nil , 0 , err
191+ return nil , 0 , fmt . Errorf ( "failed to get response: %w" , err )
194192 }
193+ // no need to close the body here by "defer resp.Body.Close()", see below
195194 if resp .StatusCode != http .StatusOK {
196195 return nil , 0 , statusCodeToErr (resp .StatusCode )
197196 }
198- defer resp . Body . Close ()
199- respBytes , err := io . ReadAll (resp .Body )
197+
198+ respSize , err := strconv . ParseInt (resp .Header . Get ( "X-Gitea-LFS-Content-Length" ), 10 , 64 )
200199 if err != nil {
201- return nil , 0 , err
200+ return nil , 0 , fmt . Errorf ( "failed to parse content length: %w" , err )
202201 }
203- respSize := int64 (len (respBytes ))
204- respBuf := io .NopCloser (bytes .NewBuffer (respBytes ))
205- return respBuf , respSize , nil
202+ // transfer.Backend will check io.Closer interface and close this Body reader
203+ return resp .Body , respSize , nil
206204}
207205
208- // StartUpload implements transfer.Backend.
206+ // Upload implements transfer.Backend.
209207func (g * GiteaBackend ) Upload (oid string , size int64 , r io.Reader , args transfer.Args ) error {
210208 idMapStr , exists := args [argID ]
211209 if ! exists {
@@ -234,15 +232,14 @@ func (g *GiteaBackend) Upload(oid string, size int64, r io.Reader, args transfer
234232 headerContentType : mimeOctetStream ,
235233 headerContentLength : strconv .FormatInt (size , 10 ),
236234 }
237- reqBytes , err := io .ReadAll (r )
238- if err != nil {
239- return err
240- }
241- req := newInternalRequest (g .ctx , url , http .MethodPut , headers , reqBytes )
235+
236+ req := newInternalRequestLFS (g .ctx , url , http .MethodPut , headers , nil )
237+ req .Body (r )
242238 resp , err := req .Response ()
243239 if err != nil {
244240 return err
245241 }
242+ defer resp .Body .Close ()
246243 if resp .StatusCode != http .StatusOK {
247244 return statusCodeToErr (resp .StatusCode )
248245 }
@@ -284,11 +281,12 @@ func (g *GiteaBackend) Verify(oid string, size int64, args transfer.Args) (trans
284281 headerAccept : mimeGitLFS ,
285282 headerContentType : mimeGitLFS ,
286283 }
287- req := newInternalRequest (g .ctx , url , http .MethodPost , headers , bodyBytes )
284+ req := newInternalRequestLFS (g .ctx , url , http .MethodPost , headers , bodyBytes )
288285 resp , err := req .Response ()
289286 if err != nil {
290287 return transfer .NewStatus (transfer .StatusInternalServerError ), err
291288 }
289+ defer resp .Body .Close ()
292290 if resp .StatusCode != http .StatusOK {
293291 return transfer .NewStatus (uint32 (resp .StatusCode ), http .StatusText (resp .StatusCode )), statusCodeToErr (resp .StatusCode )
294292 }
0 commit comments