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
}