func()

in proxymode/proxymode.go [167:210]


func (pm *ProxyMode) Package(r *http.Request) (*packages.Package, error) {
	vars := mux.Vars(r)
	packageName, ok := vars["packageName"]
	if !ok {
		return nil, errors.New("missing package name")
	}

	packageVersion, ok := vars["packageVersion"]
	if !ok {
		return nil, errors.New("missing package version")
	}

	urlPath := fmt.Sprintf("/package/%s/%s/", packageName, packageVersion)
	proxyURL := pm.destinationURL.ResolveReference(&url.URL{Path: urlPath})
	proxyRequest, err := retryablehttp.NewRequest(http.MethodGet, proxyURL.String(), nil)
	if err != nil {
		return nil, fmt.Errorf("can't create proxy request: %w", err)
	}

	pm.logger.Debug("Proxy /package request", zap.String("request.uri", proxyURL.String()))
	response, err := pm.httpClient.Do(proxyRequest)
	if err != nil {
		return nil, fmt.Errorf("can't proxy package request: %w", err)
	}
	defer response.Body.Close()

	switch response.StatusCode {
	case http.StatusOK:
		// Package found, all good.
	case http.StatusNotFound:
		// Package doesn't exist, don't try to parse the response, just return an empty package.
		return nil, nil
	default:
		return nil, fmt.Errorf("unexpected status code %d received", response.StatusCode)
	}

	var pkg packages.Package
	err = json.NewDecoder(response.Body).Decode(&pkg)
	if err != nil {
		return nil, fmt.Errorf("can't proxy package request: %w", err)
	}
	pkg.SetRemoteResolver(pm.resolver)
	return &pkg, nil
}