From a93b964d8befce9176a7a9dde21b524599aafcd9 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Wed, 3 Mar 2021 17:07:26 +0800 Subject: [PATCH] Modify: OneDrive file URL cache will refreshed after file is updated --- pkg/filesystem/driver/onedrive/handler.go | 9 +++++++-- pkg/filesystem/driver/onedrive/handler_test.go | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pkg/filesystem/driver/onedrive/handler.go b/pkg/filesystem/driver/onedrive/handler.go index 2bedb16..c1e8717 100644 --- a/pkg/filesystem/driver/onedrive/handler.go +++ b/pkg/filesystem/driver/onedrive/handler.go @@ -152,8 +152,13 @@ func (handler Driver) Source( isDownload bool, speed int, ) (string, error) { + cacheKey := fmt.Sprintf("onedrive_source_%d_%s", handler.Policy.ID, path) + if file, ok := ctx.Value(fsctx.FileModelCtx).(model.File); ok { + cacheKey = fmt.Sprintf("onedrive_source_file_%d_%d", file.UpdatedAt.Unix(), file.ID) + } + // 尝试从缓存中查找 - if cachedURL, ok := cache.Get(fmt.Sprintf("onedrive_source_%d_%s", handler.Policy.ID, path)); ok { + if cachedURL, ok := cache.Get(cacheKey); ok { return handler.replaceSourceHost(cachedURL.(string)) } @@ -162,7 +167,7 @@ func (handler Driver) Source( if err == nil { // 写入新的缓存 cache.Set( - fmt.Sprintf("onedrive_source_%d_%s", handler.Policy.ID, path), + cacheKey, res.DownloadURL, model.GetIntSetting("onedrive_source_timeout", 1800), ) diff --git a/pkg/filesystem/driver/onedrive/handler_test.go b/pkg/filesystem/driver/onedrive/handler_test.go index a4a5be1..4f0bb97 100644 --- a/pkg/filesystem/driver/onedrive/handler_test.go +++ b/pkg/filesystem/driver/onedrive/handler_test.go @@ -2,6 +2,7 @@ package onedrive import ( "context" + "fmt" "io" "io/ioutil" "net/http" @@ -150,6 +151,21 @@ func TestDriver_Source(t *testing.T) { asserts.Equal("res", res) } + // 命中缓存 上下文存在文件 成功 + { + file := model.File{} + file.ID = 1 + file.UpdatedAt = time.Now() + ctx := context.WithValue(context.Background(), fsctx.FileModelCtx, file) + handler.Client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix() + handler.Client.Credential.AccessToken = "1" + cache.Set(fmt.Sprintf("onedrive_source_file_%d_1", file.UpdatedAt.Unix()), "res", 0) + res, err := handler.Source(ctx, "123.jpg", url.URL{}, 0, true, 0) + cache.Deletes([]string{"0_123.jpg"}, "onedrive_source_") + asserts.NoError(err) + asserts.Equal("res", res) + } + // 成功 { handler.Client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix()