in internal/frontend/404.go [219:303]
func previousFetchStatusAndResponse(ctx context.Context, db *postgres.DB,
fullPath, modulePath, requestedVersion string) (_ *fetchResult, err error) {
defer derrors.Wrap(&err, "previousFetchStatusAndResponse(w, r, %q, %q)", fullPath, requestedVersion)
// Get all candidate module paths for this path.
paths, err := modulePathsToFetch(ctx, db, fullPath, modulePath)
if err != nil {
var serr *serverError
if errors.As(err, &serr) && serr.status == http.StatusBadRequest {
// Return this as an invalid argument so that we don't log it in
// servePathNotFoundPage above.
return nil, derrors.InvalidArgument
}
return nil, err
}
// Check if a row exists in the version_map table for the longest candidate
// path and version.
//
// If we have not fetched the path before, a derrors.NotFound will be
// returned.
vm, err := db.GetVersionMap(ctx, paths[0], requestedVersion)
if err != nil {
return nil, err
}
// If the row has been fetched before, and the result was either a 490,
// 491, or 5xx, return that result, since it is a final state.
if vm != nil {
fr := &fetchResult{
modulePath: vm.ModulePath,
goModPath: vm.GoModPath,
status: vm.Status,
err: errors.New(vm.Error),
}
if vm.Status >= 200 && vm.Status < 300 {
fr.resolvedVersion = vm.ResolvedVersion
return fr, nil
}
if vm.Status >= 500 ||
vm.Status == derrors.ToStatus(derrors.AlternativeModule) ||
vm.Status == derrors.ToStatus(derrors.BadModule) {
return resultFromFetchRequest([]*fetchResult{fr}, fullPath, requestedVersion)
}
}
// Check if the unit path exists at a higher major version.
// For example, my.module might not exist, but my.module/v3 might.
// Similarly, my.module/foo might not exist, but my.module/v3/foo might.
// In either case, the user will be redirected to the highest major version
// of the path.
//
// Do not bother to look for a specific version if this case. If
// my.module/foo@v2.1.0 was requested, and my.module/foo/v2 exists, just
// return the latest version of my.module/foo/v2.
//
// Only redirect if the majPath returned is different from the fullPath, and
// the majPath is not at v1. We don't want to redirect my.module/foo/v3 to
// my.module/foo, or my.module/foo@v1.5.2 to my.module/foo@v1.0.0.
majPath, maj, err := db.GetLatestMajorPathForV1Path(ctx, fullPath)
if err != nil && err != derrors.NotFound {
return nil, err
}
if majPath != fullPath && maj != 1 && majPath != "" {
return &fetchResult{
modulePath: majPath,
goModPath: majPath,
status: http.StatusFound,
}, nil
}
vms, err := db.GetVersionMaps(ctx, paths, requestedVersion)
if err != nil {
return nil, err
}
var fetchResults []*fetchResult
for _, vm := range vms {
fr := fetchResultFromVersionMap(vm)
fetchResults = append(fetchResults, fr)
if vm.Status == http.StatusOK || vm.Status == 290 {
fr.err = errPathDoesNotExistInModule
}
}
if len(fetchResults) == 0 {
return nil, derrors.NotFound
}
return resultFromFetchRequest(fetchResults, fullPath, requestedVersion)
}