From bd2bdf253bfa93db6d7d1023df9bcd16faf4cd90 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Tue, 8 Dec 2020 17:30:22 +0800 Subject: [PATCH] Feat: using custom reverse proxying in OneDrive file downloading --- models/policy.go | 4 +++- pkg/filesystem/driver/onedrive/handler.go | 25 +++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/models/policy.go b/models/policy.go index 34d6a2b..52f9668 100644 --- a/models/policy.go +++ b/models/policy.go @@ -47,8 +47,10 @@ type PolicyOption struct { FileType []string `json:"file_type"` // MimeType MimeType string `json:"mimetype"` - // OdRedirect Onedrive重定向地址 + // OdRedirect Onedrive 重定向地址 OdRedirect string `json:"od_redirect,omitempty"` + // OdProxy Onedrive 反代地址 + OdProxy string `json:"od_proxy,omitempty"` // Region 区域代码 Region string `json:"region,omitempty"` // ServerSideEndpoint 服务端请求使用的 Endpoint,为空时使用 Policy.Server 字段 diff --git a/pkg/filesystem/driver/onedrive/handler.go b/pkg/filesystem/driver/onedrive/handler.go index 8afe66a..2bedb16 100644 --- a/pkg/filesystem/driver/onedrive/handler.go +++ b/pkg/filesystem/driver/onedrive/handler.go @@ -154,7 +154,7 @@ func (handler Driver) Source( ) (string, error) { // 尝试从缓存中查找 if cachedURL, ok := cache.Get(fmt.Sprintf("onedrive_source_%d_%s", handler.Policy.ID, path)); ok { - return cachedURL.(string), nil + return handler.replaceSourceHost(cachedURL.(string)) } // 缓存不存在,重新获取 @@ -166,11 +166,32 @@ func (handler Driver) Source( res.DownloadURL, model.GetIntSetting("onedrive_source_timeout", 1800), ) - return res.DownloadURL, nil + return handler.replaceSourceHost(res.DownloadURL) } return "", err } +func (handler Driver) replaceSourceHost(origin string) (string, error) { + if handler.Policy.OptionsSerialized.OdProxy != "" { + source, err := url.Parse(origin) + if err != nil { + return "", err + } + + cdn, err := url.Parse(handler.Policy.OptionsSerialized.OdProxy) + if err != nil { + return "", err + } + + // 替换反代地址 + source.Scheme = cdn.Scheme + source.Host = cdn.Host + return source.String(), nil + } + + return origin, nil +} + // Token 获取上传会话URL func (handler Driver) Token(ctx context.Context, TTL int64, key string) (serializer.UploadCredential, error) {