Hi

I think you are looking at some old code, the current code on master
does not match, and it seems as supporting using the representation
as-is.

I suggest to double check your findings.

On Fri, Nov 21, 2014 at 8:26 PM, sandp <sandeepred...@gmail.com> wrote:
> Looks like there's a bug in file*
> org.apache.camel.component.restlet.DefaultRestletBinding.java*
>
>
> *Method starts at line number 292*
> public void populateExchangeFromRestletResponse(Exchange exchange, Response
> response) throws Exception {
>         for (Map.Entry<String, Object> entry :
> response.getAttributes().entrySet()) {
>             String key = entry.getKey();
>             Object value = entry.getValue();
>             if (!headerFilterStrategy.applyFilterToExternalHeaders(key,
> value, exchange)) {
>                 exchange.getOut().setHeader(key, value);
>                 LOG.debug("Populate exchange from Restlet response header:
> {} value: {}", key, value);
>             }
>         }
>
>         // set response code
>         int responseCode = response.getStatus().getCode();
>         exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE,
> responseCode);
>
>         // set restlet response as header so end user have access to it if
> needed
>         exchange.getOut().setHeader(RestletConstants.RESTLET_RESPONSE,
> response);
>
>         if (response.getEntity() != null) {
>             // get content type
>             MediaType mediaType = response.getEntity().getMediaType();
>             if (mediaType != null) {
>                 LOG.debug("Setting the Content-Type to be {}",
> mediaType.toString());
>                 exchange.getOut().setHeader(Exchange.CONTENT_TYPE,
> mediaType.toString());
>             }
>             if (mediaType != null &&
> mediaType.equals(MediaType.APPLICATION_OCTET_STREAM)) {
>                 exchange.getOut().setBody(response.getEntity().getStream());
>             } *else {
>                 // get content text
>   Line 320              String text = response.getEntity().getText();
>   Line 321                 LOG.debug("Populate exchange from Restlet
> response: {}", text);
>   Line 322                 exchange.getOut().setBody(text);
>             }*
>         }
>
>         // preserve headers from in by copying any non existing headers
>         // to avoid overriding existing headers with old values
>         MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(),
> false);
>     }
>
> The bolded else part above gets the text from the entity in the Response and
> sets it on the OUT Message of the Exchange. But, at this point the
> response.getEntity() is of type InputRepresentation with MediaType.TEXT_XML
> and GZIP encoded, so why not pass the entity along as is? When its converted
> to a  String its tampered and lost (remember its encoded type is GZIP).
>
> *To make it work,* we could change the code to something like:
> replace lines 320 - 322 with
>   *exchange.getOut().setBody(response.getEntity());*
>
> *
> On the client side, decode the response  *
> InputRepresentation representation =
> (InputRepresentation)resultEndpoint.getExchanges().get(0).getIn().getBody();
>  Representation representationDecoded=  new
> DecodeRepresentation(representation);
> String decodedString = representationDecoded.getText(); // will contain the
> decoded response
>
>
>
>
>
>
>
>
> --
> View this message in context: 
> http://camel.465427.n5.nabble.com/Camel-Restlet-2-14-0-DecodeRepresentation-tp5759382p5759484.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cib...@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/

Reply via email to