summaryrefslogtreecommitdiff
path: root/api/server
diff options
context:
space:
mode:
authorPaweł Gronowski <pawel.gronowski@docker.com>2023-01-31 10:27:09 +0100
committerPaweł Gronowski <pawel.gronowski@docker.com>2023-02-07 15:43:58 +0100
commit62be425bcc72ba9377f9bde7f6f6978e6036e1b7 (patch)
tree62e193fae734de726d045712ace882830486a055 /api/server
parentafc6e3fa46544f23d8afaed62f6bbb53a5912ac0 (diff)
downloaddocker-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.go35
-rw-r--r--api/server/router/container/container_routes.go8
-rw-r--r--api/server/router/image/image_routes.go43
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)