From 630cf30af5544359a7ccb98ff6c844c643049df0 Mon Sep 17 00:00:00 2001 From: Andy Hsu Date: Sun, 11 May 2025 13:39:32 +0800 Subject: [PATCH] feat(115_open): implement rate limiting for API requests --- drivers/115_open/driver.go | 39 ++++++++++++++++++++++++++++++++++++-- drivers/115_open/meta.go | 7 ++++--- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/drivers/115_open/driver.go b/drivers/115_open/driver.go index 3826c78f..6121d3b2 100644 --- a/drivers/115_open/driver.go +++ b/drivers/115_open/driver.go @@ -16,12 +16,14 @@ import ( "github.com/alist-org/alist/v3/internal/op" "github.com/alist-org/alist/v3/pkg/utils" sdk "github.com/xhofe/115-sdk-go" + "golang.org/x/time/rate" ) type Open115 struct { model.Storage Addition - client *sdk.Client + client *sdk.Client + limiter *rate.Limiter } func (d *Open115) Config() driver.Config { @@ -47,6 +49,16 @@ func (d *Open115) Init(ctx context.Context) error { if err != nil { return err } + if d.Addition.LimitRate > 0 { + d.limiter = rate.NewLimiter(rate.Limit(d.Addition.LimitRate), 1) + } + return nil +} + +func (d *Open115) WaitLimit(ctx context.Context) error { + if d.limiter != nil { + return d.limiter.Wait(ctx) + } return nil } @@ -59,6 +71,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs) pageSize := int64(200) offset := int64(0) for { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } resp, err := d.client.GetFiles(ctx, &sdk.GetFilesReq{ CID: dir.GetID(), Limit: pageSize, @@ -84,6 +99,9 @@ func (d *Open115) List(ctx context.Context, dir model.Obj, args model.ListArgs) } func (d *Open115) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } var ua string if args.Header != nil { ua = args.Header.Get("User-Agent") @@ -113,11 +131,13 @@ func (d *Open115) Link(ctx context.Context, file model.Obj, args model.LinkArgs) } func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } resp, err := d.client.Mkdir(ctx, parentDir.GetID(), dirName) if err != nil { return nil, err } - time.Sleep(800 * time.Millisecond) return &Obj{ Fid: resp.FileID, Pid: parentDir.GetID(), @@ -130,6 +150,9 @@ func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName stri } func (d *Open115) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } _, err := d.client.Move(ctx, &sdk.MoveReq{ FileIDs: srcObj.GetID(), ToCid: dstDir.GetID(), @@ -141,6 +164,9 @@ func (d *Open115) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj } func (d *Open115) Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error) { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } _, err := d.client.UpdateFile(ctx, &sdk.UpdateFileReq{ FileID: srcObj.GetID(), FileNma: newName, @@ -156,6 +182,9 @@ func (d *Open115) Rename(ctx context.Context, srcObj model.Obj, newName string) } func (d *Open115) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } _, err := d.client.Copy(ctx, &sdk.CopyReq{ PID: dstDir.GetID(), FileID: srcObj.GetID(), @@ -168,6 +197,9 @@ func (d *Open115) Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj } func (d *Open115) Remove(ctx context.Context, obj model.Obj) error { + if err := d.WaitLimit(ctx); err != nil { + return err + } _obj, ok := obj.(*Obj) if !ok { return fmt.Errorf("can't convert obj") @@ -183,6 +215,9 @@ func (d *Open115) Remove(ctx context.Context, obj model.Obj) error { } func (d *Open115) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) error { + if err := d.WaitLimit(ctx); err != nil { + return err + } tempF, err := file.CacheFullInTempFile() if err != nil { return err diff --git a/drivers/115_open/meta.go b/drivers/115_open/meta.go index 7e26e0dd..66b956c0 100644 --- a/drivers/115_open/meta.go +++ b/drivers/115_open/meta.go @@ -9,9 +9,10 @@ type Addition struct { // Usually one of two driver.RootID // define other - RefreshToken string `json:"refresh_token" required:"true"` - OrderBy string `json:"order_by" type:"select" options:"file_name,file_size,user_utime,file_type"` - OrderDirection string `json:"order_direction" type:"select" options:"asc,desc"` + RefreshToken string `json:"refresh_token" required:"true"` + OrderBy string `json:"order_by" type:"select" options:"file_name,file_size,user_utime,file_type"` + OrderDirection string `json:"order_direction" type:"select" options:"asc,desc"` + LimitRate float64 `json:"limit_rate" type:"float" default:"1" help:"limit all api request rate ([limit]r/1s)"` AccessToken string }