Search code examples
jax-rsresteasy

Why JAX-RS Response.fromResponse(anotherResponse) not copying the entity?


This is part of a JAX-RS server which receives a response from another server and sends the same response back to its client.

This copies the entity from anotherResponse to responseForClient:

Response responseForClient = Response.fromResponse(anotherResponse).entity(anotherResponse.readEntity(InputStream.class)).build();

This doesn't copy the entity:

Response responseForClient = Response.fromResponse(anotherResponse).build();

The second one should also work as JAX-RS Response.fromResponse() should copy the entity also.

Why setting the entity is required?

I am using RestEasy-3.0.


Solution

  • You have to consume the InputStream before calling fromResponse because it only will copy the response. The JAX-RS won't do it automatically, and if you provide the new instance to the client then the entity will not be consumed

    See the documentation of fromResponse

    public static Response.ResponseBuilder fromResponse(Response response)

    Create a new ResponseBuilder by performing a shallow copy of an existing Response. The returned builder has its own response headers but the header values are shared with the original Response instance. The original response entity instance reference is set in the new response builder.

    Note that if the entity is backed by an un-consumed input stream, the reference to the stream is copied. In such case make sure to buffer the entity stream of the original response instance before passing it to this method.


    Buffer the response reading the InputStream to a byte array

    InputStream is = anotherResponse.readEntity(InputStream.class);
    byte[] bytes = IOUtils.toByteArray(is);
    ByteArrayInputStream in= new ByteArrayInputStream (bytes);
    

    This code is equivalent to yours

    Response responseForClient = 
       Response.fromResponse(anotherResponse).entity(in).build()