diff --git a/daemon/import.go b/daemon/import.go index adc82550de..fc9f2682c5 100644 --- a/daemon/import.go +++ b/daemon/import.go @@ -6,6 +6,7 @@ import ( "net/http" "net/url" "runtime" + "strings" "time" "github.com/docker/distribution/reference" @@ -59,20 +60,19 @@ func (daemon *Daemon) ImportImage(src string, repository, tag string, msg string rc = inConfig } else { inConfig.Close() + if len(strings.Split(src, "://")) == 1 { + src = "http://" + src + } u, err := url.Parse(src) if err != nil { return err } - if u.Scheme == "" { - u.Scheme = "http" - u.Host = src - u.Path = "" - } - outStream.Write(sf.FormatStatus("", "Downloading from %s", u)) + resp, err = httputils.Download(u.String()) if err != nil { return err } + outStream.Write(sf.FormatStatus("", "Downloading from %s", u)) progressOutput := sf.NewProgressOutput(outStream, true) rc = progress.NewProgressReader(resp.Body, progressOutput, resp.ContentLength, "", "Importing") } diff --git a/integration-cli/docker_api_images_test.go b/integration-cli/docker_api_images_test.go index 6f911491bf..80a9ca3229 100644 --- a/integration-cli/docker_api_images_test.go +++ b/integration-cli/docker_api_images_test.go @@ -115,6 +115,29 @@ func (s *DockerSuite) TestAPIImagesHistory(c *check.C) { c.Assert(historydata[0].Tags[0], checker.Equals, "test-api-images-history:latest") } +func (s *DockerSuite) TestAPIImagesImportBadSrc(c *check.C) { + testRequires(c, Network) + + tt := []struct { + statusExp int + fromSrc string + }{ + {http.StatusNotFound, "http://example.com/nofile.tar"}, + {http.StatusNotFound, "example.com/nofile.tar"}, + {http.StatusNotFound, "example.com%2Fdata%2Ffile.tar"}, + {http.StatusInternalServerError, "%2Fdata%2Ffile.tar"}, + } + + for _, te := range tt { + res, b, err := request.SockRequestRaw("POST", strings.Join([]string{"/images/create?fromSrc=", te.fromSrc}, ""), nil, "application/json", daemonHost()) + c.Assert(err, check.IsNil) + b.Close() + c.Assert(res.StatusCode, checker.Equals, te.statusExp) + c.Assert(res.Header.Get("Content-Type"), checker.Equals, "application/json") + } + +} + // #14846 func (s *DockerSuite) TestAPIImagesSearchJSONContentType(c *check.C) { testRequires(c, Network)