diff --git a/commands/http/handler.go b/commands/http/handler.go index d6e988887787..91aa7afbcfbd 100644 --- a/commands/http/handler.go +++ b/commands/http/handler.go @@ -71,6 +71,10 @@ var mimeTypes = map[string]string{ cmds.Text: "text/plain", } +var errorMimeTypes = map[string]string{ + cmds.Protobuf: "application/json", +} + type ServerConfig struct { // Headers is an optional map of headers that is written out. Headers map[string][]string @@ -206,6 +210,12 @@ func guessMimeType(res cmds.Response) (string, error) { return "", errors.New("no encoding option set") } + if res.Error() != nil { + if m, ok := errorMimeTypes[enc]; ok { + return m, nil + } + } + if m, ok := mimeTypes[enc]; ok { return m, nil } diff --git a/core/commands/object/object.go b/core/commands/object/object.go index 240d16428c35..dbbf6ad84175 100644 --- a/core/commands/object/object.go +++ b/core/commands/object/object.go @@ -223,15 +223,25 @@ This command outputs data in the following encodings: Type: Node{}, Marshalers: cmds.MarshalerMap{ cmds.Protobuf: func(res cmds.Response) (io.Reader, error) { - node := res.Output().(*Node) - object, err := deserializeNode(node) - if err != nil { - return nil, err - } - - marshaled, err := object.Marshal() - if err != nil { - return nil, err + var marshaled []byte + + if res.Error() != nil { + output, err := json.Marshal(res.Error()) + if err != nil { + return nil, err + } + marshaled = append(output, '\n') + } else { + node := res.Output().(*Node) + object, err := deserializeNode(node) + if err != nil { + return nil, err + } + output, err := object.Marshal() + if err != nil { + return nil, err + } + marshaled = output } return bytes.NewReader(marshaled), nil },