diff --git a/drivers/alist_v3/driver.go b/drivers/alist_v3/driver.go index e2deabacccb..f46e68d07a4 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 bf47c61289a..978f3ac0568 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 +}