You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Fried Hoeben (JIRA)" <ji...@apache.org> on 2013/03/20 13:03:16 UTC

[jira] [Created] (CAMEL-6187) http4 component should default to charset based on content type

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