@@ -227,18 +227,25 @@ func (f *FileDao) FileGetGenerator(c echo.Context, repoType, orgRepo, commit, fi
227227
228228func constructRespHeader (c echo.Context , pathInfo * common.PathsInfo , commit , fileName string ) (map [string ]string , string , int64 , int64 ) {
229229 var startPos , endPos int64
230+ var clientHasRange bool
230231 if pathInfo .Size > 0 { // There exists a file of size 0
231232 var headRange = c .Request ().Header .Get ("Range" )
232- if headRange == "" {
233- headRange = fmt .Sprintf ("bytes=%d-%d" , 0 , pathInfo .Size - 1 )
233+ defaultEndPos := pathInfo .Size - 1
234+ if headRange != "" {
235+ clientHasRange = true
236+ } else {
237+ headRange = fmt .Sprintf ("bytes=%d-%d" , 0 , defaultEndPos )
234238 }
235- startPos , endPos = parseRangeParams (headRange , pathInfo . Size )
239+ startPos , endPos = parseRangeParams (headRange , defaultEndPos )
236240 endPos = endPos + 1
237241 } else if pathInfo .Size == 0 {
238242 zap .S ().Warnf ("file %s size: %d" , fileName , pathInfo .Size )
239243 }
240244 respHeaders := map [string ]string {}
241245 respHeaders [consts .HUGGINGFACE_HEADER_CONTENT_LENGTH ] = util .Itoa (endPos - startPos )
246+ if clientHasRange && pathInfo .Size > 0 {
247+ respHeaders ["Content-Range" ] = fmt .Sprintf ("bytes %d-%d/%d" , startPos , endPos - 1 , pathInfo .Size )
248+ }
242249 if commit != "" {
243250 respHeaders [strings .ToLower (consts .HUGGINGFACE_HEADER_X_REPO_COMMIT )] = commit
244251 }
@@ -455,10 +462,11 @@ func (f *FileDao) FileChunkGet(c echo.Context, taskParam *downloader.TaskParam,
455462 taskParam .Context = ctx
456463 taskParam .ResponseChan = responseChan
457464 taskParam .Cancel = cancel
458- fileErrCh := make (chan error , 1 )
459465 fileName := fmt .Sprintf ("%s/%s" , taskParam .OrgRepo , taskParam .FileName )
460- go f .downloaderDao .FileDownload (fileErrCh , startPos , endPos , isInnerRequest , taskParam )
461- if err := util .ResponseStream (ctx , c , fileName , respHeaders , responseChan , fileErrCh ); err != nil {
466+ if err := f .downloaderDao .FileDownload (startPos , endPos , isInnerRequest , taskParam ); err != nil {
467+ return util .MultipleErrorProxyError (err , c )
468+ }
469+ if err := util .ResponseStream (c , fileName , respHeaders , responseChan ); err != nil {
462470 zap .S ().Errorf ("FileChunkGet stream err.%v" , err )
463471 return util .ErrorProxyTimeout (c )
464472 }
@@ -526,7 +534,7 @@ func (f *FileDao) GetFileOffset(dataType string, org string, repo string, etag s
526534 return curPos
527535}
528536
529- func parseRangeParams (fileRange string , fileSize int64 ) (int64 , int64 ) {
537+ func parseRangeParams (fileRange string , defaultEndPos int64 ) (int64 , int64 ) {
530538 if strings .Contains (fileRange , "/" ) {
531539 split := strings .SplitN (fileRange , "/" , 2 )
532540 fileRange = split [0 ]
@@ -548,7 +556,7 @@ func parseRangeParams(fileRange string, fileSize int64) (int64, int64) {
548556 if s2 != 0 {
549557 endPos = s2
550558 } else {
551- endPos = fileSize - 1
559+ endPos = defaultEndPos
552560 }
553561 return startPos , endPos
554562}
0 commit comments