@@ -254,58 +254,56 @@ func (d *Crypt) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
254
254
if remoteLink .RangeReadCloser == nil && remoteLink .MFile == nil && len (remoteLink .URL ) == 0 {
255
255
return nil , fmt .Errorf ("the remote storage driver need to be enhanced to support encrytion" )
256
256
}
257
+ resultRangeReadCloser := & model.RangeReadCloser {}
258
+ resultRangeReadCloser .TryAdd (remoteLink .MFile )
259
+ if remoteLink .RangeReadCloser != nil {
260
+ resultRangeReadCloser .AddClosers (remoteLink .RangeReadCloser .GetClosers ())
261
+ }
257
262
remoteFileSize := remoteFile .GetSize ()
258
- remoteClosers := utils .EmptyClosers ()
259
263
rangeReaderFunc := func (ctx context.Context , underlyingOffset , underlyingLength int64 ) (io.ReadCloser , error ) {
260
264
length := underlyingLength
261
265
if underlyingLength >= 0 && underlyingOffset + underlyingLength >= remoteFileSize {
262
266
length = - 1
263
267
}
264
- rrc := remoteLink .RangeReadCloser
265
- if len (remoteLink .URL ) > 0 {
266
- var converted , err = stream .GetRangeReadCloserFromLink (remoteFileSize , remoteLink )
268
+ if remoteLink .MFile != nil {
269
+ _ , err := remoteLink .MFile .Seek (underlyingOffset , io .SeekStart )
267
270
if err != nil {
268
271
return nil , err
269
272
}
270
- rrc = converted
273
+ //keep reuse same MFile and close at last.
274
+ return io .NopCloser (remoteLink .MFile ), nil
271
275
}
272
- if rrc != nil {
273
- remoteReader , err := rrc .RangeRead (ctx , http_range.Range {Start : underlyingOffset , Length : length })
274
- remoteClosers .AddClosers (rrc .GetClosers ())
276
+ rrc := remoteLink .RangeReadCloser
277
+ if rrc == nil && len (remoteLink .URL ) > 0 {
278
+ var err error
279
+ rrc , err = stream .GetRangeReadCloserFromLink (remoteFileSize , remoteLink )
275
280
if err != nil {
276
281
return nil , err
277
282
}
278
- return remoteReader , nil
283
+ resultRangeReadCloser .AddClosers (rrc .GetClosers ())
284
+ remoteLink .RangeReadCloser = rrc
279
285
}
280
- if remoteLink . MFile != nil {
281
- _ , err := remoteLink . MFile . Seek ( underlyingOffset , io . SeekStart )
286
+ if rrc != nil {
287
+ remoteReader , err := rrc . RangeRead ( ctx , http_range. Range { Start : underlyingOffset , Length : length } )
282
288
if err != nil {
283
289
return nil , err
284
290
}
285
- //keep reuse same MFile and close at last.
286
- remoteClosers .Add (remoteLink .MFile )
287
- return io .NopCloser (remoteLink .MFile ), nil
291
+ return remoteReader , nil
288
292
}
289
-
290
293
return nil , errs .NotSupport
291
294
292
295
}
293
- resultRangeReader : = func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
296
+ resultRangeReadCloser . RangeReader = func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
294
297
readSeeker , err := d .cipher .DecryptDataSeek (ctx , rangeReaderFunc , httpRange .Start , httpRange .Length )
295
298
if err != nil {
296
299
return nil , err
297
300
}
298
301
return readSeeker , nil
299
302
}
300
303
301
- resultRangeReadCloser := & model.RangeReadCloser {RangeReader : resultRangeReader , Closers : remoteClosers }
302
- resultLink := & model.Link {
304
+ return & model.Link {
303
305
RangeReadCloser : resultRangeReadCloser ,
304
- Expiration : remoteLink .Expiration ,
305
- }
306
-
307
- return resultLink , nil
308
-
306
+ }, nil
309
307
}
310
308
311
309
func (d * Crypt ) MakeDir (ctx context.Context , parentDir model.Obj , dirName string ) error {
0 commit comments