diff --git a/drivers/123/meta.go b/drivers/123/meta.go index 5d37a15bc..5b19ae82e 100644 --- a/drivers/123/meta.go +++ b/drivers/123/meta.go @@ -20,6 +20,7 @@ var config = driver.Config{ Name: "123Pan", DefaultRoot: "0", LocalSort: true, + PreferProxy: true, } func init() { @@ -28,7 +29,7 @@ func init() { return &Pan123{ Addition: Addition{ UploadThread: 3, - Platform: "web", + Platform: "web", }, } }) diff --git a/drivers/123_open/meta.go b/drivers/123_open/meta.go index 67f56d8ea..5481ef356 100644 --- a/drivers/123_open/meta.go +++ b/drivers/123_open/meta.go @@ -35,6 +35,7 @@ var config = driver.Config{ Name: "123 Open", DefaultRoot: "0", LocalSort: true, + PreferProxy: true, } func init() { diff --git a/drivers/123_share/meta.go b/drivers/123_share/meta.go index 12c620d7a..e40965fe9 100644 --- a/drivers/123_share/meta.go +++ b/drivers/123_share/meta.go @@ -19,6 +19,7 @@ var config = driver.Config{ LocalSort: true, NoUpload: true, DefaultRoot: "0", + PreferProxy: true, } func init() { diff --git a/drivers/baidu_netdisk/meta.go b/drivers/baidu_netdisk/meta.go index f75f1c774..3f3bed022 100644 --- a/drivers/baidu_netdisk/meta.go +++ b/drivers/baidu_netdisk/meta.go @@ -1,9 +1,10 @@ package baidu_netdisk import ( + "time" + "github.com/OpenListTeam/OpenList/v4/internal/driver" "github.com/OpenListTeam/OpenList/v4/internal/op" - "time" ) type Addition struct { @@ -39,6 +40,7 @@ const ( var config = driver.Config{ Name: "BaiduNetdisk", DefaultRoot: "/", + PreferProxy: true, } func init() { diff --git a/drivers/webdav/driver.go b/drivers/webdav/driver.go index a6732e9a2..7a1b5db2c 100644 --- a/drivers/webdav/driver.go +++ b/drivers/webdav/driver.go @@ -2,11 +2,13 @@ package webdav import ( "context" + "fmt" "net/http" "os" "path" "time" + "github.com/OpenListTeam/OpenList/v4/drivers/base" "github.com/OpenListTeam/OpenList/v4/internal/driver" "github.com/OpenListTeam/OpenList/v4/internal/model" "github.com/OpenListTeam/OpenList/v4/pkg/cron" @@ -68,6 +70,22 @@ func (d *WebDav) Link(ctx context.Context, file model.Obj, args model.LinkArgs) if err != nil { return nil, err } + if args.Redirect { + // get the url after redirect + req := base.NoRedirectClient.R() + req.Header = header + req.SetDoNotParseResponse(true) + res, err := req.Get(url) + if err != nil { + return nil, err + } + _ = res.RawResponse.Body.Close() + if (res.StatusCode() == 302 || res.StatusCode() == 307 || res.StatusCode() == 308) && res.Header().Get("location") != "" { + url = res.Header().Get("location") + } else { + return nil, fmt.Errorf("redirect failed, status: %d", res.StatusCode()) + } + } return &model.Link{ URL: url, Header: header, diff --git a/drivers/webdav/meta.go b/drivers/webdav/meta.go index 5f8197cf6..6e7c27772 100644 --- a/drivers/webdav/meta.go +++ b/drivers/webdav/meta.go @@ -17,8 +17,8 @@ type Addition struct { var config = driver.Config{ Name: "WebDav", LocalSort: true, - OnlyProxy: true, DefaultRoot: "/", + PreferProxy: true, } func init() { diff --git a/internal/bootstrap/patch/all.go b/internal/bootstrap/patch/all.go index d5b94cb4b..c4a72a966 100644 --- a/internal/bootstrap/patch/all.go +++ b/internal/bootstrap/patch/all.go @@ -5,6 +5,7 @@ import ( "github.com/OpenListTeam/OpenList/v4/internal/bootstrap/patch/v3_32_0" "github.com/OpenListTeam/OpenList/v4/internal/bootstrap/patch/v3_41_0" "github.com/OpenListTeam/OpenList/v4/internal/bootstrap/patch/v4_1_8" + "github.com/OpenListTeam/OpenList/v4/internal/bootstrap/patch/v4_1_9" ) type VersionPatches struct { @@ -39,4 +40,10 @@ var UpgradePatches = []VersionPatches{ v4_1_8.FixAliasConfig, }, }, + { + Version: "v4.1.9", + Patches: []func(){ + v4_1_9.EnableWebDavProxy, + }, + }, } diff --git a/internal/bootstrap/patch/v4_1_9/webdav.go b/internal/bootstrap/patch/v4_1_9/webdav.go new file mode 100644 index 000000000..2fd97c783 --- /dev/null +++ b/internal/bootstrap/patch/v4_1_9/webdav.go @@ -0,0 +1,30 @@ +package v4_1_9 + +import ( + "github.com/OpenListTeam/OpenList/v4/internal/db" + "github.com/OpenListTeam/OpenList/v4/pkg/utils" +) + +// EnableWebDavProxy updates Webdav driver storages to enable proxy +func EnableWebDavProxy() { + storages, _, err := db.GetStorages(1, -1) + if err != nil { + utils.Log.Errorf("[EnableWebDavProxy] failed to get storages: %s", err.Error()) + return + } + for _, s := range storages { + if s.Driver != "WebDav" { + continue + } + if !s.WebProxy { + s.WebProxy = true + } + if s.WebdavPolicy == "302_redirect" { + s.WebdavPolicy = "native_proxy" + } + err = db.UpdateStorage(&s) + if err != nil { + utils.Log.Errorf("[EnableWebDavProxy] failed to update storage [%d]%s: %s", s.ID, s.MountPath, err.Error()) + } + } +} diff --git a/internal/driver/config.go b/internal/driver/config.go index 07bedd20c..2063975ba 100644 --- a/internal/driver/config.go +++ b/internal/driver/config.go @@ -24,6 +24,8 @@ type Config struct { LinkCacheMode `json:"-"` // if the driver only store indices of files (e.g. UrlTree) OnlyIndices bool `json:"only_indices"` + // prefer proxy download even if direct link is available + PreferProxy bool `json:"prefer_proxy"` } type LinkCacheMode int8 @@ -40,3 +42,7 @@ const ( func (c Config) MustProxy() bool { return c.OnlyProxy || c.NoLinkURL } + +func (c Config) DefaultProxy() bool { + return c.PreferProxy +} diff --git a/internal/op/driver.go b/internal/op/driver.go index 6c4e7d265..5b79b0aed 100644 --- a/internal/op/driver.go +++ b/internal/op/driver.go @@ -97,17 +97,32 @@ func getMainItems(config driver.Config) []driver.Item { Required: true, }) } else { - items = append(items, []driver.Item{{ - Name: "web_proxy", - Type: conf.TypeBool, - }, { - Name: "webdav_policy", - Type: conf.TypeSelect, - Options: "302_redirect,use_proxy_url,native_proxy", - Default: "302_redirect", - Required: true, - }, - }...) + if config.DefaultProxy() { + items = append(items, []driver.Item{{ + Name: "web_proxy", + Type: conf.TypeBool, + Default: "true", + }, { + Name: "webdav_policy", + Type: conf.TypeSelect, + Options: "302_redirect,use_proxy_url,native_proxy", + Default: "native_proxy", + Required: true, + }, + }...) + } else { + items = append(items, []driver.Item{{ + Name: "web_proxy", + Type: conf.TypeBool, + }, { + Name: "webdav_policy", + Type: conf.TypeSelect, + Options: "302_redirect,use_proxy_url,native_proxy", + Default: "302_redirect", + Required: true, + }, + }...) + } if config.ProxyRangeOption { item := driver.Item{ Name: "proxy_range",