summaryrefslogtreecommitdiffstats
path: root/routers/api/packages
diff options
context:
space:
mode:
Diffstat (limited to 'routers/api/packages')
-rw-r--r--routers/api/packages/api.go12
-rw-r--r--routers/api/packages/container/container.go45
2 files changed, 54 insertions, 3 deletions
diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go
index 3354fe12d4..0889006dd7 100644
--- a/routers/api/packages/api.go
+++ b/routers/api/packages/api.go
@@ -316,8 +316,10 @@ func ContainerRoutes(ctx gocontext.Context) *web.Route {
r.Group("/blobs/uploads", func() {
r.Post("", container.InitiateUploadBlob)
r.Group("/{uuid}", func() {
+ r.Get("", container.GetUploadBlob)
r.Patch("", container.UploadBlob)
r.Put("", container.EndUploadBlob)
+ r.Delete("", container.CancelUploadBlob)
})
}, reqPackageAccess(perm.AccessModeWrite))
r.Group("/blobs/{digest}", func() {
@@ -377,7 +379,7 @@ func ContainerRoutes(ctx gocontext.Context) *web.Route {
}
m := blobsUploadsPattern.FindStringSubmatch(path)
- if len(m) == 3 && (isPut || isPatch) {
+ if len(m) == 3 && (isGet || isPut || isPatch || isDelete) {
reqPackageAccess(perm.AccessModeWrite)(ctx)
if ctx.Written() {
return
@@ -391,10 +393,14 @@ func ContainerRoutes(ctx gocontext.Context) *web.Route {
ctx.SetParams("uuid", m[2])
- if isPatch {
+ if isGet {
+ container.GetUploadBlob(ctx)
+ } else if isPatch {
container.UploadBlob(ctx)
- } else {
+ } else if isPut {
container.EndUploadBlob(ctx)
+ } else {
+ container.CancelUploadBlob(ctx)
}
return
}
diff --git a/routers/api/packages/container/container.go b/routers/api/packages/container/container.go
index b961cd4afb..5bc64e1b29 100644
--- a/routers/api/packages/container/container.go
+++ b/routers/api/packages/container/container.go
@@ -248,6 +248,27 @@ func InitiateUploadBlob(ctx *context.Context) {
})
}
+// https://docs.docker.com/registry/spec/api/#get-blob-upload
+func GetUploadBlob(ctx *context.Context) {
+ uuid := ctx.Params("uuid")
+
+ upload, err := packages_model.GetBlobUploadByID(ctx, uuid)
+ if err != nil {
+ if err == packages_model.ErrPackageBlobUploadNotExist {
+ apiErrorDefined(ctx, errBlobUploadUnknown)
+ } else {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ return
+ }
+
+ setResponseHeaders(ctx.Resp, &containerHeaders{
+ Range: fmt.Sprintf("0-%d", upload.BytesReceived),
+ UploadUUID: upload.ID,
+ Status: http.StatusNoContent,
+ })
+}
+
// https://github.com/opencontainers/distribution-spec/blob/main/spec.md#pushing-a-blob-in-chunks
func UploadBlob(ctx *context.Context) {
image := ctx.Params("image")
@@ -354,6 +375,30 @@ func EndUploadBlob(ctx *context.Context) {
})
}
+// https://docs.docker.com/registry/spec/api/#delete-blob-upload
+func CancelUploadBlob(ctx *context.Context) {
+ uuid := ctx.Params("uuid")
+
+ _, err := packages_model.GetBlobUploadByID(ctx, uuid)
+ if err != nil {
+ if err == packages_model.ErrPackageBlobUploadNotExist {
+ apiErrorDefined(ctx, errBlobUploadUnknown)
+ } else {
+ apiError(ctx, http.StatusInternalServerError, err)
+ }
+ return
+ }
+
+ if err := container_service.RemoveBlobUploadByID(ctx, uuid); err != nil {
+ apiError(ctx, http.StatusInternalServerError, err)
+ return
+ }
+
+ setResponseHeaders(ctx.Resp, &containerHeaders{
+ Status: http.StatusNoContent,
+ })
+}
+
func getBlobFromContext(ctx *context.Context) (*packages_model.PackageFileDescriptor, error) {
digest := ctx.Params("digest")