Commit aec37e7c authored by Russ Cox's avatar Russ Cox

encoding/json: encode \t as \t instead of \u0009

Shorter and easier to read form for a common character.

LGTM=bradfitz
R=adg, bradfitz
CC=golang-codereviews, zimmski
https://golang.org/cl/162340043
parent 456df7c2
...@@ -805,6 +805,9 @@ func (e *encodeState) string(s string) (int, error) { ...@@ -805,6 +805,9 @@ func (e *encodeState) string(s string) (int, error) {
case '\r': case '\r':
e.WriteByte('\\') e.WriteByte('\\')
e.WriteByte('r') e.WriteByte('r')
case '\t':
e.WriteByte('\\')
e.WriteByte('t')
default: default:
// This encodes bytes < 0x20 except for \n and \r, // This encodes bytes < 0x20 except for \n and \r,
// as well as <, > and &. The latter are escaped because they // as well as <, > and &. The latter are escaped because they
...@@ -878,9 +881,12 @@ func (e *encodeState) stringBytes(s []byte) (int, error) { ...@@ -878,9 +881,12 @@ func (e *encodeState) stringBytes(s []byte) (int, error) {
case '\r': case '\r':
e.WriteByte('\\') e.WriteByte('\\')
e.WriteByte('r') e.WriteByte('r')
case '\t':
e.WriteByte('\\')
e.WriteByte('t')
default: default:
// This encodes bytes < 0x20 except for \n and \r, // This encodes bytes < 0x20 except for \n and \r,
// as well as < and >. The latter are escaped because they // as well as <, >, and &. The latter are escaped because they
// can lead to security holes when user-controlled strings // can lead to security holes when user-controlled strings
// are rendered into JSON and served to some browsers. // are rendered into JSON and served to some browsers.
e.WriteString(`\u00`) e.WriteString(`\u00`)
......
...@@ -478,3 +478,55 @@ func TestEncodePointerString(t *testing.T) { ...@@ -478,3 +478,55 @@ func TestEncodePointerString(t *testing.T) {
t.Fatalf("*N = %d; want 42", *back.N) t.Fatalf("*N = %d; want 42", *back.N)
} }
} }
var encodeStringTests = []struct {
in string
out string
}{
{"\x00", `"\u0000"`},
{"\x01", `"\u0001"`},
{"\x02", `"\u0002"`},
{"\x03", `"\u0003"`},
{"\x04", `"\u0004"`},
{"\x05", `"\u0005"`},
{"\x06", `"\u0006"`},
{"\x07", `"\u0007"`},
{"\x08", `"\u0008"`},
{"\x09", `"\t"`},
{"\x0a", `"\n"`},
{"\x0b", `"\u000b"`},
{"\x0c", `"\u000c"`},
{"\x0d", `"\r"`},
{"\x0e", `"\u000e"`},
{"\x0f", `"\u000f"`},
{"\x10", `"\u0010"`},
{"\x11", `"\u0011"`},
{"\x12", `"\u0012"`},
{"\x13", `"\u0013"`},
{"\x14", `"\u0014"`},
{"\x15", `"\u0015"`},
{"\x16", `"\u0016"`},
{"\x17", `"\u0017"`},
{"\x18", `"\u0018"`},
{"\x19", `"\u0019"`},
{"\x1a", `"\u001a"`},
{"\x1b", `"\u001b"`},
{"\x1c", `"\u001c"`},
{"\x1d", `"\u001d"`},
{"\x1e", `"\u001e"`},
{"\x1f", `"\u001f"`},
}
func TestEncodeString(t *testing.T) {
for _, tt := range encodeStringTests {
b, err := Marshal(tt.in)
if err != nil {
t.Errorf("Marshal(%q): %v", tt.in, err)
continue
}
out := string(b)
if out != tt.out {
t.Errorf("Marshal(%q) = %#q, want %#q", tt.in, out, tt.out)
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment