From 864b9c06c08b1c1649c5b845029404f7c275408d Mon Sep 17 00:00:00 2001 From: Boaz Shuster Date: Tue, 10 Apr 2018 09:29:42 +0000 Subject: Unescape characters in inspect JSON format output This patch changes the way the inspect command output is displayed on the screen when the format is set to JSON. Note: if the output is redirected to a file the output is *not* escaped. For example, before this commit if you run: $ sudo podman inspect --format "json" daveimg [ { ... "Author": "Dave \u003cdave@corp.io\u003e", } ... ] with this patch the output will be: [ { ... "Author": "Dave ", } ... ] Signed-off-by: Boaz Shuster Closes: #602 Approved by: mheon --- cmd/podman/formats/formats.go | 16 +++++++++++++-- cmd/podman/formats/formats_test.go | 42 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 cmd/podman/formats/formats_test.go (limited to 'cmd/podman') diff --git a/cmd/podman/formats/formats.go b/cmd/podman/formats/formats.go index bfd773c45..3da0ea385 100644 --- a/cmd/podman/formats/formats.go +++ b/cmd/podman/formats/formats.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "os" "strings" "text/tabwriter" @@ -55,12 +56,23 @@ type YAMLStruct struct { Output interface{} } +func setJSONFormatEncoder(isTerminal bool, w io.Writer) *json.Encoder { + enc := json.NewEncoder(w) + enc.SetIndent("", " ") + if isTerminal { + enc.SetEscapeHTML(false) + } + return enc +} + // Out method for JSON Arrays func (j JSONStructArray) Out() error { - data, err := json.MarshalIndent(j.Output, "", " ") - if err != nil { + buf := bytes.NewBuffer(nil) + enc := setJSONFormatEncoder(terminal.IsTerminal(int(os.Stdout.Fd())), buf) + if err := enc.Encode(j.Output); err != nil { return err } + data := buf.Bytes() // JSON returns a byte array with a literal null [110 117 108 108] in it // if it is passed empty data. We used bytes.Compare to see if that is diff --git a/cmd/podman/formats/formats_test.go b/cmd/podman/formats/formats_test.go new file mode 100644 index 000000000..fc7f01f93 --- /dev/null +++ b/cmd/podman/formats/formats_test.go @@ -0,0 +1,42 @@ +package formats + +import ( + "bytes" + "strings" + "testing" + + "github.com/projectatomic/libpod/pkg/inspect" +) + +func TestSetJSONFormatEncoder(t *testing.T) { + tt := []struct { + name string + imageData *inspect.ImageData + expected string + isTerminal bool + }{ + { + name: "HTML tags are not escaped", + imageData: &inspect.ImageData{Author: "dave "}, + expected: `"Author": "dave "`, + isTerminal: true, + }, + { + name: "HTML tags are escaped", + imageData: &inspect.ImageData{Author: "dave "}, + expected: `"Author": "dave \u003cdave@corp.io\u003e"`, + isTerminal: false, + }, + } + + for _, tc := range tt { + buf := bytes.NewBuffer(nil) + enc := setJSONFormatEncoder(tc.isTerminal, buf) + if err := enc.Encode(tc.imageData); err != nil { + t.Errorf("test %#v failed encoding: %s", tc.name, err) + } + if !strings.Contains(buf.String(), tc.expected) { + t.Errorf("test %#v expected output to contain %#v. Output:\n%v\n", tc.name, tc.expected, buf.String()) + } + } +} -- cgit v1.2.3-54-g00ecf