MCPcopy
hub / github.com/esm-dev/esm.sh / fetchPackageTarballContext

Function fetchPackageTarballContext

server/npmrc.go:593–670  ·  view source on GitHub ↗
(ctx context.Context, reg *NpmRegistry, installDir string, pkgName string, tarballUrlStr string)

Source from the content-addressed store, hash-verified

591}
592
593func 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
621RETRY:
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

Callers 1

installPackageContextMethod · 0.85

Calls 9

NewClientFunction · 0.92
sleepWithContextFunction · 0.85
isRateLimitedMethod · 0.80
SetMethod · 0.80
FetchWithContextMethod · 0.80
hitRateLimitMethod · 0.80
CloseMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected