THRIFT-2288 Go impl of Thrift JSON protocol wrongly writes/expects true/false for bools
Patch: Jens Geyer
diff --git a/lib/go/thrift/json_protocol.go b/lib/go/thrift/json_protocol.go
index 5a432c3..7a5e16e 100644
--- a/lib/go/thrift/json_protocol.go
+++ b/lib/go/thrift/json_protocol.go
@@ -158,7 +158,12 @@
}
func (p *TJSONProtocol) WriteBool(b bool) error {
- return p.OutputBool(b)
+ //return p.OutputBool(b) - not for Thrift JSON
+ if b {
+ return p.WriteI32(1)
+ } else {
+ return p.WriteI32(0)
+ }
}
func (p *TJSONProtocol) WriteByte(b byte) error {
@@ -325,45 +330,8 @@
}
func (p *TJSONProtocol) ReadBool() (bool, error) {
- var value bool
- if err := p.ParsePreValue(); err != nil {
- return value, err
- }
- b, _ := p.reader.Peek(len(JSON_FALSE))
- if len(b) > 0 {
- switch b[0] {
- case JSON_TRUE[0]:
- if string(b[0:len(JSON_TRUE)]) == string(JSON_TRUE) {
- p.reader.Read(b[0:len(JSON_TRUE)])
- value = true
- } else {
- e := fmt.Errorf("Expected \"true\" but found: %s", string(b))
- return value, NewTProtocolExceptionWithType(INVALID_DATA, e)
- }
- break
- case JSON_FALSE[0]:
- if string(b[0:len(JSON_FALSE)]) == string(JSON_FALSE) {
- p.reader.Read(b[0:len(JSON_FALSE)])
- value = false
- } else {
- e := fmt.Errorf("Expected \"false\" but found: %s", string(b))
- return value, NewTProtocolExceptionWithType(INVALID_DATA, e)
- }
- break
- case JSON_NULL[0]:
- if string(b[0:len(JSON_NULL)]) == string(JSON_NULL) {
- p.reader.Read(b[0:len(JSON_NULL)])
- value = false
- } else {
- e := fmt.Errorf("Expected \"null\" but found: %s", string(b))
- return value, NewTProtocolExceptionWithType(INVALID_DATA, e)
- }
- default:
- e := fmt.Errorf("Expected \"true\", \"false\", or \"null\" but found: %s", string(b))
- return value, NewTProtocolExceptionWithType(INVALID_DATA, e)
- }
- }
- return value, p.ParsePostValue()
+ value, err := p.ReadI32();
+ return (value != 0), err
}
func (p *TJSONProtocol) ReadByte() (byte, error) {
diff --git a/lib/go/thrift/json_protocol_test.go b/lib/go/thrift/json_protocol_test.go
index cb626cc..8542a96 100644
--- a/lib/go/thrift/json_protocol_test.go
+++ b/lib/go/thrift/json_protocol_test.go
@@ -40,11 +40,17 @@
t.Fatalf("Unable to write %s value %v due to error flushing: %s", thetype, value, e.Error())
}
s := trans.String()
- if s != fmt.Sprint(value) {
- t.Fatalf("Bad value for %s %v: %s", thetype, value, s)
+ expected := ""
+ if value {
+ expected = "1"
+ } else {
+ expected = "0"
}
- v := false
- if err := json.Unmarshal([]byte(s), &v); err != nil || v != value {
+ if s != expected {
+ t.Fatalf("Bad value for %s %v: %s expected", thetype, value, s)
+ }
+ v := -1
+ if err := json.Unmarshal([]byte(s), &v); err != nil || (v != 0) != value {
t.Fatalf("Bad json-decoded value for %s %v, wrote: '%s', expected: '%v'", thetype, value, s, v)
}
trans.Reset()
@@ -58,9 +64,9 @@
trans := NewTMemoryBuffer()
p := NewTJSONProtocol(trans)
if value {
- trans.Write(JSON_TRUE)
+ trans.Write([]byte{'1'}) // not JSON_TRUE
} else {
- trans.Write(JSON_FALSE)
+ trans.Write([]byte{'0'}) // not JSON_FALSE
}
trans.Flush()
s := trans.String()
@@ -71,8 +77,9 @@
if v != value {
t.Fatalf("Bad value for %s value %v, wrote: %v, received: %v", thetype, value, s, v)
}
- if err := json.Unmarshal([]byte(s), &v); err != nil || v != value {
- t.Fatalf("Bad json-decoded value for %s %v, wrote: '%s', expected: '%v'", thetype, value, s, v)
+ vv := -1
+ if err := json.Unmarshal([]byte(s), &vv); err != nil || (vv != 0) != value {
+ t.Fatalf("Bad json-decoded value for %s %v, wrote: '%s', expected: '%v'", thetype, value, s, vv)
}
trans.Reset()
trans.Close()