Sfoglia il codice sorgente

fix error handling

Docker-DCO-1.1-Signed-off-by: Victor Vieux <victor.vieux@docker.com> (github: vieux)
Victor Vieux 11 anni fa
parent
commit
f41e0cf048
4 ha cambiato i file con 30 aggiunte e 42 eliminazioni
  1. 16 27
      commands.go
  2. 3 9
      engine/env.go
  3. 6 1
      engine/streams.go
  4. 5 5
      integration/api_test.go

+ 16 - 27
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)

+ 3 - 9
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) {

+ 6 - 1
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
 		}
 	}()

+ 5 - 5
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)
 	}