You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Sergey Beryozkin (JIRA)" <ji...@apache.org> on 2017/04/28 16:06:04 UTC

[jira] [Resolved] (CXF-7320) Returned charset is not decoded properly

     [ https://issues.apache.org/jira/browse/CXF-7320?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sergey Beryozkin resolved CXF-7320.
-----------------------------------
       Resolution: Fixed
         Assignee: Sergey Beryozkin
    Fix Version/s: 3.0.14
                   3.1.12
                   3.2.0

> Returned charset is not decoded properly
> ----------------------------------------
>
>                 Key: CXF-7320
>                 URL: https://issues.apache.org/jira/browse/CXF-7320
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 3.1.9, 3.1.10
>            Reporter: Frode Austvik
>            Assignee: Sergey Beryozkin
>             Fix For: 3.2.0, 3.1.12, 3.0.14
>
>
> I have a simple CXF JAX-RS client that calls a simple web service which returns a short text/plain response (using UTF-8). However, when I try to read the entity of this response as a String, I get an exception because the client failed to decode (or maybe unquote is more accurate) the charset parameter properly.
> The client code I'm using is this:
> {code:java}
> 	public static void main(String[] args) {
> 		WebTarget target = ClientBuilder.newClient().target("http://example.org").path("test");
> 		Response response = target.request().get();
> 		System.out.println("status: " + response.getStatus());
> 		System.out.println("type: " + response.getMediaType());
> 		System.out.println("entity: " + response.readEntity(String.class));
> 	}
> {code}
> The output I get is this:
> {noformat}
> status: 200
> type: text/plain;charset="UTF-8"
> 19:58:35.095 [main] ERROR org.apache.cxf.jaxrs.utils.JAXRSUtils - Problem with reading the data, class java.lang.String, ContentType: text/plain;charset="UTF-8".
> Exception in thread "main" javax.ws.rs.client.ResponseProcessingException: Problem with reading the data, class java.lang.String, ContentType: text/plain;charset="UTF-8".
> 	at org.apache.cxf.jaxrs.impl.ResponseImpl.reportMessageHandlerProblem(ResponseImpl.java:439)
> 	at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:379)
> 	at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:320)
> 	at org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(ResponseImpl.java:310)
> 	at com.example.Main.main(Main.java:17)
> Caused by: java.io.UnsupportedEncodingException: "UTF-8"
> 	at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:71)
> 	at java.io.InputStreamReader.<init>(InputStreamReader.java:100)
> 	at org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:302)
> 	at org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:288)
> 	at org.apache.cxf.jaxrs.provider.StringTextProvider.readFrom(StringTextProvider.java:45)
> 	at org.apache.cxf.jaxrs.provider.StringTextProvider.readFrom(StringTextProvider.java:36)
> 	at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1374)
> 	at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:370)
> 	... 3 more
> {noformat}
> This shows that the server returned the content-type as {{text/plain; charset="UTF-8"}} - which is valid according to the RFCs, using quoted-string syntax for the charset value. (I think it recommends not quoting for this case, but quoted is still valid AFAIK, so the client should support it, shouldn't it?)
> The relevant line in [StringTextProvider|https://github.com/apache/cxf/blob/cxf-3.1.10/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/StringTextProvider.java#L45] seems perfectly sensible:
> {code:java}return IOUtils.toString(is, HttpUtils.getEncoding(mt, StandardCharsets.UTF_8.name()));{code}
> In isolation, the [HttpUtils.getEncoding|https://github.com/apache/cxf/blob/cxf-3.1.10/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java#L567] method it uses also seems sensible - however, it assumes that any quoting of the {{MediaType}} parameters has already been decoded, while CXF-4504 says that they shouldn't be and it's up to whatever uses them to do that decoding.
> While I've found an easy workaround for my particular case (in part because this server always uses UTF-8), I still think it the client should handle this so a workaround isn't necessary.
> For reference, the workaround I came up with was inserting this before the {{readEntity}} call:
> {code:java}
> 		if ("\"UTF-8\"".equals(response.getMediaType().getParameters().get("charset"))) {
> 			response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, response.getMediaType().withCharset("UTF-8"));
> 		}
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)