From e91c42c9dc11990c11b24f07d82dafca16e48522 Mon Sep 17 00:00:00 2001 From: Andy Hsu Date: Sun, 17 Dec 2023 15:45:27 +0800 Subject: [PATCH] fix(alist_v3): timeout on upload (close #5465) --- drivers/alist_v3/driver.go | 5 +++-- drivers/alist_v3/util.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/drivers/alist_v3/driver.go b/drivers/alist_v3/driver.go index e2deabac..f46e68d0 100644 --- a/drivers/alist_v3/driver.go +++ b/drivers/alist_v3/driver.go @@ -8,6 +8,7 @@ import ( "path" "strconv" "strings" + "time" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/conf" @@ -174,13 +175,13 @@ func (d *AListV3) Remove(ctx context.Context, obj model.Obj) error { } func (d *AListV3) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error { - _, err := d.request("/fs/put", http.MethodPut, func(req *resty.Request) { + _, err := d.requestWithTimeout("/fs/put", http.MethodPut, func(req *resty.Request) { req.SetHeader("File-Path", path.Join(dstDir.GetPath(), stream.GetName())). SetHeader("Password", d.MetaPassword). SetHeader("Content-Length", strconv.FormatInt(stream.GetSize(), 10)). SetContentLength(true). SetBody(io.ReadCloser(stream)) - }) + }, time.Hour*6) return err } diff --git a/drivers/alist_v3/util.go b/drivers/alist_v3/util.go index bf47c612..978f3ac0 100644 --- a/drivers/alist_v3/util.go +++ b/drivers/alist_v3/util.go @@ -3,6 +3,7 @@ package alist_v3 import ( "fmt" "net/http" + "time" "github.com/alist-org/alist/v3/drivers/base" "github.com/alist-org/alist/v3/internal/op" @@ -56,3 +57,33 @@ func (d *AListV3) request(api, method string, callback base.ReqCallback, retry . } return res.Body(), nil } + +func (d *AListV3) requestWithTimeout(api, method string, callback base.ReqCallback, timeout time.Duration, retry ...bool) ([]byte, error) { + url := d.Address + "/api" + api + client := base.NewRestyClient().SetTimeout(timeout) + req := client.R() + req.SetHeader("Authorization", d.Token) + if callback != nil { + callback(req) + } + res, err := req.Execute(method, url) + if err != nil { + return nil, err + } + log.Debugf("[alist_v3] response body: %s", res.String()) + if res.StatusCode() >= 400 { + return nil, fmt.Errorf("request failed, status: %s", res.Status()) + } + code := utils.Json.Get(res.Body(), "code").ToInt() + if code != 200 { + if (code == 401 || code == 403) && !utils.IsBool(retry...) { + err = d.login() + if err != nil { + return nil, err + } + return d.requestWithTimeout(api, method, callback, timeout, true) + } + return nil, fmt.Errorf("request failed,code: %d, message: %s", code, utils.Json.Get(res.Body(), "message").ToString()) + } + return res.Body(), nil +}