From 75aa2184107f897ba32eebc06f288a9fffde6568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=91=D0=BE=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Wed, 25 Feb 2026 21:12:54 +0200 Subject: [PATCH] Added POST then PUT method $ helm push --username mstore --password mstore --insecure-skip-tls-verify DIST/mstore-0.2.0.tgz oci://localhost:1025/mstore Pushed: localhost:1025/mstore/mstore:0.2.0 Digest: sha256:5a60793c9fc655e1940b00dac707632d7d3b32aad31a79acc41e65f9152e50fc --- app/handler/blob.go | 11 +++++++++++ app/operator/blob.go | 16 +++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/handler/blob.go b/app/handler/blob.go index f0b0a12..e196b1a 100644 --- a/app/handler/blob.go +++ b/app/handler/blob.go @@ -60,6 +60,15 @@ func (hand *Handler) BlobExists(rctx *router.Context) { func (hand *Handler) PostUpload(rctx *router.Context) { name, _ := rctx.GetSubpath("name") + hand.DumpHeaders("PostUploads", rctx) + + authorization := rctx.GetHeader("Authorization") + if authorization == "" { + rctx.SetHeader("WWW-Authenticate", `Basic realm="mstore"`) + rctx.SetStatus(http.StatusUnauthorized) + return + } + digest := rctx.GetQuery("digest") mount := rctx.GetQuery("mount") from := rctx.GetQuery("from") @@ -150,6 +159,7 @@ func (hand *Handler) PutUpload(rctx *router.Context) { reference, _ := rctx.GetSubpath("reference") digest := rctx.GetQuery("digest") + reader := rctx.Request.Body params := &operator.PutUploadParams{ ContentLength: contentLength, @@ -158,6 +168,7 @@ func (hand *Handler) PutUpload(rctx *router.Context) { Name: name, Reference: reference, Digest: digest, + Reader: reader, } // Rigth checking operatorID, _ := rctx.GetString(userTag) diff --git a/app/operator/blob.go b/app/operator/blob.go index f0f7946..1db3cb3 100644 --- a/app/operator/blob.go +++ b/app/operator/blob.go @@ -217,9 +217,19 @@ func (oper *Operator) PutUpload(ctx context.Context, operatorID string, params * } if contentLength != 0 { - // TODO - err = fmt.Errorf("Unexpected Content-Length header: %s", params.ContentLength) - return res, http.StatusInternalServerError, err + recsize, _, err := oper.store.WriteUpload(params.Reference, params.Reader) + if err != nil { + return res, http.StatusInternalServerError, err + } + if contentLength != 0 && recsize != contentLength { + oper.store.RemoveUpload(params.Reference) + err = fmt.Errorf("Mismatch upload recorded size and content length") + return res, http.StatusInternalServerError, err + } + if err != nil { + return res, http.StatusInternalServerError, err + } + res.Location = fmt.Sprintf("/v2/%s/blobs/%s", params.Name, params.Digest) } err = oper.store.LinkUpload(params.Reference, params.Digest)