mirror of https://github.com/Xhofe/alist
31 lines
810 B
Go
31 lines
810 B
Go
package base
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/alist-org/alist/v3/internal/model"
|
|
"github.com/alist-org/alist/v3/pkg/http_range"
|
|
"github.com/alist-org/alist/v3/pkg/utils"
|
|
)
|
|
|
|
func HandleRange(link *model.Link, file io.ReadSeekCloser, header http.Header, size int64) {
|
|
if header.Get("Range") != "" {
|
|
r, err := http_range.ParseRange(header.Get("Range"), size)
|
|
if err == nil && len(r) > 0 {
|
|
_, err := file.Seek(r[0].Start, io.SeekStart)
|
|
if err == nil {
|
|
link.Data = utils.NewLimitReadCloser(file, func() error {
|
|
return file.Close()
|
|
}, r[0].Length)
|
|
link.Status = http.StatusPartialContent
|
|
link.Header = http.Header{
|
|
"Content-Range": []string{r[0].ContentRange(size)},
|
|
"Content-Length": []string{strconv.FormatInt(r[0].Length, 10)},
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|