wip: oci image management
This commit is contained in:
76
handler/blob.go
Normal file
76
handler/blob.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"gitea.loveuer.com/loveuer/cluster/controller"
|
||||
"gitea.loveuer.com/loveuer/cluster/internal/registry/storage"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
)
|
||||
|
||||
// GetBlob 获取 blob
|
||||
func GetBlob(store storage.Storage) fiber.Handler {
|
||||
return func(c fiber.Ctx) error {
|
||||
repo := c.Locals("repo_name")
|
||||
repoStr := ""
|
||||
if repo != nil {
|
||||
repoStr = repo.(string)
|
||||
}
|
||||
if repoStr == "" {
|
||||
repoStr = strings.TrimPrefix(c.Params("name"), "/")
|
||||
}
|
||||
digest := c.Locals("digest")
|
||||
digestStr := ""
|
||||
if digest != nil {
|
||||
digestStr = digest.(string)
|
||||
}
|
||||
|
||||
reader, size, err := controller.GetBlob(store, repoStr, digestStr)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
|
||||
"errors": []fiber.Map{
|
||||
{
|
||||
"code": "BLOB_UNKNOWN",
|
||||
"message": err.Error(),
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
defer reader.Close()
|
||||
|
||||
c.Set("Content-Type", "application/octet-stream")
|
||||
c.Set("Content-Length", strconv.FormatInt(size, 10))
|
||||
c.Set("Docker-Content-Digest", digestStr)
|
||||
return c.SendStream(reader, int(size))
|
||||
}
|
||||
}
|
||||
|
||||
// HeadBlob 检查 blob 是否存在
|
||||
func HeadBlob(store storage.Storage) fiber.Handler {
|
||||
return func(c fiber.Ctx) error {
|
||||
repo := c.Locals("repo_name")
|
||||
repoStr := ""
|
||||
if repo != nil {
|
||||
repoStr = repo.(string)
|
||||
}
|
||||
if repoStr == "" {
|
||||
repoStr = strings.TrimPrefix(c.Params("name"), "/")
|
||||
}
|
||||
digest := c.Locals("digest")
|
||||
digestStr := ""
|
||||
if digest != nil {
|
||||
digestStr = digest.(string)
|
||||
}
|
||||
|
||||
exists, size, err := controller.HeadBlob(store, repoStr, digestStr)
|
||||
if err != nil || !exists {
|
||||
return c.SendStatus(fiber.StatusNotFound)
|
||||
}
|
||||
|
||||
c.Set("Content-Length", strconv.FormatInt(size, 10))
|
||||
c.Set("Docker-Content-Digest", digestStr)
|
||||
return c.SendStatus(fiber.StatusOK)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user