(ctx context.Context, reg *NpmRegistry, installDir string, pkgName string, tarballUrlStr string)
| 591 | } |
| 592 | |
| 593 | func fetchPackageTarballContext(ctx context.Context, reg *NpmRegistry, installDir string, pkgName string, tarballUrlStr string) (err error) { |
| 594 | tarballUrl, err := url.Parse(tarballUrlStr) |
| 595 | if err != nil { |
| 596 | return |
| 597 | } |
| 598 | |
| 599 | if reg.isRateLimited() && reg.BackupRegistry != "" && strings.HasPrefix(tarballUrlStr, reg.Registry) { |
| 600 | var backupUrl *url.URL |
| 601 | backupUrl, err = url.Parse(reg.BackupRegistry) |
| 602 | if err != nil { |
| 603 | return |
| 604 | } |
| 605 | backupUrl.Path = tarballUrl.Path |
| 606 | backupUrl.RawQuery = tarballUrl.RawQuery |
| 607 | tarballUrl = backupUrl |
| 608 | tarballUrlStr = backupUrl.String() |
| 609 | } |
| 610 | |
| 611 | header := http.Header{} |
| 612 | if reg.Token != "" { |
| 613 | header.Set("Authorization", "Bearer "+reg.Token) |
| 614 | } else if reg.User != "" && reg.Password != "" { |
| 615 | header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(reg.User+":"+reg.Password))) |
| 616 | } |
| 617 | |
| 618 | fetchClient := fetch.NewClient("esmd/"+VERSION, 30, false) |
| 619 | |
| 620 | retryTimes := 0 |
| 621 | RETRY: |
| 622 | if err := ctx.Err(); err != nil { |
| 623 | return err |
| 624 | } |
| 625 | res, err := fetchClient.FetchWithContext(ctx, tarballUrl, header) |
| 626 | if err != nil { |
| 627 | if retryTimes < 3 { |
| 628 | retryTimes++ |
| 629 | if sleepErr := sleepWithContext(ctx, time.Duration(retryTimes)*100*time.Millisecond); sleepErr != nil { |
| 630 | return sleepErr |
| 631 | } |
| 632 | goto RETRY |
| 633 | } |
| 634 | err = fmt.Errorf("failed to download tarball of package '%s': %v", pkgName, err) |
| 635 | return |
| 636 | } |
| 637 | defer res.Body.Close() |
| 638 | |
| 639 | if res.StatusCode == 404 || res.StatusCode == 401 { |
| 640 | err = fmt.Errorf("tarball of package '%s' not found", pkgName) |
| 641 | return |
| 642 | } |
| 643 | |
| 644 | if res.StatusCode == 429 && reg.isRateLimited() && reg.BackupRegistry != "" && strings.HasPrefix(tarballUrlStr, reg.Registry) { |
| 645 | var backupUrl *url.URL |
| 646 | backupUrl, err = url.Parse(reg.BackupRegistry) |
| 647 | if err != nil { |
| 648 | return |
| 649 | } |
| 650 | backupUrl.Path = tarballUrl.Path |
no test coverage detected