[
https://issues.apache.org/jira/browse/CAMEL-26136?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18136566#comment-18136566
]
Claus Ibsen commented on CAMEL-26136:
-------------------------------------
PR: https://github.com/apache/camel/pull/28914
All four points are fixed. (1)+(2) With the default codec the consumer converts
a non-String reply to a String, as textline does. A failed exchange replies the
muted exception text. When no reply can be built, the TCP channel is closed.
(3) useByteBuf uses getMandatoryBody, also for a reply set as the out message.
(4) With sync=false, ClientChannelHandler ignores received messages. Before the
fix, it also ran the producer callback a second time. camel-netty-http is not
affected.
_Claude Code on behalf of Claus Ibsen (davsclaus)_
> camel-netty - with the default codec a failed exchange or a non-String reply
> sends no reply and the client waits, and useByteBuf=true skips a File, Map or
> POJO body silently
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-26136
> URL: https://issues.apache.org/jira/browse/CAMEL-26136
> Project: Camel
> Issue Type: Bug
> Components: camel-netty
> Reporter: Claus Ibsen
> Assignee: Claus Ibsen
> Priority: Major
> Fix For: 4.24.0
>
>
> Found while adding the catalog body types of netty (CAMEL-24961, PR #28395).
> h4. 1. A failed exchange gets no reply with the default codec
> When the exchange fails, {{ServerChannelHandler.getResponseBody}} (main
> 2a465aa4814c, line 224) returns the muted stand-in {{Exception}} (added by
> CAMEL-25902) or the route's exception as the reply. With the default codec
> (no {{textline}}, {{allowDefaultCodec=true}}) the only encoder is the String
> encoder, which cannot write an {{Exception}}, so the write fails,
> {{ServerResponseFutureListener}} (line 51) only logs it, and the client gets
> nothing: the producer fails with {{ReadTimeoutException}}. With
> {{textline=true}} the error is converted to a String and replied. Checked on
> 4.24.0-SNAPSHOT with real TCP sockets.
> Proposed: convert the exception reply to a String (as textline does) when the
> String codec is in use, or close the channel so the client does not wait.
> h4. 2. A reply that is not a String is dropped and the client waits
> With the default codec a reply of bytes, a stream, a file, a Map or a POJO is
> passed to the String encoder in {{ServerChannelHandler.sendResponse}} (line
> 182), which does not encode it; the write fails and
> {{ServerResponseFutureListener}} (line 51) logs a WARN. The channel stays
> open and the client waits for a reply, forever when {{requestTimeout}} is not
> set. Checked on 4.24.0-SNAPSHOT with real TCP sockets.
> Proposed: convert the reply to a String (the codec's type) before writing,
> and fail with a clear error when it cannot be converted, closing the channel.
> h4. 3. With useByteBuf=true a File, Map or POJO body is skipped silently
> {{NettyPayloadHelper.getIn}} (line 46) uses the non-mandatory
> {{getBody(ByteBuf.class)}}, which gives null for a File, a Map or a POJO.
> {{NettyProducer.process}} (line 232) then logs "No payload to send" and
> completes the exchange without error, so nothing is sent; the same helper is
> used for the consumer reply (ServerChannelHandler line 230). Checked on
> 4.24.0-SNAPSHOT with real TCP sockets.
> Proposed: use {{getMandatoryBody(ByteBuf.class)}} so a body that cannot be
> converted fails the exchange.
> h4. 4. With sync=false the producer still sets the server's reply on the
> exchange
> With {{sync=false}} {{NettyProducer}} (line 391) calls the callback as soon
> as the request is written, but {{ClientChannelHandler.channelRead0}} (line
> 189) still sets a reply that arrives later as the out (or in) message of the
> same exchange, while the route has already moved on with it. The body seen
> after the producer depends on timing. Checked on 4.24.0-SNAPSHOT with real
> TCP sockets.
> Proposed: ignore (or log) messages received in {{ClientChannelHandler}} when
> {{sync=false}}.
> _Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)