Dmytro Shteflyuk created THRIFT-6119:
----------------------------------------

             Summary: Ruby MultiplexedProtocol diagnostics should preserve the 
service name
                 Key: THRIFT-6119
                 URL: https://issues.apache.org/jira/browse/THRIFT-6119
             Project: Thrift
          Issue Type: Bug
          Components: Ruby - Library
            Reporter: Dmytro Shteflyuk
            Assignee: Dmytro Shteflyuk


h3. Problem

{{Thrift::MultiplexedProtocol#to_s}} contains an assignment while formatting 
its diagnostic string:

{code:ruby}
"multiplexed(#{@[email protected]_s})"
{code}

Calling {{to_s}} therefore replaces the configured multiplexed service name 
with the underlying protocol's diagnostic label. For example, a protocol 
configured for {{Calculator}} is changed to {{binary(memory)}}. The next call 
or oneway message is then written with the wrong service prefix.

h3. Client impact

Logging, string interpolation, or error reporting that formats a multiplexed 
protocol can change later RPC behavior. Requests that should be addressed to a 
configured service such as {{Calculator:add}} are instead sent as 
{{binary(memory):add}}, so the server cannot route them to the intended 
multiplexed service.

The effect persists for the lifetime of that protocol instance because the 
original service name has been overwritten.

h3. Reproduction

{code:ruby}
require "thrift"

transport = Thrift::MemoryBufferTransport.new
protocol = Thrift::MultiplexedProtocol.new(
  Thrift::BinaryProtocol.new(transport),
  "Calculator"
)

diagnostic = protocol.to_s
protocol.write_message_begin("add", Thrift::MessageTypes::CALL, 7)

name, type, seqid = Thrift::BinaryProtocol.new(transport).read_message_begin

puts "to_s=#{diagnostic.inspect}"
puts "wire_name=#{name.inspect} type=#{type} seqid=#{seqid}"
{code}

Current output:

{noformat}
to_s="multiplexed(binary(memory))"
wire_name="binary(memory):add" type=1 seqid=7
{noformat}

The expected wire name is {{Calculator:add}}.

h3. Expected behavior

{{MultiplexedProtocol#to_s}} should be side-effect-free. Repeated diagnostic 
formatting must leave the configured service name unchanged, and later messages 
must continue using the original service prefix on the wire.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to