aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoaz Shuster <ripcurld.github@gmail.com>2018-04-10 09:29:42 +0000
committerAtomic Bot <atomic-devel@projectatomic.io>2018-04-10 14:05:25 +0000
commit864b9c06c08b1c1649c5b845029404f7c275408d (patch)
treece0a4c2fa296dfd2787e12d6a7bbc5389d137e19
parent1700f2b2381d9665810ed4764d0fe357150c5978 (diff)
downloadpodman-864b9c06c08b1c1649c5b845029404f7c275408d.tar.gz
podman-864b9c06c08b1c1649c5b845029404f7c275408d.tar.bz2
podman-864b9c06c08b1c1649c5b845029404f7c275408d.zip
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 <dave@corp.io>", } ... ] Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com> Closes: #602 Approved by: mheon
-rw-r--r--cmd/podman/formats/formats.go16
-rw-r--r--cmd/podman/formats/formats_test.go42
2 files changed, 56 insertions, 2 deletions
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 <dave@corp.io>"},
+ expected: `"Author": "dave <dave@corp.io>"`,
+ isTerminal: true,
+ },
+ {
+ name: "HTML tags are escaped",
+ imageData: &inspect.ImageData{Author: "dave <dave@corp.io>"},
+ 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())
+ }
+ }
+}