Fried Hoeben created CAMEL-6187:
-----------------------------------

             Summary: http4 component should default to charset based on 
content type
                 Key: CAMEL-6187
                 URL: https://issues.apache.org/jira/browse/CAMEL-6187
             Project: Camel
          Issue Type: Bug
          Components: camel-http
    Affects Versions: 2.10.4
            Reporter: Fried Hoeben


HttpProducer determines the charset of an outgoing StringEntity based on an 
Exchange property (Exchange.CHARSET_NAME), using null if that property is not 
set. It also sets the content-type based on the content-type of the camel 
message (this may also contain a character encoding). 
If these two don't match the receiver of the http request will probably not be 
able to parse the message. 

It would be better if the charset of the StringEntity would by default match 
the charset specified in the content-type. Matching these two is done when 
receiving response messages (in HttpProducer.extractResponseBody())...

Suggested fix (in HttpProducer.createRequestEntity()), you could of course also 
do something like 
org.apache.camel.component.http4.helper.HttpHelper.setCharsetFromContentType() 
but my approach uses org.apache.http.entity.ContentType and 
java.nio.charset.Charset instead of trying to determine the correct charset 
itself):

{code}
// be a bit careful with String as any type can most likely be converted to 
String
// so we only do an instanceof check and accept String if the body is really a 
String
// do not fallback to use the default charset as it can influence the request
// (for example application/x-www-form-urlencoded forms being sent)
String charset = IOHelper.getCharsetName(exchange, false);
if (charset == null && contentType != null)
{
    ContentType ct = ContentType.parse(contentType);
    if (ct != null) {
        Charset cs = ct.getCharset();
        if (cs != null)
        {
            charset = cs.name();
        }
    }
}
StringEntity entity = new StringEntity((String) data, charset);
entity.setContentType(contentType);
answer = entity;
{code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to