(ctx context.Context, file model.FileStreamer, u FileUploadResp, up driver.UpdateProgress)
| 410 | } |
| 411 | |
| 412 | func (d *CloudreveV4) upRemote(ctx context.Context, file model.FileStreamer, u FileUploadResp, up driver.UpdateProgress) error { |
| 413 | DEFAULT := int64(u.ChunkSize) |
| 414 | ss, err := stream.NewStreamSectionReader(file, int(DEFAULT), &up) |
| 415 | if err != nil { |
| 416 | return err |
| 417 | } |
| 418 | |
| 419 | uploadUrl := u.UploadUrls[0] |
| 420 | credential := u.Credential |
| 421 | var finish int64 = 0 |
| 422 | var chunk int = 0 |
| 423 | for finish < file.GetSize() { |
| 424 | if utils.IsCanceled(ctx) { |
| 425 | return ctx.Err() |
| 426 | } |
| 427 | left := file.GetSize() - finish |
| 428 | byteSize := min(left, DEFAULT) |
| 429 | utils.Log.Debugf("[CloudreveV4-Remote] upload range: %d-%d/%d", finish, finish+byteSize-1, file.GetSize()) |
| 430 | rd, err := ss.GetSectionReader(finish, byteSize) |
| 431 | if err != nil { |
| 432 | return err |
| 433 | } |
| 434 | err = retry.Do( |
| 435 | func() error { |
| 436 | rd.Seek(0, io.SeekStart) |
| 437 | req, err := http.NewRequestWithContext(ctx, http.MethodPost, uploadUrl+"?chunk="+strconv.Itoa(chunk), |
| 438 | driver.NewLimitedUploadStream(ctx, rd)) |
| 439 | if err != nil { |
| 440 | return err |
| 441 | } |
| 442 | |
| 443 | req.ContentLength = byteSize |
| 444 | req.Header.Set("Authorization", fmt.Sprint(credential)) |
| 445 | req.Header.Set("User-Agent", d.getUA()) |
| 446 | res, err := base.HttpClient.Do(req) |
| 447 | if err != nil { |
| 448 | return err |
| 449 | } |
| 450 | defer res.Body.Close() |
| 451 | if res.StatusCode != 200 { |
| 452 | return fmt.Errorf("server error: %d", res.StatusCode) |
| 453 | } |
| 454 | body, err := io.ReadAll(res.Body) |
| 455 | if err != nil { |
| 456 | return err |
| 457 | } |
| 458 | var up Resp |
| 459 | err = json.Unmarshal(body, &up) |
| 460 | if err != nil { |
| 461 | return err |
| 462 | } |
| 463 | if up.Code != 0 { |
| 464 | return errors.New(up.Msg) |
| 465 | } |
| 466 | return nil |
| 467 | }, |
| 468 | retry.Context(ctx), |
| 469 | retry.Attempts(3), |
no test coverage detected