From a7d9ac3860bcfb12d9e60b6e5dfe4f4654cc0c5a Mon Sep 17 00:00:00 2001 From: jansupol Date: Wed, 24 Jun 2020 19:31:32 +0200 Subject: [PATCH] Response.hasEntity to return true if buffered after readEntity Signed-off-by: jansupol --- .../jersey/client/ClientResponseTest.java | 63 +++++++++++++++++++ .../internal/InboundMessageContext.java | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 core-client/src/test/java/org/glassfish/jersey/client/ClientResponseTest.java diff --git a/core-client/src/test/java/org/glassfish/jersey/client/ClientResponseTest.java b/core-client/src/test/java/org/glassfish/jersey/client/ClientResponseTest.java new file mode 100644 index 0000000000..7456edb6db --- /dev/null +++ b/core-client/src/test/java/org/glassfish/jersey/client/ClientResponseTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package org.glassfish.jersey.client; + +import org.glassfish.jersey.message.internal.InboundMessageContext; +import org.junit.Assert; +import org.junit.Test; + +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ReaderInterceptor; +import java.io.InputStream; + +public class ClientResponseTest { + + @Test + public void testHasEntityWhenNoEntity() { + final InboundMessageContext inboundMessageContext = new InboundMessageContext(new ClientConfig()) { + @Override + protected Iterable getReaderInterceptors() { + return null; + } + }; + + Assert.assertFalse(inboundMessageContext.hasEntity()); + + inboundMessageContext.bufferEntity(); + Assert.assertFalse(inboundMessageContext.hasEntity()); + } + + @Test + public void testHasEntity() { + final ClientRequestFilter abortFilter = requestContext -> requestContext.abortWith(Response.ok("hello").build()); + try (Response r = ClientBuilder.newClient().register(abortFilter).target("http://localhost:8080").request().get()) { + Assert.assertTrue(r.hasEntity()); + + r.bufferEntity(); + Assert.assertTrue(r.hasEntity()); + + final String s = r.readEntity(String.class); + Assert.assertTrue(r.hasEntity()); + + final InputStream bufferedEntityStream = r.readEntity(InputStream.class); + Assert.assertNotNull(bufferedEntityStream); + Assert.assertTrue(r.hasEntity()); + } + } +} diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java index f729852020..70b1805b9b 100644 --- a/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java +++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/InboundMessageContext.java @@ -780,7 +780,7 @@ public boolean hasEntity() { entityContent.ensureNotClosed(); try { - return !entityContent.isEmpty(); + return entityContent.isBuffered() || !entityContent.isEmpty(); } catch (IllegalStateException ex) { // input stream has been closed. return false;