Dmytro Shteflyuk created THRIFT-6101:
----------------------------------------
Summary: Ruby CompactProtocol should use Ruby truthiness when
writing booleans
Key: THRIFT-6101
URL: https://issues.apache.org/jira/browse/THRIFT-6101
Project: Thrift
Issue Type: Bug
Reporter: Dmytro Shteflyuk
Assignee: Dmytro Shteflyuk
h3. Problem
The native and pure-Ruby implementations of
{{Thrift::CompactProtocol#write_bool}} interpret values differently.
The pure-Ruby implementation follows normal Ruby truthiness: only {{false}} and
{{nil}} encode as false. The native implementation recognizes only the literal
{{true}} as true, so other truthy Ruby values such as {{0}}, {{1}}, and
arbitrary objects encode as false.
h3. Client impact
Ruby clients can produce different serialized data depending on whether
{{thrift_native}} is loaded. A truthy non-boolean value passed through dynamic
application code, a wrapper, or a hand-written protocol call is encoded as true
in pure-Ruby environments but false in native environments.
This makes the value placed on the wire dependent on the client’s runtime
configuration.
h3. Reproduction
{code:ruby}
require "thrift"
transport = Thrift::MemoryBufferTransport.new
protocol = Thrift::CompactProtocol.new(transport)
protocol.write_bool(0)
puts transport.read_byte
{code}
With {{thrift_native}} loaded, this writes the compact-protocol false marker,
{{0x02}}. Without the native extension, it writes the true marker, {{0x01}},
because {{0}} is truthy in Ruby.
h3. Expected behavior
Native and pure-Ruby CompactProtocol implementations should follow the same
Ruby truthiness semantics. {{false}} and {{nil}} should encode as false;
{{true}}, numbers, and other objects should encode as true.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)