mirror of https://github.com/cloudreve/Cloudreve
Feat: cache for OneDrive META request
parent
96983ddc70
commit
0eb04ed0ea
|
@ -102,6 +102,7 @@ func addDefaultSettings() {
|
||||||
{Name: "onedrive_callback_check", Value: `20`, Type: "timeout"},
|
{Name: "onedrive_callback_check", Value: `20`, Type: "timeout"},
|
||||||
{Name: "aria2_call_timeout", Value: `5`, Type: "timeout"},
|
{Name: "aria2_call_timeout", Value: `5`, Type: "timeout"},
|
||||||
{Name: "onedrive_chunk_retries", Value: `1`, Type: "retry"},
|
{Name: "onedrive_chunk_retries", Value: `1`, Type: "retry"},
|
||||||
|
{Name: "onedrive_source_timeout", Value: `1800`, Type: "timeout"},
|
||||||
{Name: "reset_after_upload_failed", Value: `0`, Type: "upload"},
|
{Name: "reset_after_upload_failed", Value: `0`, Type: "upload"},
|
||||||
{Name: "login_captcha", Value: `0`, Type: "login"},
|
{Name: "login_captcha", Value: `0`, Type: "login"},
|
||||||
{Name: "reg_captcha", Value: `0`, Type: "login"},
|
{Name: "reg_captcha", Value: `0`, Type: "login"},
|
||||||
|
|
|
@ -4,7 +4,7 @@ package conf
|
||||||
var BackendVersion = "3.0.0-beta1"
|
var BackendVersion = "3.0.0-beta1"
|
||||||
|
|
||||||
// RequiredDBVersion 与当前版本匹配的数据库版本
|
// RequiredDBVersion 与当前版本匹配的数据库版本
|
||||||
var RequiredDBVersion = "3.0.0-alpha1"
|
var RequiredDBVersion = "3.0.0-rc1"
|
||||||
|
|
||||||
// IsPro 是否为Pro版本
|
// IsPro 是否为Pro版本
|
||||||
var IsPro = "false"
|
var IsPro = "false"
|
||||||
|
|
|
@ -506,7 +506,7 @@ func TestClient_Upload(t *testing.T) {
|
||||||
asserts.Error(err)
|
asserts.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 大文件 分两个分片 成功
|
// 大文件 分两个分片 ,reader 返回EOF
|
||||||
{
|
{
|
||||||
client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix()
|
client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix()
|
||||||
clientMock := ClientMock{}
|
clientMock := ClientMock{}
|
||||||
|
@ -523,24 +523,11 @@ func TestClient_Upload(t *testing.T) {
|
||||||
Body: ioutil.NopCloser(strings.NewReader(`{"uploadUrl":"123321"}`)),
|
Body: ioutil.NopCloser(strings.NewReader(`{"uploadUrl":"123321"}`)),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
clientMock.On(
|
|
||||||
"Request",
|
|
||||||
"PUT",
|
|
||||||
"123321",
|
|
||||||
testMock.Anything,
|
|
||||||
testMock.Anything,
|
|
||||||
).Return(&request.Response{
|
|
||||||
Err: nil,
|
|
||||||
Response: &http.Response{
|
|
||||||
StatusCode: 200,
|
|
||||||
Body: ioutil.NopCloser(strings.NewReader(`{"uploadUrl":"http://dev.com/2"}`)),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
client.Request = clientMock
|
client.Request = clientMock
|
||||||
|
|
||||||
err := client.Upload(context.Background(), "123.jpg", 15*1024*1024, strings.NewReader("123"))
|
err := client.Upload(context.Background(), "123.jpg", 15*1024*1024, strings.NewReader("123"))
|
||||||
clientMock.AssertExpectations(t)
|
clientMock.AssertExpectations(t)
|
||||||
asserts.NoError(err)
|
asserts.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 大文件 分两个分片 失败
|
// 大文件 分两个分片 失败
|
||||||
|
@ -561,19 +548,6 @@ func TestClient_Upload(t *testing.T) {
|
||||||
Body: ioutil.NopCloser(strings.NewReader(`{"uploadUrl":"123321"}`)),
|
Body: ioutil.NopCloser(strings.NewReader(`{"uploadUrl":"123321"}`)),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
clientMock.On(
|
|
||||||
"Request",
|
|
||||||
"PUT",
|
|
||||||
"123321",
|
|
||||||
testMock.Anything,
|
|
||||||
testMock.Anything,
|
|
||||||
).Return(&request.Response{
|
|
||||||
Err: nil,
|
|
||||||
Response: &http.Response{
|
|
||||||
StatusCode: 400,
|
|
||||||
Body: ioutil.NopCloser(strings.NewReader(`{"uploadUrl":"http://dev.com/2"}`)),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
client.Request = clientMock
|
client.Request = clientMock
|
||||||
|
|
||||||
err := client.Upload(context.Background(), "123.jpg", 15*1024*1024, strings.NewReader("123"))
|
err := client.Upload(context.Background(), "123.jpg", 15*1024*1024, strings.NewReader("123"))
|
||||||
|
|
|
@ -129,6 +129,7 @@ func TestDriver_Source(t *testing.T) {
|
||||||
}
|
}
|
||||||
handler.Client, _ = NewClient(&model.Policy{})
|
handler.Client, _ = NewClient(&model.Policy{})
|
||||||
handler.Client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix()
|
handler.Client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix()
|
||||||
|
cache.Set("setting_onedrive_source_timeout", "1800", 0)
|
||||||
|
|
||||||
// 失败
|
// 失败
|
||||||
{
|
{
|
||||||
|
@ -137,6 +138,17 @@ func TestDriver_Source(t *testing.T) {
|
||||||
asserts.Empty(res)
|
asserts.Empty(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 命中缓存 成功
|
||||||
|
{
|
||||||
|
handler.Client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix()
|
||||||
|
handler.Client.Credential.AccessToken = "1"
|
||||||
|
cache.Set("onedrive_source_0_123.jpg", "res", 0)
|
||||||
|
res, err := handler.Source(context.Background(), "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()
|
handler.Client.Credential.ExpiresIn = time.Now().Add(time.Duration(100) * time.Hour).Unix()
|
||||||
|
|
|
@ -3,7 +3,9 @@ package onedrive
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
model "github.com/HFO4/cloudreve/models"
|
model "github.com/HFO4/cloudreve/models"
|
||||||
|
"github.com/HFO4/cloudreve/pkg/cache"
|
||||||
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
|
"github.com/HFO4/cloudreve/pkg/filesystem/fsctx"
|
||||||
"github.com/HFO4/cloudreve/pkg/filesystem/response"
|
"github.com/HFO4/cloudreve/pkg/filesystem/response"
|
||||||
"github.com/HFO4/cloudreve/pkg/request"
|
"github.com/HFO4/cloudreve/pkg/request"
|
||||||
|
@ -101,8 +103,20 @@ func (handler Driver) Source(
|
||||||
isDownload bool,
|
isDownload bool,
|
||||||
speed int,
|
speed int,
|
||||||
) (string, error) {
|
) (string, error) {
|
||||||
|
// 尝试从缓存中查找
|
||||||
|
if cachedURL, ok := cache.Get(fmt.Sprintf("onedrive_source_%d_%s", handler.Policy.ID, path)); ok {
|
||||||
|
return cachedURL.(string), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 缓存不存在,重新获取
|
||||||
res, err := handler.Client.Meta(ctx, "", path)
|
res, err := handler.Client.Meta(ctx, "", path)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
// 写入新的缓存
|
||||||
|
cache.Set(
|
||||||
|
fmt.Sprintf("onedrive_source_%d_%s", handler.Policy.ID, path),
|
||||||
|
res.DownloadURL,
|
||||||
|
model.GetIntSetting("onedrive_source_timeout", 1800),
|
||||||
|
)
|
||||||
return res.DownloadURL, nil
|
return res.DownloadURL, nil
|
||||||
}
|
}
|
||||||
return "", err
|
return "", err
|
||||||
|
|
Loading…
Reference in New Issue