[ 
https://issues.apache.org/jira/browse/CAMEL-24594?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18110761#comment-18110761
 ] 

Claus Ibsen commented on CAMEL-24594:
-------------------------------------

h4. Investigation finding: core platform-http already returns 500 (not a silent 
200)

I could not reproduce the silent HTTP 200 on core Apache Camel 
{{camel-platform-http-vertx}}. A simulated reproducer (REST DSL 
{{bindingMode(json)}}, a response POJO whose getter throws so Jackson always 
fails to marshal, independent of java.time/JavaTimeModule) shows core Camel 
returns *HTTP 500 with an empty body* - which is the correct/desired behaviour 
(empty because {{muteException}} is enabled by default, so nothing is leaked).

Why it works in core:
* {{MarshalProcessor}} sets the exception on the exchange when marshalling 
fails.
* {{org.apache.camel.support.http.HttpUtil#determineResponseCode}} (in 
*core/camel-support*) maps {{exchange.isFailed()}} -> 500. This is shared by 
*all* core HTTP consumers: camel-platform-http-vertx, camel-netty-http, 
camel-http-common (servlet/jetty), camel-undertow.
* Both pieces of logic were already present in the *camel-4.22.0* tag that the 
reporter tested.

A second test disables {{muteException}} and asserts the leaked stacktrace 
contains {{RestBindingAdvice}} + {{MarshalProcessor}} + the getter's message, 
proving the 500 originates specifically in the REST DSL binding's 
response-marshal step (which runs after routing, so it is intentionally not 
routed through onException).

Conclusion: the silent-200 reported in camel-quarkus#9077 appears to be 
*camel-quarkus specific* - its platform-http integration 
({{QuarkusPlatformHttpConsumer}}) has its own response-writing path that does 
not go through {{HttpUtil#determineResponseCode}} / does not honour 
{{isFailed()}} for this post-routing exception.

Suggested next steps:
# Track the actual HTTP-200 defect in camel-quarkus#9077 (their consumer), plus 
the separate {{autoDiscoverObjectMapper}} default discussion there.
# Optionally harden {{RestBindingAdvice#marshal}} to set 
{{HTTP_RESPONSE_CODE=500}} explicitly on marshal failure (mirroring the 
existing 400-on-request-failure precedent), so every consumer is robust 
regardless of whether it inspects {{isFailed()}}. This does not change the core 
vertx result (already 500).

Regression guard tests added at 
{{camel-platform-http-vertx/.../VertxRestBindingMarshalFailureTest}}.

_Analysis and tests by Claude Code on behalf of Claus Ibsen (davsclaus). Please 
verify before acting._

> RestBindingAdvice response marshalling failure is silently swallowed
> --------------------------------------------------------------------
>
>                 Key: CAMEL-24594
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24594
>             Project: Camel
>          Issue Type: Bug
>            Reporter: James Netherton
>            Priority: Minor
>             Fix For: 4.23.0
>
>
> With bindingMode(json) on the REST DSL, if Jackson cannot marshal the 
> response body, the caller receives HTTP 200 with an empty body and 
> Content-Type: text/plain; charset=utf-8. No error is logged, no exception 
> reaches the route's error handler, and the status code stays 200.
> The silent 200 is the actual problem: a serialization failure is 
> indistinguishable from a successful empty response, so a client (or a browser 
> app) just sees "no data" and everything downstream fails in confusing ways. 
> We lost a full day to this after a platform upgrade.
> More details with reproducer can be found here:
> https://github.com/apache/camel-quarkus/issues/9077



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

Reply via email to