shashank created CAMEL-25251:
--------------------------------

             Summary: camel-coap - the producer completes the exchange 
successfully when the CoAP server does not respond (timeout or rejected 
request), so the message is silently lost
                 Key: CAMEL-25251
                 URL: https://issues.apache.org/jira/browse/CAMEL-25251
             Project: Camel
          Issue Type: Bug
          Components: camel-coap
            Reporter: shashank


{{CoAPProducer.process}} sends the request with the synchronous {{CoapClient}} 
methods ({{get}}, {{post}}, {{put}}, {{delete}}). These return {{null}} when no 
response is received: the request timed out after the CoAP retransmissions (62 
to 93 s with the defaults {{ACK_TIMEOUT=2s}}, {{ACK_INIT_RANDOM=1.5}}, 
{{MAX_RETRANSMIT=4}}, or the client {{timeout}}), or it was rejected or 
cancelled. The producer only handles a non-null response:

{code:java}
if (response != null) {
    CoAPHelper.convertCoapResponseToMessage(response, exchange.getOut());
}
{code}

so in that case the exchange completes *without an exception*, with the request 
still as its body and no {{CamelCoapResponseCode}} header. A route that posts 
readings to a CoAP server that is down or unreachable reports every message as 
delivered; redelivery, dead letter channels and {{onException}} never see the 
failure.

Two smaller defects in the same method: the {{CamelCoapMethod}} header is 
matched case-sensitively ({{"post"}} matches no case and nothing is sent at 
all, again without an error), while the PING check below it ignores the case.

h3. Reproduction

{code:java}
CoapClient client = new CoapClient("coap://localhost:<unused 
port>/TestResource").setTimeout(500L);  // bound as noAnswerClient

from("direct:start")
    .to("coap://localhost:<unused port>/TestResource?client=#noAnswerClient")
    .to("mock:result");
{code}

{{template.request("direct:start", e -> e.getIn().setBody("Hello"))}} returns 
an exchange without exception (and {{mock:result}} receives "Hello"). The same 
happens without the shared client, after the default retransmission timeout. A 
unit test fails on main.

h3. Proposed fix

When the client returns no response for {{GET}}/{{POST}}/{{PUT}}/{{DELETE}}, 
fail the exchange with {{CamelExchangeException("No response received from CoAP 
server: <uri>")}}. {{PING}} keeps its boolean body (false when there is no 
answer). The method header is upper-cased before the switch, and an unknown 
method fails with {{IllegalArgumentException}} instead of sending nothing. With 
the fix the new test and the whole camel-coap suite pass (74 tests). The 
upgrade guide gets a note because such exchanges now fail.

Affected: 4.14.x, 4.18.x and main (same code since the component was written).

Duplicate check (2026-10-01): JIRA component camel-coap (26 issues) and text 
"coap" with "timeout", "no response", "null response": CAMEL-12030, 
CAMEL-12029, CAMEL-12033 (producer options and response code), nothing about a 
missing response. GitHub pull requests "coap": none about the producer.

_Filed with Claude Code on behalf of allthingssecurity._




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

Reply via email to