@@ -25,6 +25,7 @@ import (
2525
2626	"github.com/dragonflyoss/Dragonfly/dfget/config" 
2727	"github.com/dragonflyoss/Dragonfly/pkg/httputils" 
28+ 	"github.com/dragonflyoss/Dragonfly/pkg/rangeutils" 
2829	"github.com/dragonflyoss/Dragonfly/version" 
2930)
3031
@@ -56,8 +57,10 @@ func NewDownloadAPI() DownloadAPI {
5657}
5758
5859func  (d  * downloadAPI ) Download (ip  string , port  int , req  * DownloadRequest , timeout  time.Duration ) (* http.Response , error ) {
60+ 	if  req  ==  nil  {
61+ 		return  nil , fmt .Errorf ("nil dwonload request" )
62+ 	}
5963	headers  :=  make (map [string ]string )
60- 	headers [config .StrRange ] =  config .StrBytes  +  "="  +  req .PieceRange 
6164	headers [config .StrPieceNum ] =  strconv .Itoa (req .PieceNum )
6265	headers [config .StrPieceSize ] =  fmt .Sprint (req .PieceSize )
6366	headers [config .StrUserAgent ] =  "dfget/"  +  version .DFGetVersion 
@@ -67,12 +70,52 @@ func (d *downloadAPI) Download(ip string, port int, req *DownloadRequest, timeou
6770		}
6871	}
6972
70- 	var  url  string 
71- 	if  strings .Contains (req .Path , "://" ) {
73+ 	var  (
74+ 		url       string 
75+ 		rangeStr  string 
76+ 	)
77+ 	if  isFromSource (req ) {
78+ 		rangeStr  =  getRealRange (req .PieceRange , headers [config .StrRange ])
7279		url  =  req .Path 
7380	} else  {
81+ 		rangeStr  =  req .PieceRange 
7482		url  =  fmt .Sprintf ("http://%s:%d%s" , ip , port , req .Path )
7583	}
84+ 	headers [config .StrRange ] =  httputils .ConstructRangeStr (rangeStr )
7685
7786	return  httputils .HTTPGetTimeout (url , headers , timeout )
7887}
88+ 
89+ func  isFromSource (req  * DownloadRequest ) bool  {
90+ 	return  strings .Contains (req .Path , "://" )
91+ }
92+ 
93+ // getRealRange 
94+ // pieceRange: "start-end" 
95+ // rangeHeaderValue: "bytes=sourceStart-sourceEnd" 
96+ // return: "realStart-realEnd" 
97+ func  getRealRange (pieceRange  string , rangeHeaderValue  string ) string  {
98+ 	if  rangeHeaderValue  ==  ""  {
99+ 		return  pieceRange 
100+ 	}
101+ 	rangeEle  :=  strings .Split (rangeHeaderValue , "=" )
102+ 	if  len (rangeEle ) !=  2  {
103+ 		return  pieceRange 
104+ 	}
105+ 
106+ 	lower , upper , err  :=  rangeutils .ParsePieceIndex (rangeEle [1 ])
107+ 	if  err  !=  nil  {
108+ 		return  pieceRange 
109+ 	}
110+ 	start , end , err  :=  rangeutils .ParsePieceIndex (pieceRange )
111+ 	if  err  !=  nil  {
112+ 		return  pieceRange 
113+ 	}
114+ 
115+ 	realStart  :=  start  +  lower 
116+ 	realEnd  :=  end  +  lower 
117+ 	if  realEnd  >  upper  {
118+ 		realEnd  =  upper 
119+ 	}
120+ 	return  fmt .Sprintf ("%d-%d" , realStart , realEnd )
121+ }
0 commit comments