瀏覽代碼

Return JSONError for HTTPResponse error

Michael Crosby 12 年之前
父節點
當前提交
dae585c6e4
共有 6 個文件被更改,包括 20 次插入31 次删除
  1. 4 8
      api.go
  2. 1 1
      commands.go
  3. 2 2
      registry/registry.go
  4. 0 18
      utils/error.go
  5. 12 1
      utils/utils.go
  6. 1 1
      utils_test.go

+ 4 - 8
api.go

@@ -388,7 +388,7 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht
 	if image != "" { //pull
 		if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}); err != nil {
 			if sf.Used() {
-				w.Write(sf.FormatError(err, 0))
+				w.Write(sf.FormatError(err))
 				return nil
 			}
 			return err
@@ -396,7 +396,7 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht
 	} else { //import
 		if err := srv.ImageImport(src, repo, tag, r.Body, w, sf); err != nil {
 			if sf.Used() {
-				w.Write(sf.FormatError(err, 0))
+				w.Write(sf.FormatError(err))
 				return nil
 			}
 			return err
@@ -441,7 +441,7 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht
 	imgID, err := srv.ImageInsert(name, url, path, w, sf)
 	if err != nil {
 		if sf.Used() {
-			w.Write(sf.FormatError(err, 0))
+			w.Write(sf.FormatError(err))
 			return nil
 		}
 	}
@@ -472,11 +472,7 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
 	sf := utils.NewStreamFormatter(version > 1.0)
 	if err := srv.ImagePush(name, w, sf, authConfig); err != nil {
 		if sf.Used() {
-			var code int
-			if httpErr, ok := err.(*utils.HTTPRequestError); ok {
-				code = httpErr.StatusCode
-			}
-			w.Write(sf.FormatError(err, code))
+			w.Write(sf.FormatError(err))
 			return nil
 		}
 		return err

+ 1 - 1
commands.go

@@ -31,7 +31,7 @@ const VERSION = "0.5.0-dev"
 
 var (
 	GITCOMMIT         string
-	AuthRequiredError error = fmt.Errorf("Authentication is required.")
+	AuthRequiredError = fmt.Errorf("Authentication is required.")
 )
 
 func (cli *DockerCli) getMethod(name string) (reflect.Method, bool) {

+ 2 - 2
registry/registry.go

@@ -427,9 +427,9 @@ func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registr
 	if res.StatusCode != 200 {
 		errBody, err := ioutil.ReadAll(res.Body)
 		if err != nil {
-			return utils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err), res)
+			return "", utils.NewHTTPRequestError(fmt.Sprintf("HTTP code %d while uploading metadata and error when trying to parse response body: %s", res.StatusCode, err), res)
 		}
-		return utils.NewHTTPRequestError(fmt.Sprintf("Received HTTP code %d while uploading layer: %s", res.StatusCode, errBody), res)
+		return "", utils.NewHTTPRequestError(fmt.Sprintf("Received HTTP code %d while uploading layer: %s", res.StatusCode, errBody), res)
 	}
 	return tarsumLayer.Sum(jsonRaw), nil
 }

+ 0 - 18
utils/error.go

@@ -1,18 +0,0 @@
-package utils
-
-import (
-	"net/http"
-)
-
-type HTTPRequestError struct {
-	Message    string
-	StatusCode int
-}
-
-func (e *HTTPRequestError) Error() string {
-	return e.Message
-}
-
-func NewHTTPRequestError(msg string, resp *http.Response) error {
-	return &HTTPRequestError{Message: msg, StatusCode: resp.StatusCode}
-}

+ 12 - 1
utils/utils.go

@@ -625,6 +625,13 @@ func (e *JSONError) Error() string {
 	return e.Message
 }
 
+func NewHTTPRequestError(msg string, res *http.Response) error {
+	return &JSONError{
+		Message: msg,
+		Code:    res.StatusCode,
+	}
+}
+
 func (jm *JSONMessage) Display(out io.Writer) error {
 	if jm.Time != 0 {
 		fmt.Fprintf(out, "[%s] ", time.Unix(jm.Time, 0))
@@ -666,7 +673,11 @@ func (sf *StreamFormatter) FormatStatus(format string, a ...interface{}) []byte
 func (sf *StreamFormatter) FormatError(err error) []byte {
 	sf.used = true
 	if sf.json {
-		if b, err := json.Marshal(&JSONMessage{Error: &JSONError{Code: code, Message: err.Error()}, ErrorMessage: err.Error()}); err == nil {
+		jsonError, ok := err.(*JSONError)
+		if !ok {
+			jsonError = &JSONError{Message: err.Error()}
+		}
+		if b, err := json.Marshal(&JSONMessage{Error: jsonError, ErrorMessage: err.Error()}); err == nil {
 			return b
 		}
 		return []byte("{\"error\":\"format error\"}")

+ 1 - 1
utils_test.go

@@ -191,7 +191,7 @@ func TestMergeConfig(t *testing.T) {
 	if len(configUser.Volumes) != 3 {
 		t.Fatalf("Expected 3 volumes, /test1, /test2 and /test3, found %d", len(configUser.Volumes))
 	}
-	for v, _ := range configUser.Volumes {
+	for v := range configUser.Volumes {
 		if v != "/test1" && v != "/test2" && v != "/test3" {
 			t.Fatalf("Expected /test1 or /test2 or /test3, found %s", v)
 		}