From f41e0cf0485eac21d65c1af19a732b350292d200 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 21 Jan 2014 17:56:09 -0800 Subject: [PATCH] fix error handling Docker-DCO-1.1-Signed-off-by: Victor Vieux (github: vieux) --- commands.go | 43 +++++++++++++++-------------------------- engine/env.go | 12 +++--------- engine/streams.go | 7 ++++++- integration/api_test.go | 10 +++++----- 4 files changed, 30 insertions(+), 42 deletions(-) diff --git a/commands.go b/commands.go index 5578455761..98be8b6edf 100644 --- a/commands.go +++ b/commands.go @@ -823,13 +823,13 @@ func (cli *DockerCli) CmdRmi(args ...string) error { var encounteredError error for _, name := range cmd.Args() { - stream, _, err := cli.call("DELETE", "/images/"+name, nil, false) + body, _, err := readBody(cli.call("DELETE", "/images/"+name, nil, false)) if err != nil { fmt.Fprintf(cli.err, "%s\n", err) encounteredError = fmt.Errorf("Error: failed to remove one or more images") } else { outs := engine.NewTable("Created", 0) - if _, err := outs.ReadListFrom(stream); err != nil { + if _, err := outs.ReadListFrom(body); err != nil { fmt.Fprintf(cli.err, "%s\n", err) encounteredError = fmt.Errorf("Error: failed to remove one or more images") continue @@ -859,16 +859,13 @@ func (cli *DockerCli) CmdHistory(args ...string) error { return nil } - stream, _, err := cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, false) - if stream != nil { - defer stream.Close() - } + body, _, err := readBody(cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, false)) if err != nil { return err } outs := engine.NewTable("Created", 0) - if _, err := outs.ReadListFrom(stream); err != nil { + if _, err := outs.ReadListFrom(body); err != nil { return err } @@ -1139,16 +1136,13 @@ func (cli *DockerCli) CmdImages(args ...string) error { filter := cmd.Arg(0) if *flViz || *flTree { - stream, _, err := cli.call("GET", "/images/json?all=1", nil, false) - if stream != nil { - defer stream.Close() - } + body, _, err := readBody(cli.call("GET", "/images/json?all=1", nil, false)) if err != nil { return err } outs := engine.NewTable("Created", 0) - if _, err := outs.ReadListFrom(stream); err != nil { + if _, err := outs.ReadListFrom(body); err != nil { return err } @@ -1211,16 +1205,14 @@ func (cli *DockerCli) CmdImages(args ...string) error { v.Set("all", "1") } - stream, _, err := cli.call("GET", "/images/json?"+v.Encode(), nil, false) - if stream != nil { - defer stream.Close() - } + body, _, err := readBody(cli.call("GET", "/images/json?"+v.Encode(), nil, false)) + if err != nil { return err } outs := engine.NewTable("Created", 0) - if _, err := outs.ReadListFrom(stream); err != nil { + if _, err := outs.ReadListFrom(body); err != nil { return err } @@ -1532,16 +1524,14 @@ func (cli *DockerCli) CmdDiff(args ...string) error { return nil } - stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, false) - if stream != nil { - defer stream.Close() - } + body, _, err := readBody(cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, false)) + if err != nil { return err } outs := engine.NewTable("", 0) - if _, err := outs.ReadListFrom(stream); err != nil { + if _, err := outs.ReadListFrom(body); err != nil { return err } for _, change := range outs.Data { @@ -1674,15 +1664,14 @@ func (cli *DockerCli) CmdSearch(args ...string) error { v := url.Values{} v.Set("term", cmd.Arg(0)) - stream, _, err := cli.call("GET", "/images/search?"+v.Encode(), nil, true) - if stream != nil { - defer stream.Close() - } + + body, _, err := readBody(cli.call("GET", "/images/search?"+v.Encode(), nil, false)) + if err != nil { return err } outs := engine.NewTable("star_count", 0) - if _, err := outs.ReadListFrom(stream); err != nil { + if _, err := outs.ReadListFrom(body); err != nil { return err } w := tabwriter.NewWriter(cli.out, 10, 1, 3, ' ', 0) diff --git a/engine/env.go b/engine/env.go index 37ba2ddb4c..2df303c9e1 100644 --- a/engine/env.go +++ b/engine/env.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "sort" "strconv" "strings" @@ -325,15 +324,10 @@ func (t *Table) WriteTo(dst io.Writer) (n int64, err error) { return n, nil } -func (t *Table) ReadListFrom(src io.Reader) (n int64, err error) { +func (t *Table) ReadListFrom(src []byte) (n int64, err error) { var array []interface{} - content, err := ioutil.ReadAll(src) - if err != nil { - return -1, err - } - - if err := json.Unmarshal(content, &array); err != nil { + if err := json.Unmarshal(src, &array); err != nil { return -1, err } @@ -347,7 +341,7 @@ func (t *Table) ReadListFrom(src io.Reader) (n int64, err error) { } } - return int64(len(content)), nil + return int64(len(src)), nil } func (t *Table) ReadFrom(src io.Reader) (n int64, err error) { diff --git a/engine/streams.go b/engine/streams.go index 4b1f172b49..48f031de8f 100644 --- a/engine/streams.go +++ b/engine/streams.go @@ -5,6 +5,7 @@ import ( "container/ring" "fmt" "io" + "io/ioutil" "sync" ) @@ -228,7 +229,11 @@ func (o *Output) AddListTable() (dst *Table, err error) { o.tasks.Add(1) go func() { defer o.tasks.Done() - if _, err := dst.ReadListFrom(src); err != nil { + content, err := ioutil.ReadAll(src) + if err != nil { + return + } + if _, err := dst.ReadListFrom(content); err != nil { return } }() diff --git a/integration/api_test.go b/integration/api_test.go index 6fac656c99..ec9e4acb7c 100644 --- a/integration/api_test.go +++ b/integration/api_test.go @@ -170,7 +170,7 @@ func TestGetImagesJSON(t *testing.T) { assertHttpNotError(r, t) images := engine.NewTable("Created", 0) - if _, err := images.ReadListFrom(r.Body); err != nil { + if _, err := images.ReadListFrom(r.Body.Bytes()); err != nil { t.Fatal(err) } @@ -205,7 +205,7 @@ func TestGetImagesJSON(t *testing.T) { assertHttpNotError(r2, t) images2 := engine.NewTable("ID", 0) - if _, err := images2.ReadListFrom(r2.Body); err != nil { + if _, err := images2.ReadListFrom(r2.Body.Bytes()); err != nil { t.Fatal(err) } @@ -238,7 +238,7 @@ func TestGetImagesJSON(t *testing.T) { assertHttpNotError(r3, t) images3 := engine.NewTable("ID", 0) - if _, err := images3.ReadListFrom(r3.Body); err != nil { + if _, err := images3.ReadListFrom(r3.Body.Bytes()); err != nil { t.Fatal(err) } @@ -264,7 +264,7 @@ func TestGetImagesHistory(t *testing.T) { assertHttpNotError(r, t) outs := engine.NewTable("Created", 0) - if _, err := outs.ReadListFrom(r.Body); err != nil { + if _, err := outs.ReadListFrom(r.Body.Bytes()); err != nil { t.Fatal(err) } if len(outs.Data) != 1 { @@ -409,7 +409,7 @@ func TestGetContainersChanges(t *testing.T) { } assertHttpNotError(r, t) outs := engine.NewTable("", 0) - if _, err := outs.ReadListFrom(r.Body); err != nil { + if _, err := outs.ReadListFrom(r.Body.Bytes()); err != nil { t.Fatal(err) }