package handler import ( "bytes" "encoding/json" "fmt" "github.com/loveuer/nf" "io" "net/http" "nf-repo/internal/interfaces" "nf-repo/internal/model" "nf-repo/internal/model/types" "nf-repo/internal/util/rerr" "strings" ) func handleReferrers(ctx *nf.Ctx, m interfaces.ManifestHandler) error { if ctx.Method() != "GET" { return rerr.Error(ctx, &rerr.RepositoryError{ Status: http.StatusBadRequest, Code: "METHOD_UNKNOWN", Message: "We don't understand your method + url", }) } elem := strings.Split(ctx.Path(), "/") elem = elem[1:] target := elem[len(elem)-1] repo := strings.Join(elem[1:len(elem)-2], "/") var ( err error re *rerr.RepositoryError im *model.IndexManifest ) // Validate that incoming target is a valid digest if _, err := model.NewHash(target); err != nil { return rerr.Error(ctx, &rerr.RepositoryError{ Status: http.StatusBadRequest, Code: "UNSUPPORTED", Message: "Target must be a valid digest", }) } if im, re = m.Referrers(ctx.Request.Context(), repo, target); re != nil { return rerr.Error(ctx, re) } msg, _ := json.Marshal(im) ctx.Set("Content-Length", fmt.Sprint(len(msg))) ctx.Set("Content-Type", string(types.OCIImageIndex)) ctx.Status(http.StatusOK) _, err = io.Copy(ctx.RawWriter(), bytes.NewReader(msg)) return err }