Claus Ibsen created CAMEL-26182:
-----------------------------------

             Summary: camel-mina - with sync=false an InOut producer loses the 
body and headers, and the consumer writes a reply even with sync=false
                 Key: CAMEL-26182
                 URL: https://issues.apache.org/jira/browse/CAMEL-26182
             Project: Camel
          Issue Type: Bug
          Components: camel-mina
            Reporter: Claus Ibsen
             Fix For: 4.24.0


Found while adding the catalog body types of mina (CAMEL-24961, PR #28413).

h4. 1. With sync=false and InOut, the body and headers are lost after the 
producer

{{MinaProducer.process}} (main 2a465aa4814c, line 121) always calls 
{{maybeDisconnectOnDone}}, which at line 215 calls {{exchange.getOut()}} when 
the exchange is out capable. With {{sync=false}} no reply is set, so this 
creates an empty out message: after the producer the body is null and the 
headers are gone. Checked on 4.24.0-SNAPSHOT with local mina TCP sockets, an 
InOut exchange sent to {{mina:tcp://localhost:port?sync=false}}.

Proposed: read the header with {{exchange.getMessage()}} (or only look at the 
out message when {{exchange.hasOut()}}).

h4. 2. The consumer ignores sync=false and always writes the body back

{{MinaConsumer.ReceiveHandler.messageReceived}} (line 476 to 478) writes the 
response (the out or in body) to the session whenever it is not null; it never 
looks at {{sync}}. With {{sync=false}} (TCP and UDP) the client gets the 
request body echoed back. Checked on 4.24.0-SNAPSHOT with local mina TCP and 
UDP sockets.

Proposed: write a reply only when {{sync=true}}.

h4. 3. The textline consumer writes a byte[] or stream reply as its toString

The producer converts the body to a String for {{textline=true}} 
({{MinaProducer}} line 146 to 148), but the consumer passes the reply as is to 
{{MinaHelper.writeBody}} ({{MinaConsumer}} line 478), and the MINA 
{{TextLineEncoder}} calls {{toString()}}: a byte[] reply arrives as 
{{\[B@...}}, a stream reply as the class name of the stream. Checked on 
4.24.0-SNAPSHOT with a textline consumer whose route sets a byte[] body.

Proposed: convert the reply to a String in the consumer when textline is set, 
as the producer does.

h4. 4. A byte[] reply fails to decode under the default object codec

With the default object serialization codec, a consumer whose route replies 
with a byte[] ({{MinaHelper.writeBody}}, line 50 to 63, writes it as is) makes 
the producer fail to decode the reply with "invalid type code: 62". Only a 
String passes both ways without {{objectCodecPattern}}. Checked on 
4.24.0-SNAPSHOT with local mina TCP sockets, default codec, a route that sets a 
byte[] reply.

Proposed: find out why the byte[] does not round-trip in the object codec and 
fix it, or document that the reply must be a String or a class allowed by 
objectCodecPattern.

_Claude Code on behalf of davsclaus_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to