diff options
author | Paweł Gronowski <pawel.gronowski@docker.com> | 2023-01-31 10:27:09 +0100 |
---|---|---|
committer | Paweł Gronowski <pawel.gronowski@docker.com> | 2023-02-07 15:43:58 +0100 |
commit | 62be425bcc72ba9377f9bde7f6f6978e6036e1b7 (patch) | |
tree | 62e193fae734de726d045712ace882830486a055 /api/server | |
parent | afc6e3fa46544f23d8afaed62f6bbb53a5912ac0 (diff) | |
download | docker-62be425bcc72ba9377f9bde7f6f6978e6036e1b7.tar.gz |
api: Extract parsing reference from repo and tag
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Diffstat (limited to 'api/server')
-rw-r--r-- | api/server/httputils/form.go | 35 | ||||
-rw-r--r-- | api/server/router/container/container_routes.go | 8 | ||||
-rw-r--r-- | api/server/router/image/image_routes.go | 43 |
3 files changed, 47 insertions, 39 deletions
diff --git a/api/server/httputils/form.go b/api/server/httputils/form.go index 6d166eac10..331440b85a 100644 --- a/api/server/httputils/form.go +++ b/api/server/httputils/form.go @@ -1,9 +1,12 @@ package httputils // import "github.com/docker/docker/api/server/httputils" import ( + "fmt" "net/http" "strconv" "strings" + + "github.com/docker/distribution/reference" ) // BoolValue transforms a form value in different formats into a boolean type. @@ -41,6 +44,38 @@ func Int64ValueOrDefault(r *http.Request, field string, def int64) (int64, error return def, nil } +// RepoTagReference parses form values "repo" and "tag" and returns a valid +// reference with repository and tag. +// If repo is empty, then a nil reference is returned. +// If no tag is given, then the default "latest" tag is set. +func RepoTagReference(repo, tag string) (reference.NamedTagged, error) { + if repo == "" { + return nil, nil + } + + ref, err := reference.ParseNormalizedNamed(repo) + if err != nil { + return nil, err + } + + if _, isDigested := ref.(reference.Digested); isDigested { + return nil, fmt.Errorf("cannot import digest reference") + } + + if tag != "" { + return reference.WithTag(ref, tag) + } + + withDefaultTag := reference.TagNameOnly(ref) + + namedTagged, ok := withDefaultTag.(reference.NamedTagged) + if !ok { + return nil, fmt.Errorf("unexpected reference: %q", ref.String()) + } + + return namedTagged, nil +} + // ArchiveOptions stores archive information for different operations. type ArchiveOptions struct { Name string diff --git a/api/server/router/container/container_routes.go b/api/server/router/container/container_routes.go index 5df051fc95..827553d62e 100644 --- a/api/server/router/container/container_routes.go +++ b/api/server/router/container/container_routes.go @@ -48,10 +48,14 @@ func (s *containerRouter) postCommit(ctx context.Context, w http.ResponseWriter, return err } + ref, err := httputils.RepoTagReference(r.Form.Get("repo"), r.Form.Get("tag")) + if err != nil { + return errdefs.InvalidParameter(err) + } + commitCfg := &backend.CreateImageConfig{ Pause: pause, - Repo: r.Form.Get("repo"), - Tag: r.Form.Get("tag"), + Tag: ref, Author: r.Form.Get("author"), Comment: r.Form.Get("comment"), Config: config, diff --git a/api/server/router/image/image_routes.go b/api/server/router/image/image_routes.go index bcb7c744ef..8b0fb9422f 100644 --- a/api/server/router/image/image_routes.go +++ b/api/server/router/image/image_routes.go @@ -72,25 +72,9 @@ func (ir *imageRouter) postImagesCreate(ctx context.Context, w http.ResponseWrit } else { // import src := r.Form.Get("fromSrc") - var ref reference.Named - if repo != "" { - var err error - ref, err = reference.ParseNormalizedNamed(repo) - if err != nil { - return errdefs.InvalidParameter(err) - } - if _, isDigested := ref.(reference.Digested); isDigested { - return errdefs.InvalidParameter(errors.New("cannot import digest reference")) - } - - if tag != "" { - ref, err = reference.WithTag(ref, tag) - if err != nil { - return errdefs.InvalidParameter(err) - } - } else { - ref = reference.TagNameOnly(ref) - } + tagRef, err := httputils.RepoTagReference(repo, tag) + if err != nil { + return errdefs.InvalidParameter(err) } if len(comment) == 0 { @@ -121,7 +105,7 @@ func (ir *imageRouter) postImagesCreate(ctx context.Context, w http.ResponseWrit } var id image.ID - id, progressErr = ir.backend.ImportImage(ctx, ref, platform, comment, layerReader, r.Form["changes"]) + id, progressErr = ir.backend.ImportImage(ctx, tagRef, platform, comment, layerReader, r.Form["changes"]) if progressErr == nil { output.Write(streamformatter.FormatStatus("", id.String())) @@ -370,26 +354,11 @@ func (ir *imageRouter) postImagesTag(ctx context.Context, w http.ResponseWriter, return err } - repo := r.Form.Get("repo") - tag := r.Form.Get("tag") - - ref, err := reference.ParseNormalizedNamed(repo) - if err != nil { + ref, err := httputils.RepoTagReference(r.Form.Get("repo"), r.Form.Get("tag")) + if ref == nil || err != nil { return errdefs.InvalidParameter(err) } - if _, isDigested := ref.(reference.Digested); isDigested { - return errdefs.InvalidParameter(errors.New("tag reference can't have a digest")) - } - - if tag != "" { - if ref, err = reference.WithTag(reference.TrimNamed(ref), tag); err != nil { - return errdefs.InvalidParameter(err) - } - } else { - ref = reference.TagNameOnly(ref) - } - img, err := ir.backend.GetImage(ctx, vars["name"], opts.GetImageOpts{}) if err != nil { return errdefs.NotFound(err) |