From 8e0986caec91f61e0496e1990a4bec745a9596fc Mon Sep 17 00:00:00 2001 From: Charles Hooper Date: Tue, 12 Mar 2013 05:49:57 +0000 Subject: [PATCH] Error gracefully when an image is not found on pull. Addresses #50 and comments from #49 --- future/future.go | 5 ++++- server/server.go | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/future/future.go b/future/future.go index 33f1f8925c..208484df1a 100644 --- a/future/future.go +++ b/future/future.go @@ -89,7 +89,7 @@ func Pv(src io.Reader, info io.Writer) io.Reader { // the body of the response. If `stderr` is not nil, a progress bar will be // written to it. func Curl(url string, stderr io.Writer) (io.Reader, error) { - curl := exec.Command("curl", "-#", "-L", url) + curl := exec.Command("curl", "-#", "-L", "--fail", url) output, err := curl.StdoutPipe() if err != nil { return nil, err @@ -98,5 +98,8 @@ func Curl(url string, stderr io.Writer) (io.Reader, error) { if err := curl.Start(); err != nil { return nil, err } + if err := curl.Wait(); err != nil { + return nil, err + } return output, nil } diff --git a/server/server.go b/server/server.go index d52666d8f6..d70b413161 100644 --- a/server/server.go +++ b/server/server.go @@ -428,12 +428,16 @@ func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string } fmt.Fprintf(stdout, "Downloading from %s\n", u.String()) // Download with curl (pretty progress bar) - // If curl is not available, fallback to http.Get() + // If curl is not available or receives a HTTP error, fallback + // to http.Get() archive, err := future.Curl(u.String(), stdout) if err != nil { if resp, err := http.Get(u.String()); err != nil { return err } else { + if resp.StatusCode >= 400 { + return errors.New("Got HTTP status code >= 400: " + resp.Status) + } archive = resp.Body } }