Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/alist_v3/util.go
1987 views
1
package alist_v3
2
3
import (
4
"fmt"
5
"net/http"
6
7
"github.com/alist-org/alist/v3/drivers/base"
8
"github.com/alist-org/alist/v3/internal/op"
9
"github.com/alist-org/alist/v3/pkg/utils"
10
"github.com/alist-org/alist/v3/server/common"
11
"github.com/go-resty/resty/v2"
12
log "github.com/sirupsen/logrus"
13
)
14
15
func (d *AListV3) login() error {
16
if d.Username == "" {
17
return nil
18
}
19
var resp common.Resp[LoginResp]
20
_, _, err := d.request("/auth/login", http.MethodPost, func(req *resty.Request) {
21
req.SetResult(&resp).SetBody(base.Json{
22
"username": d.Username,
23
"password": d.Password,
24
})
25
})
26
if err != nil {
27
return err
28
}
29
d.Token = resp.Data.Token
30
op.MustSaveDriverStorage(d)
31
return nil
32
}
33
34
func (d *AListV3) request(api, method string, callback base.ReqCallback, retry ...bool) ([]byte, int, error) {
35
url := d.Address + "/api" + api
36
req := base.RestyClient.R()
37
req.SetHeader("Authorization", d.Token)
38
if callback != nil {
39
callback(req)
40
}
41
res, err := req.Execute(method, url)
42
if err != nil {
43
code := 0
44
if res != nil {
45
code = res.StatusCode()
46
}
47
return nil, code, err
48
}
49
log.Debugf("[alist_v3] response body: %s", res.String())
50
if res.StatusCode() >= 400 {
51
return nil, res.StatusCode(), fmt.Errorf("request failed, status: %s", res.Status())
52
}
53
code := utils.Json.Get(res.Body(), "code").ToInt()
54
if code != 200 {
55
if (code == 401 || code == 403) && !utils.IsBool(retry...) {
56
err = d.login()
57
if err != nil {
58
return nil, code, err
59
}
60
return d.request(api, method, callback, true)
61
}
62
return nil, code, fmt.Errorf("request failed,code: %d, message: %s", code, utils.Json.Get(res.Body(), "message").ToString())
63
}
64
return res.Body(), 200, nil
65
}
66
67