@@ -28,44 +28,61 @@ func (f RangeReaderFunc) RangeRead(ctx context.Context, httpRange http_range.Ran
2828}
2929
3030func GetRangeReaderFromLink (size int64 , link * model.Link ) (model.RangeReaderIF , error ) {
31- if link .Concurrency > 0 || link .PartSize > 0 {
31+ if link .RangeReader != nil {
32+ if link .Concurrency < 1 && link .PartSize < 1 {
33+ return link .RangeReader , nil
34+ }
3235 down := net .NewDownloader (func (d * net.Downloader ) {
3336 d .Concurrency = link .Concurrency
3437 d .PartSize = link .PartSize
38+ d .HttpClient = net .GetRangeReaderHttpRequestFunc (link .RangeReader )
3539 })
36- var rangeReader RangeReaderFunc = func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
37- var req * net.HttpRequestParams
38- if link .RangeReader != nil {
39- req = & net.HttpRequestParams {
40- Range : httpRange ,
41- Size : size ,
42- }
43- } else {
44- requestHeader , _ := ctx .Value (conf .RequestHeaderKey ).(http.Header )
45- header := net .ProcessHeader (requestHeader , link .Header )
46- req = & net.HttpRequestParams {
47- Range : httpRange ,
48- Size : size ,
49- URL : link .URL ,
50- HeaderRef : header ,
51- }
52- }
53- return down .Download (ctx , req )
40+ rangeReader := func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
41+ return down .Download (ctx , & net.HttpRequestParams {
42+ Range : httpRange ,
43+ Size : size ,
44+ })
5445 }
55- if link .RangeReader != nil {
56- down .HttpClient = net .GetRangeReaderHttpRequestFunc (link .RangeReader )
57- return rangeReader , nil
58- }
59- return RateLimitRangeReaderFunc (rangeReader ), nil
60- }
61-
62- if link .RangeReader != nil {
63- return link .RangeReader , nil
46+ // RangeReader只能在驱动限速
47+ return RangeReaderFunc (rangeReader ), nil
6448 }
6549
6650 if len (link .URL ) == 0 {
6751 return nil , errors .New ("invalid link: must have at least one of URL or RangeReader" )
6852 }
53+
54+ if link .Concurrency > 0 || link .PartSize > 0 {
55+ down := net .NewDownloader (func (d * net.Downloader ) {
56+ d .Concurrency = link .Concurrency
57+ d .PartSize = link .PartSize
58+ d .HttpClient = func (ctx context.Context , params * net.HttpRequestParams ) (* http.Response , error ) {
59+ if ServerDownloadLimit == nil {
60+ return net .DefaultHttpRequestFunc (ctx , params )
61+ }
62+ resp , err := net .DefaultHttpRequestFunc (ctx , params )
63+ if err == nil && resp .Body != nil {
64+ resp .Body = & RateLimitReader {
65+ Ctx : ctx ,
66+ Reader : resp .Body ,
67+ Limiter : ServerDownloadLimit ,
68+ }
69+ }
70+ return resp , err
71+ }
72+ })
73+ rangeReader := func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
74+ requestHeader , _ := ctx .Value (conf .RequestHeaderKey ).(http.Header )
75+ header := net .ProcessHeader (requestHeader , link .Header )
76+ return down .Download (ctx , & net.HttpRequestParams {
77+ Range : httpRange ,
78+ Size : size ,
79+ URL : link .URL ,
80+ HeaderRef : header ,
81+ })
82+ }
83+ return RangeReaderFunc (rangeReader ), nil
84+ }
85+
6986 rangeReader := func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
7087 if httpRange .Length < 0 || httpRange .Start + httpRange .Length > size {
7188 httpRange .Length = size - httpRange .Start
@@ -81,7 +98,15 @@ func GetRangeReaderFromLink(size int64, link *model.Link) (model.RangeReaderIF,
8198 }
8299 return nil , fmt .Errorf ("http request failure, err:%w" , err )
83100 }
84- if httpRange .Start == 0 && (httpRange .Length == - 1 || httpRange .Length == size ) || response .StatusCode == http .StatusPartialContent ||
101+ if ServerDownloadLimit != nil {
102+ response .Body = & RateLimitReader {
103+ Ctx : ctx ,
104+ Reader : response .Body ,
105+ Limiter : ServerDownloadLimit ,
106+ }
107+ }
108+ if httpRange .Start == 0 && httpRange .Length == size ||
109+ response .StatusCode == http .StatusPartialContent ||
85110 checkContentRange (& response .Header , httpRange .Start ) {
86111 return response .Body , nil
87112 } else if response .StatusCode == http .StatusOK {
@@ -94,11 +119,10 @@ func GetRangeReaderFromLink(size int64, link *model.Link) (model.RangeReaderIF,
94119 }
95120 return response .Body , nil
96121 }
97- return RateLimitRangeReaderFunc (rangeReader ), nil
122+ return RangeReaderFunc (rangeReader ), nil
98123}
99124
100- // RangeReaderIF.RangeRead返回的io.ReadCloser保留file的签名。
101- func GetRangeReaderFromMFile (size int64 , file model.File ) model.RangeReaderIF {
125+ func GetRangeReaderFromMFile (size int64 , file model.File ) * model.FileRangeReader {
102126 return & model.FileRangeReader {
103127 RangeReaderIF : RangeReaderFunc (func (ctx context.Context , httpRange http_range.Range ) (io.ReadCloser , error ) {
104128 length := httpRange .Length
0 commit comments