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
This commit is contained in:
Boaz Shuster
2018-04-10 09:29:42 +00:00
committed by Atomic Bot
parent 1700f2b238
commit 864b9c06c0
2 changed files with 56 additions and 2 deletions

View File

@ -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

View File

@ -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())
}
}
}