From 857e5f7e41e16c2df3a312cef5891fd3d8f24ff3 Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sat, 10 Jan 2026 20:15:21 +0800 Subject: [PATCH 1/8] feat(webdav): add support for 302 redirects in WebDav driver Signed-off-by: MadDogOwner --- drivers/webdav/driver.go | 21 +++++++++++++++++++++ drivers/webdav/meta.go | 1 + 2 files changed, 22 insertions(+) diff --git a/drivers/webdav/driver.go b/drivers/webdav/driver.go index a6732e9a2..1dc861ee7 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" @@ -30,6 +32,10 @@ func (d *WebDav) GetAddition() driver.Additional { } func (d *WebDav) Init(ctx context.Context) error { + if d.Addition.Enable302 { + config.OnlyProxy = false + d.WebProxy = false + } err := d.setClient() if err == nil { d.cron = cron.NewCron(time.Hour * 12) @@ -68,6 +74,21 @@ func (d *WebDav) Link(ctx context.Context, file model.Obj, args model.LinkArgs) if err != nil { return nil, err } + if d.Addition.Enable302 { + // get the url after redirect + req := base.NoRedirectClient.R() + + req.Header = header + res, err := req.Get(url) + if err != nil { + return nil, err + } + 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, msg: %s", res.StatusCode(), res.Body()) + } + } return &model.Link{ URL: url, Header: header, diff --git a/drivers/webdav/meta.go b/drivers/webdav/meta.go index 5f8197cf6..754484a49 100644 --- a/drivers/webdav/meta.go +++ b/drivers/webdav/meta.go @@ -12,6 +12,7 @@ type Addition struct { Password string `json:"password" required:"true"` driver.RootPath TlsInsecureSkipVerify bool `json:"tls_insecure_skip_verify" default:"false"` + Enable302 bool `json:"enable_302" default:"false" help:"Return redirected URL instead of proxying"` } var config = driver.Config{ From d54d10ba691ffe0d05b6200a2f94f72754879a6c Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sat, 10 Jan 2026 20:31:38 +0800 Subject: [PATCH 2/8] do not show body when enable 302 Signed-off-by: MadDogOwner --- drivers/webdav/driver.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/webdav/driver.go b/drivers/webdav/driver.go index 1dc861ee7..6404d8c50 100644 --- a/drivers/webdav/driver.go +++ b/drivers/webdav/driver.go @@ -77,7 +77,6 @@ func (d *WebDav) Link(ctx context.Context, file model.Obj, args model.LinkArgs) if d.Addition.Enable302 { // get the url after redirect req := base.NoRedirectClient.R() - req.Header = header res, err := req.Get(url) if err != nil { @@ -86,7 +85,7 @@ func (d *WebDav) Link(ctx context.Context, file model.Obj, args model.LinkArgs) 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, msg: %s", res.StatusCode(), res.Body()) + return nil, fmt.Errorf("redirect failed, status: %d", res.StatusCode()) } } return &model.Link{ From c88f650f2820369b7f02450720c236d8de369e93 Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sat, 10 Jan 2026 20:37:53 +0800 Subject: [PATCH 3/8] check args.Redirect Signed-off-by: MadDogOwner --- drivers/webdav/driver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/webdav/driver.go b/drivers/webdav/driver.go index 6404d8c50..4c7ab53e0 100644 --- a/drivers/webdav/driver.go +++ b/drivers/webdav/driver.go @@ -74,7 +74,7 @@ func (d *WebDav) Link(ctx context.Context, file model.Obj, args model.LinkArgs) if err != nil { return nil, err } - if d.Addition.Enable302 { + if d.Addition.Enable302 && args.Redirect { // get the url after redirect req := base.NoRedirectClient.R() req.Header = header From 104ed812c10704d08a2d80cd33139e2f6b6a58ad Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sat, 10 Jan 2026 20:53:06 +0800 Subject: [PATCH 4/8] do not parse body Signed-off-by: MadDogOwner --- drivers/webdav/driver.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/webdav/driver.go b/drivers/webdav/driver.go index 4c7ab53e0..e41ae47c6 100644 --- a/drivers/webdav/driver.go +++ b/drivers/webdav/driver.go @@ -78,10 +78,12 @@ func (d *WebDav) Link(ctx context.Context, file model.Obj, args model.LinkArgs) // 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 { From cfeb5d2598ee4b251129827d5e0a46fc0e7ca753 Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sat, 10 Jan 2026 21:34:19 +0800 Subject: [PATCH 5/8] remove OnlyProxy Signed-off-by: MadDogOwner --- drivers/webdav/driver.go | 6 +----- drivers/webdav/meta.go | 2 -- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/drivers/webdav/driver.go b/drivers/webdav/driver.go index e41ae47c6..7a1b5db2c 100644 --- a/drivers/webdav/driver.go +++ b/drivers/webdav/driver.go @@ -32,10 +32,6 @@ func (d *WebDav) GetAddition() driver.Additional { } func (d *WebDav) Init(ctx context.Context) error { - if d.Addition.Enable302 { - config.OnlyProxy = false - d.WebProxy = false - } err := d.setClient() if err == nil { d.cron = cron.NewCron(time.Hour * 12) @@ -74,7 +70,7 @@ func (d *WebDav) Link(ctx context.Context, file model.Obj, args model.LinkArgs) if err != nil { return nil, err } - if d.Addition.Enable302 && args.Redirect { + if args.Redirect { // get the url after redirect req := base.NoRedirectClient.R() req.Header = header diff --git a/drivers/webdav/meta.go b/drivers/webdav/meta.go index 754484a49..0eba285db 100644 --- a/drivers/webdav/meta.go +++ b/drivers/webdav/meta.go @@ -12,13 +12,11 @@ type Addition struct { Password string `json:"password" required:"true"` driver.RootPath TlsInsecureSkipVerify bool `json:"tls_insecure_skip_verify" default:"false"` - Enable302 bool `json:"enable_302" default:"false" help:"Return redirected URL instead of proxying"` } var config = driver.Config{ Name: "WebDav", LocalSort: true, - OnlyProxy: true, DefaultRoot: "/", } From 8a1ffa50c2315efaf19e4bf59fa93ee21cb8e10b Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sat, 10 Jan 2026 22:11:48 +0800 Subject: [PATCH 6/8] implement driver.Config PreferProxy Signed-off-by: MadDogOwner --- drivers/123/meta.go | 3 ++- drivers/123_open/meta.go | 1 + drivers/123_share/meta.go | 1 + drivers/baidu_netdisk/meta.go | 4 +++- drivers/webdav/meta.go | 1 + internal/driver/config.go | 6 ++++++ internal/op/driver.go | 37 ++++++++++++++++++++++++----------- 7 files changed, 40 insertions(+), 13 deletions(-) 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/meta.go b/drivers/webdav/meta.go index 0eba285db..6e7c27772 100644 --- a/drivers/webdav/meta.go +++ b/drivers/webdav/meta.go @@ -18,6 +18,7 @@ var config = driver.Config{ Name: "WebDav", LocalSort: true, DefaultRoot: "/", + PreferProxy: true, } func init() { 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", From 4ee18fb58881eb42d3cdbdbb504a7388649d50a0 Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sat, 10 Jan 2026 22:18:40 +0800 Subject: [PATCH 7/8] add patch for enabling proxy Signed-off-by: MadDogOwner --- internal/bootstrap/patch/all.go | 7 ++++++ internal/bootstrap/patch/v4_1_9/alias.go | 30 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 internal/bootstrap/patch/v4_1_9/alias.go 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/alias.go b/internal/bootstrap/patch/v4_1_9/alias.go new file mode 100644 index 000000000..2fd97c783 --- /dev/null +++ b/internal/bootstrap/patch/v4_1_9/alias.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()) + } + } +} From fe06b9a8d41630a9df7c14db9666cf8368e513f4 Mon Sep 17 00:00:00 2001 From: MadDogOwner Date: Sun, 11 Jan 2026 11:12:23 +0800 Subject: [PATCH 8/8] rename patch Signed-off-by: MadDogOwner --- internal/bootstrap/patch/v4_1_9/{alias.go => webdav.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename internal/bootstrap/patch/v4_1_9/{alias.go => webdav.go} (100%) diff --git a/internal/bootstrap/patch/v4_1_9/alias.go b/internal/bootstrap/patch/v4_1_9/webdav.go similarity index 100% rename from internal/bootstrap/patch/v4_1_9/alias.go rename to internal/bootstrap/patch/v4_1_9/webdav.go