@@ -249,6 +249,7 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
249249 }
250250 linkClosers := make ([]io.Closer , 0 , len (files ))
251251 rrf := make ([]model.RangeReaderIF , 0 , len (files ))
252+ requireReference := false
252253 for _ , f := range files {
253254 link , fi , err := d .link (ctx , f .GetPath (), args )
254255 if err != nil {
@@ -258,30 +259,41 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
258259 _ = link .Close ()
259260 continue
260261 }
261- l := * link // 复制一份,避免修改到原始link
262- if l .ContentLength == 0 {
263- l .ContentLength = fi .GetSize ()
262+ l := & model.Link {
263+ URL : link .URL ,
264+ Header : link .Header ,
265+ RangeReader : link .RangeReader ,
266+ Concurrency : link .Concurrency ,
267+ PartSize : link .PartSize ,
268+ ContentLength : link .ContentLength ,
264269 }
265270 if d .DownloadConcurrency > 0 {
266271 l .Concurrency = d .DownloadConcurrency
267272 }
268273 if d .DownloadPartSize > 0 {
269274 l .PartSize = d .DownloadPartSize * utils .KB
270275 }
271- rr , err := stream .GetRangeReaderFromLink (l .ContentLength , & l )
276+ if l .ContentLength == 0 {
277+ l .ContentLength = fi .GetSize ()
278+ }
279+ rr , err := stream .GetRangeReaderFromLink (l .ContentLength , l )
272280 if err != nil {
273281 _ = link .Close ()
274282 continue
275283 }
276284 linkClosers = append (linkClosers , link )
285+ if link .RequireReference {
286+ requireReference = true
287+ }
277288 rrf = append (rrf , rr )
278289 }
279290 rr := func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
280291 return rrf [rand .Intn (len (rrf ))].RangeRead (ctx , httpRange )
281292 }
282293 return & model.Link {
283- RangeReader : stream .RangeReaderFunc (rr ),
284- SyncClosers : utils .NewSyncClosers (linkClosers ... ),
294+ RangeReader : stream .RangeReaderFunc (rr ),
295+ SyncClosers : utils .NewSyncClosers (linkClosers ... ),
296+ RequireReference : requireReference ,
285297 }, nil
286298 }
287299
@@ -315,22 +327,21 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
315327 if err != nil {
316328 return nil , err
317329 }
318- resultLink := * link // 复制一份,避免修改到原始link
330+ resultLink := link . Clone () // 复制一份,避免修改到原始link
319331 resultLink .Expiration = nil
320- resultLink .SyncClosers = utils .NewSyncClosers (link )
321332 if args .Redirect {
322- return & resultLink , nil
323- }
324- if resultLink .ContentLength == 0 {
325- resultLink .ContentLength = fi .GetSize ()
333+ return resultLink , nil
326334 }
327335 if d .DownloadConcurrency > 0 {
328336 resultLink .Concurrency = d .DownloadConcurrency
329337 }
330338 if d .DownloadPartSize > 0 {
331339 resultLink .PartSize = d .DownloadPartSize * utils .KB
332340 }
333- return & resultLink , nil
341+ if resultLink .ContentLength == 0 {
342+ resultLink .ContentLength = fi .GetSize ()
343+ }
344+ return resultLink , nil
334345}
335346
336347func (d * Alias ) Other (ctx context.Context , args model.OtherArgs ) (interface {}, error ) {
@@ -501,9 +512,7 @@ func (d *Alias) Extract(ctx context.Context, obj model.Obj, args model.ArchiveIn
501512 sign .SignArchive (reqPath )),
502513 }, nil
503514 }
504- resultLink := * link
505- resultLink .SyncClosers = utils .NewSyncClosers (link )
506- return & resultLink , nil
515+ return link .Clone (), nil
507516}
508517
509518func (d * Alias ) ArchiveDecompress (ctx context.Context , srcObj , dstDir model.Obj , args model.ArchiveDecompressArgs ) error {
0 commit comments