repo.me/internal/handler/referrers.go

58 lines
1.3 KiB
Go
Raw Normal View History

2024-04-10 22:10:09 +08:00
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
}