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)

Reply via email to