diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheControlHeaderParser.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheControlHeaderParser.java index c1dad40b08..6aae254507 100644 --- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheControlHeaderParser.java +++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CacheControlHeaderParser.java @@ -230,7 +230,11 @@ public final RequestCacheControl parseRequest(final Iterator
headerItera if (name.equalsIgnoreCase(HeaderConstants.CACHE_CONTROL_MAX_AGE)) { builder.setMaxAge(parseSeconds(name, value)); } else if (name.equalsIgnoreCase(HeaderConstants.CACHE_CONTROL_MAX_STALE)) { - builder.setMaxStale(parseSeconds(name, value)); + if (value == null) { + builder.setMaxStale(Long.MAX_VALUE); + } else { + builder.setMaxStale(parseSeconds(name, value)); + } } else if (name.equalsIgnoreCase(HeaderConstants.CACHE_CONTROL_MIN_FRESH)) { builder.setMinFresh(parseSeconds(name, value)); } else if (name.equalsIgnoreCase(HeaderConstants.CACHE_CONTROL_NO_STORE)) { diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/CacheControlParserTest.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/CacheControlParserTest.java index d4ad639190..49f6c3609b 100644 --- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/CacheControlParserTest.java +++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/CacheControlParserTest.java @@ -259,4 +259,23 @@ void testParseMultipleIsImmutable() { assertTrue(cacheControl.isImmutable()); } + @Test + void testParseRequestMaxStaleWithoutValue() { + // RFC 9111: "max-stale" without a value means accept any staleness + final Header header = new BasicHeader("Cache-Control", "max-stale"); + final RequestCacheControl cacheControl = parser.parseRequest(Collections.singletonList(header).iterator()); + + assertEquals(Long.MAX_VALUE, cacheControl.getMaxStale()); + } + + @Test + void testParseRequestMaxStaleEmptyValueIsInvalid() { + // "max-stale=" is not the same as bare "max-stale" (missing delta-seconds) + final Header header = new BasicHeader("Cache-Control", "max-stale="); + final RequestCacheControl cacheControl = parser.parseRequest(Collections.singletonList(header).iterator()); + + assertEquals(-1L, cacheControl.getMaxStale()); + } + + }