commit4fc0a77565Author: Andy Hsu <i@nn.ci> Date: Fri Oct 20 21:06:25 2023 +0800 fix(baidu_netdisk): upload file > 4GB (close #5392) commitaaffaee2b5Author: gmugu <94156510@qq.com> Date: Thu Oct 19 19:17:53 2023 +0800 perf(webdav): support request with cookies (#5391) commit8ef8023c20Author: NewbieOrange <NewbieOrange@users.noreply.github.com> Date: Thu Oct 19 19:17:09 2023 +0800 fix(aliyundrive_open): upload progress for normal upload (#5398) commitcdfbe6dcf2Author: foxxorcat <95907542+foxxorcat@users.noreply.github.com> Date: Wed Oct 18 16:27:07 2023 +0800 fix: hash gcid empty file (#5394) commit94d028743aAuthor: Andy Hsu <i@nn.ci> Date: Sat Oct 14 13:17:51 2023 +0800 ci: remove `pr-welcome` label when close issue [skip ci] commit7f7335435cAuthor: itsHenry <2671230065@qq.com> Date: Sat Oct 14 13:12:46 2023 +0800 feat(cloudreve): support thumbnail (#5373 close #5348) * feat(cloudreve): support thumbnail * chore: remove unnecessary code commitb9e192b29cAuthor: foxxorcat <95907542+foxxorcat@users.noreply.github.com> Date: Thu Oct 12 20:57:12 2023 +0800 fix(115): limit request rate (#5367 close #5275) * fix(115):limit request rate * chore(115): fix unit of `limit_rate` --------- Co-authored-by: Andy Hsu <i@nn.ci> commit69a98eaef6Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Oct 11 22:01:55 2023 +0800 fix(deps): update module github.com/aliyun/aliyun-oss-go-sdk to v2.2.9+incompatible (#5141) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit1ebc96a4e5Author: Andy Hsu <i@nn.ci> Date: Tue Oct 10 18:32:00 2023 +0800 fix(wopan): fatal error concurrent map writes (close #5352) commit66e2324cacAuthor: Andy Hsu <i@nn.ci> Date: Tue Oct 10 18:23:11 2023 +0800 chore(deps): upgrade dependencies commit7600dc28dfAuthor: Andy Hsu <i@nn.ci> Date: Tue Oct 10 18:13:58 2023 +0800 fix(aliyundrive_open): change default api to raw server (close #5358) commit8ef89ad0a4Author: foxxorcat <95907542+foxxorcat@users.noreply.github.com> Date: Tue Oct 10 18:08:27 2023 +0800 fix(baidu_netdisk): hash and `error 2` (#5356) * fix(baidu):hash and error:2 * fix:invalid memory address commit35d672217dAuthor: jeffmingup <1960588251@qq.com> Date: Sun Oct 8 19:29:45 2023 +0800 fix(onedrive_app): incorrect api on `_accessToken` (#5346) commit1a283bb272Author: foxxorcat <95907542+foxxorcat@users.noreply.github.com> Date: Fri Oct 6 16:04:39 2023 +0800 feat(google_drive): add `hash_info`, `ctime`, `thumbnail` (#5334) commita008f54f4dAuthor: nkh0472 <67589323+nkh0472@users.noreply.github.com> Date: Thu Oct 5 13:10:51 2023 +0800 docs: minor language improvements (#5329) [skip ci]
89 lines
2.8 KiB
Go
89 lines
2.8 KiB
Go
package stream
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
|
|
"github.com/alist-org/alist/v3/internal/errs"
|
|
"github.com/alist-org/alist/v3/internal/model"
|
|
"github.com/alist-org/alist/v3/internal/net"
|
|
"github.com/alist-org/alist/v3/pkg/http_range"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func GetRangeReadCloserFromLink(size int64, link *model.Link) (model.RangeReadCloserIF, error) {
|
|
if len(link.URL) == 0 {
|
|
return nil, fmt.Errorf("can't create RangeReadCloser since URL is empty in link")
|
|
}
|
|
//remoteClosers := utils.EmptyClosers()
|
|
rangeReaderFunc := func(ctx context.Context, r http_range.Range) (io.ReadCloser, error) {
|
|
if link.Concurrency != 0 || link.PartSize != 0 {
|
|
header := net.ProcessHeader(http.Header{}, link.Header)
|
|
down := net.NewDownloader(func(d *net.Downloader) {
|
|
d.Concurrency = link.Concurrency
|
|
d.PartSize = link.PartSize
|
|
})
|
|
req := &net.HttpRequestParams{
|
|
URL: link.URL,
|
|
Range: r,
|
|
Size: size,
|
|
HeaderRef: header,
|
|
}
|
|
rc, err := down.Download(ctx, req)
|
|
if err != nil {
|
|
return nil, errs.NewErr(err, "GetReadCloserFromLink failed")
|
|
}
|
|
return rc, nil
|
|
|
|
}
|
|
if len(link.URL) > 0 {
|
|
response, err := RequestRangedHttp(ctx, link, r.Start, r.Length)
|
|
if err != nil {
|
|
if response == nil {
|
|
return nil, fmt.Errorf("http request failure, err:%s", err)
|
|
}
|
|
return nil, fmt.Errorf("http request failure,status: %d err:%s", response.StatusCode, err)
|
|
}
|
|
if r.Start == 0 && (r.Length == -1 || r.Length == size) || response.StatusCode == http.StatusPartialContent ||
|
|
checkContentRange(&response.Header, r.Start) {
|
|
return response.Body, nil
|
|
} else if response.StatusCode == http.StatusOK {
|
|
log.Warnf("remote http server not supporting range request, expect low perfromace!")
|
|
readCloser, err := net.GetRangedHttpReader(response.Body, r.Start, r.Length)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return readCloser, nil
|
|
|
|
}
|
|
|
|
return response.Body, nil
|
|
}
|
|
|
|
return nil, errs.NotSupport
|
|
}
|
|
resultRangeReadCloser := model.RangeReadCloser{RangeReader: rangeReaderFunc}
|
|
return &resultRangeReadCloser, nil
|
|
}
|
|
|
|
func RequestRangedHttp(ctx context.Context, link *model.Link, offset, length int64) (*http.Response, error) {
|
|
header := net.ProcessHeader(http.Header{}, link.Header)
|
|
header = http_range.ApplyRangeToHttpHeader(http_range.Range{Start: offset, Length: length}, header)
|
|
|
|
return net.RequestHttp(ctx, "GET", header, link.URL)
|
|
}
|
|
|
|
// 139 cloud does not properly return 206 http status code, add a hack here
|
|
func checkContentRange(header *http.Header, offset int64) bool {
|
|
start, _, err := http_range.ParseContentRange(header.Get("Content-Range"))
|
|
if err != nil {
|
|
log.Warnf("exception trying to parse Content-Range, will ignore,err=%s", err)
|
|
}
|
|
if start == offset {
|
|
return true
|
|
}
|
|
return false
|
|
}
|