This is an automated email from the ASF dual-hosted git repository. reta pushed a commit to branch 3.6.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 0d3d1fb519d764063bfdcc27c0c01c6d0e2cc89a Author: gopackgo90 <[email protected]> AuthorDate: Fri Apr 10 10:12:49 2026 -0500 CXF-9210 Read JAX-RS requests with CacheControlFeature enabled and no Cache-Control header (#3026) (cherry picked from commit a63e031711888d5aa2fa8341812ce3f235288c5e) --- .../cache/CacheControlClientReaderInterceptor.java | 3 +++ .../cxf/jaxrs/client/cache/ClientCacheTest.java | 28 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/cache/CacheControlClientReaderInterceptor.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/cache/CacheControlClientReaderInterceptor.java index e9b63c2f41..3da097aa99 100644 --- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/cache/CacheControlClientReaderInterceptor.java +++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/cache/CacheControlClientReaderInterceptor.java @@ -88,6 +88,9 @@ public class CacheControlClientReaderInterceptor implements ReaderInterceptor { } final MultivaluedMap<String, String> responseHeaders = context.getHeaders(); final String cacheControlHeader = responseHeaders.getFirst(HttpHeaders.CACHE_CONTROL); + if (cacheControlHeader == null) { + return context.proceed(); + } final CacheControl cacheControl = CacheControl.valueOf(cacheControlHeader); byte[] cachedBytes = null; diff --git a/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/cache/ClientCacheTest.java b/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/cache/ClientCacheTest.java index 5b823832b8..5e62419c7e 100644 --- a/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/cache/ClientCacheTest.java +++ b/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/cache/ClientCacheTest.java @@ -50,6 +50,7 @@ import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; public class ClientCacheTest { @@ -204,6 +205,25 @@ public class ClientCacheTest { } } + @Test + public void testGetNonCacheBook() { + try (CacheControlFeature feature = new CacheControlFeature()) { + final WebTarget base = ClientBuilder.newBuilder().register(feature).build().target(ADDRESS); + final Invocation.Builder cached = + setAsLocal(base.request("text/xml")).header(HttpHeaders.CACHE_CONTROL, "public"); + final Response r = cached.get(); + assertEquals(Response.Status.OK.getStatusCode(), r.getStatus()); + final Book b1 = r.readEntity(Book.class); + assertEquals("JNonCache", b1.getName()); + assertNotNull(b1.getId()); + waitABit(); + final Response r2 = cached.get(); + final Book b2 = r2.readEntity(Book.class); + assertNotEquals(b1, b2); + assertEquals(b1.getName(), b2.getName()); + } + } + private static Invocation.Builder setAsLocal(final Invocation.Builder client) { WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE); return client; @@ -233,6 +253,14 @@ public class ClientCacheTest { b.setName("JCache"); return Response.ok(b).tag("123").cacheControl(CacheControl.valueOf("max-age=50000")).build(); } + @GET + @Produces("text/xml") + public Response getNonCacheBook() { + Book b = new Book(); + b.setId(System.currentTimeMillis()); + b.setName("JNonCache"); + return Response.ok(b).tag("123").build(); + } } @XmlRootElement public static class Book implements Serializable {
