Henrik created CAMEL-25085:
------------------------------
Summary: Rest DSL: under json/xml binding a response without
Content-Type ignores the verb's produces
Key: CAMEL-25085
URL: https://issues.apache.org/jira/browse/CAMEL-25085
Project: Camel
Issue Type: Bug
Components: camel-core
Affects Versions: 4.22.1, 4.22.0, 4.18.4
Reporter: Henrik
Fix For: 4.18.5, 4.22.2, 4.23.0
h3. Summary
With {{bindingMode(json)}} set in the rest configuration, a verb that declares
a non-json {{produces}} and returns a body without a Content-Type header gets
{{{}Content-Type: application/json{}}}, and its body is passed through the json
marshaller. For a binary body the marshalling fails and the client receives an
empty HTTP 500.
{code:java}
restConfiguration().bindingMode(RestBindingMode.json);
rest("/files").get("/{name}")
.produces("application/octet-stream")
.to("direct:download"); // sets an InputStream body, no Content-Type
{code}
4.21.0 answered {{200 application/octet-stream}} with the file. 4.22.x answers
{{{}500{}}}.
h3. Cause
CAMEL-24001 reordered {{RestBindingAdvice.ensureHeaderContentType}} so that the
{{{}isJson{}}}/{{{}isXml{}}} flags are checked before the declared
{{{}produces{}}}. When neither Accept, the Content-Type nor {{produces}}
mentions json or xml, {{marshal}} derives {{isJson}} from the binding mode
alone, so the flag is true for every verb under json binding and the declared
media type is never used.
The same applies to a {{produces("text/plain")}} verb called with {{{}Accept:
application/json{}}}: before 4.18.4/4.22.0 it answered {{{}text/plain{}}}, now
it answers {{application/json}} with a json-quoted body.
h3. Proposed fix
When {{produces}} is set, pick the Content-Type from its entries: the first
json entry if {{{}isJson{}}}, else the first xml entry if {{{}isXml{}}}, else
the first entry. Only fall back to
{{{}application/json{}}}/{{{}application/xml{}}} when {{produces}} is null.
This keeps both CAMEL-24001 fixes (no Content-Type on body-less responses, a
single media type instead of a raw multi-value {{{}produces{}}}).
h3. Found in
On the 4.21.0 -> 4.22.1 upgrade: two binary download endpoints started
answering an empty 500, with nothing logged.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)