@@ -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