Skip to content

Commit 4c069fd

Browse files
yuyamioninixrgzs
andauthored
fix(terabox): file upload error (OpenListTeam#733)
* fix(terabox):fix file upload error failed to create file errno 10 Signed-off-by: yuyamionini <[email protected]> * fix(terabox):fix file upload error failed to create file errno 10 Signed-off-by: yuyamionini <[email protected]> * replace the goto statement with the retry-go package Signed-off-by: yuyamionini <[email protected]> * Update util.go Signed-off-by: yuyamionini <[email protected]> * Update util.go Signed-off-by: yuyamionini <[email protected]> * go fmt --------- Signed-off-by: yuyamionini <[email protected]> Co-authored-by: MadDogOwner <[email protected]>
1 parent b450a21 commit 4c069fd

File tree

2 files changed

+62
-23
lines changed

2 files changed

+62
-23
lines changed

drivers/terabox/driver.go

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/OpenListTeam/OpenList/v4/drivers/base"
1515
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
16+
"github.com/avast/retry-go"
1617
log "github.com/sirupsen/logrus"
1718

1819
"github.com/OpenListTeam/OpenList/v4/internal/driver"
@@ -131,7 +132,7 @@ func (d *Terabox) Remove(ctx context.Context, obj model.Obj) error {
131132
func (d *Terabox) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
132133
resp, err := base.RestyClient.R().
133134
SetContext(ctx).
134-
Get("https://" + d.url_domain_prefix + "-data.terabox.com/rest/2.0/pcs/file?method=locateupload")
135+
Get("https://d.terabox.com/rest/2.0/pcs/file?method=locateupload")
135136
if err != nil {
136137
return err
137138
}
@@ -184,13 +185,9 @@ func (d *Terabox) Put(ctx context.Context, dstDir model.Obj, stream model.FileSt
184185
}
185186

186187
params := map[string]string{
187-
"method": "upload",
188-
"path": path,
189-
"uploadid": precreateResp.Uploadid,
190-
"app_id": "250528",
191-
"web": "1",
192-
"channel": "dubox",
193-
"clienttype": "0",
188+
"method": "upload",
189+
"path": path,
190+
"uploadid": precreateResp.Uploadid,
194191
}
195192

196193
streamSize := stream.GetSize()
@@ -200,6 +197,7 @@ func (d *Terabox) Put(ctx context.Context, dstDir model.Obj, stream model.FileSt
200197
left := streamSize
201198
uploadBlockList := make([]string, 0, count)
202199
h := md5.New()
200+
203201
for partseq := 0; partseq < count; partseq++ {
204202
if utils.IsCanceled(ctx) {
205203
return ctx.Err()
@@ -220,21 +218,39 @@ func (d *Terabox) Put(ctx context.Context, dstDir model.Obj, stream model.FileSt
220218

221219
// calculate md5
222220
h.Write(byteData)
223-
uploadBlockList = append(uploadBlockList, hex.EncodeToString(h.Sum(nil)))
221+
localMD5 := hex.EncodeToString(h.Sum(nil))
222+
uploadBlockList = append(uploadBlockList, localMD5)
224223
h.Reset()
225224

226225
u := "https://" + locateupload_resp.Host + "/rest/2.0/pcs/superfile2"
227226
params["partseq"] = strconv.Itoa(partseq)
228-
res, err := base.RestyClient.R().
229-
SetContext(ctx).
230-
SetQueryParams(params).
231-
SetFileReader("file", stream.GetName(), driver.NewLimitedUploadStream(ctx, bytes.NewReader(byteData))).
232-
SetHeader("Cookie", d.Cookie).
233-
Post(u)
227+
log.Debugf("%+v", params)
228+
229+
err = retry.Do(
230+
func() error {
231+
fileReader := driver.NewLimitedUploadStream(ctx, bytes.NewReader(byteData))
232+
res, err := d.post_multipart(u, params, "file", stream.GetName(), fileReader, nil)
233+
log.Debugln(string(res))
234+
if err != nil {
235+
return err
236+
}
237+
238+
rspmd5 := utils.Json.Get(res, "md5").ToString()
239+
if localMD5 != rspmd5 {
240+
log.Debugf("MD5 mismatch, our MD5: %s, server: %s", localMD5, rspmd5)
241+
return fmt.Errorf("MD5 mismatch")
242+
}
243+
return nil
244+
},
245+
retry.Attempts(5),
246+
retry.DelayType(retry.FixedDelay),
247+
retry.Context(ctx),
248+
)
249+
234250
if err != nil {
235251
return err
236252
}
237-
log.Debugln(res.String())
253+
238254
if count > 0 {
239255
up(float64(partseq) * 100 / float64(count))
240256
}

drivers/terabox/util.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package terabox
33
import (
44
"encoding/base64"
55
"fmt"
6+
"io"
67
"net/http"
78
"net/url"
89
"regexp"
@@ -39,7 +40,7 @@ func (d *Terabox) resetJsToken() error {
3940
"Cookie": d.Cookie,
4041
"Accept": "application/json, text/plain, */*",
4142
"Referer": d.base_url,
42-
"User-Agent": base.UserAgent,
43+
"User-Agent": "terabox;1.37.0.7;PC;PC-Windows;10.0.22631;WindowsTeraBox",
4344
"X-Requested-With": "XMLHttpRequest",
4445
}).Get(u)
4546
if err != nil {
@@ -60,7 +61,7 @@ func (d *Terabox) request(rurl string, method string, callback base.ReqCallback,
6061
"Cookie": d.Cookie,
6162
"Accept": "application/json, text/plain, */*",
6263
"Referer": d.base_url,
63-
"User-Agent": base.UserAgent,
64+
"User-Agent": "terabox;1.37.0.7;PC;PC-Windows;10.0.22631;WindowsTeraBox",
6465
"X-Requested-With": "XMLHttpRequest",
6566
})
6667
req.SetQueryParams(map[string]string{
@@ -76,12 +77,18 @@ func (d *Terabox) request(rurl string, method string, callback base.ReqCallback,
7677
if resp != nil {
7778
req.SetResult(resp)
7879
}
79-
res, err := req.Execute(method, d.base_url+rurl)
80+
81+
full_url := d.base_url + rurl
82+
if strings.HasPrefix(rurl, "https://") {
83+
full_url = rurl
84+
}
85+
86+
res, err := req.Execute(method, full_url)
8087
if err != nil {
8188
return nil, err
8289
}
8390
errno := utils.Json.Get(res.Body(), "errno").ToInt()
84-
if errno == 4000023 {
91+
if errno == 4000023 || errno == 4500016 {
8592
// reget jsToken
8693
err = d.resetJsToken()
8794
if err != nil {
@@ -130,6 +137,22 @@ func (d *Terabox) post_form(pathname string, params map[string]string, data map[
130137
}, resp)
131138
}
132139

140+
func (d *Terabox) post_multipart(
141+
pathname string,
142+
params map[string]string,
143+
fileFieldName string,
144+
fileName string,
145+
fileReader io.Reader,
146+
resp interface{},
147+
) ([]byte, error) {
148+
return d.request(pathname, http.MethodPost, func(req *resty.Request) {
149+
if params != nil {
150+
req.SetQueryParams(params)
151+
}
152+
req.SetFileReader(fileFieldName, fileName, fileReader)
153+
}, resp)
154+
}
155+
133156
func (d *Terabox) getFiles(dir string) ([]File, error) {
134157
page := 1
135158
num := 100
@@ -217,15 +240,15 @@ func (d *Terabox) linkOfficial(file model.Obj, args model.LinkArgs) (*model.Link
217240
return nil, fmt.Errorf("fid %s no dlink found, errno: %d", file.GetID(), resp.Errno)
218241
}
219242

220-
res, err := base.NoRedirectClient.R().SetHeader("Cookie", d.Cookie).SetHeader("User-Agent", base.UserAgent).Get(resp.Dlink[0].Dlink)
243+
res, err := base.NoRedirectClient.R().SetHeader("Cookie", d.Cookie).SetHeader("User-Agent", "terabox;1.37.0.7;PC;PC-Windows;10.0.22631;WindowsTeraBox").Get(resp.Dlink[0].Dlink)
221244
if err != nil {
222245
return nil, err
223246
}
224247
u := res.Header().Get("location")
225248
return &model.Link{
226249
URL: u,
227250
Header: http.Header{
228-
"User-Agent": []string{base.UserAgent},
251+
"User-Agent": []string{"terabox;1.37.0.7;PC;PC-Windows;10.0.22631;WindowsTeraBox"},
229252
},
230253
}, nil
231254
}
@@ -244,7 +267,7 @@ func (d *Terabox) linkCrack(file model.Obj, args model.LinkArgs) (*model.Link, e
244267
return &model.Link{
245268
URL: resp.Info[0].Dlink,
246269
Header: http.Header{
247-
"User-Agent": []string{base.UserAgent},
270+
"User-Agent": []string{"terabox;1.37.0.7;PC;PC-Windows;10.0.22631;WindowsTeraBox"},
248271
},
249272
}, nil
250273
}

0 commit comments

Comments
 (0)