feat(webdav): support range get

This commit is contained in:
Xhofe
2022-04-23 22:43:02 +08:00
parent 293d574ce7
commit 27b7dae113
26 changed files with 2268 additions and 22 deletions

View File

@ -6,6 +6,7 @@ import (
"github.com/Xhofe/alist/drivers/webdav/odrvcookie"
"github.com/Xhofe/alist/model"
"github.com/Xhofe/alist/utils"
"net/http"
"path/filepath"
)
@ -132,11 +133,27 @@ func (driver WebDav) Files(path string, account *model.Account) ([]model.File, e
func (driver WebDav) Link(args base.Args, account *model.Account) (*base.Link, error) {
path := args.Path
c := driver.NewClient(account)
reader, err := c.ReadStream(driver.WebDavPath(path))
callback := func(r *http.Request) {
if args.Header.Get("Range") != "" {
r.Header.Set("Range", args.Header.Get("Range"))
}
if args.Header.Get("If-Range") != "" {
r.Header.Set("If-Range", args.Header.Get("If-Range"))
}
}
reader, header, err := c.ReadStream(driver.WebDavPath(path), callback)
if err != nil {
return nil, err
}
return &base.Link{Data: reader}, nil
link := &base.Link{Data: reader}
if header.Get("Content-Range") != "" {
link.Status = 206
link.Header = http.Header{
"Content-Range": header.Values("Content-Range"),
"Content-Length": header.Values("Content-Length"),
}
}
return link, nil
}
func (driver WebDav) Path(path string, account *model.Account) (*model.File, []model.File, error) {

View File

@ -4,9 +4,8 @@ import (
"github.com/Xhofe/alist/drivers/base"
"github.com/Xhofe/alist/drivers/webdav/odrvcookie"
"github.com/Xhofe/alist/model"
"github.com/Xhofe/alist/pkg/gowebdav"
"github.com/Xhofe/alist/utils"
log "github.com/sirupsen/logrus"
"github.com/studio-b12/gowebdav"
"net/http"
"strings"
)
@ -15,13 +14,10 @@ func (driver WebDav) NewClient(account *model.Account) *gowebdav.Client {
c := gowebdav.NewClient(account.SiteUrl, account.Username, account.Password)
if isSharePoint(account) {
cookie, err := odrvcookie.GetCookie(account.Username, account.Password, account.SiteUrl)
log.Debugln(cookie, err)
if err == nil {
log.Debugln("set interceptor")
c.SetInterceptor(func(method string, rq *http.Request) {
rq.Header.Del("Authorization")
rq.Header.Set("Cookie", cookie)
log.Debugf("sp webdav req: %+v", rq)
})
}
}