From a073d843ab00cc4d1cfb6eb2912f3f50fe765618 Mon Sep 17 00:00:00 2001 From: Athou Date: Mon, 2 Dec 2024 18:43:44 +0100 Subject: [PATCH] ignore invalid cache control values (#1619) --- .../java/com/commafeed/backend/HttpGetter.java | 11 ++++++++++- .../java/com/commafeed/backend/HttpGetterTest.java | 14 +++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java b/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java index 4a1ab22f..d3118fc2 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java @@ -162,7 +162,7 @@ public class HttpGetter { CacheControl cacheControl = Optional.ofNullable(resp.getFirstHeader(HttpHeaders.CACHE_CONTROL)) .map(NameValuePair::getValue) .map(StringUtils::trimToNull) - .map(CacheControlDelegate.INSTANCE::fromString) + .map(HttpGetter::toCacheControl) .orElse(null); String contentType = Optional.ofNullable(resp.getEntity()).map(HttpEntity::getContentType).orElse(null); @@ -176,6 +176,15 @@ public class HttpGetter { }); } + private static CacheControl toCacheControl(String headerValue) { + try { + return CacheControlDelegate.INSTANCE.fromString(headerValue); + } catch (Exception e) { + log.debug("Invalid Cache-Control header: {}", headerValue); + return null; + } + } + private static byte[] toByteArray(HttpEntity entity, long maxBytes) throws IOException { if (entity.getContentLength() > maxBytes) { throw new IOException( diff --git a/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java b/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java index 0244aa7e..f7848343 100644 --- a/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java +++ b/commafeed-server/src/test/java/com/commafeed/backend/HttpGetterTest.java @@ -94,7 +94,7 @@ class HttpGetterTest { .withContentType(MediaType.APPLICATION_ATOM_XML) .withHeader(HttpHeaders.LAST_MODIFIED, "123456") .withHeader(HttpHeaders.ETAG, "78910") - .withHeader(HttpHeaders.CACHE_CONTROL, "max-age=60")); + .withHeader(HttpHeaders.CACHE_CONTROL, "max-age=60, must-revalidate")); HttpResult result = getter.get(this.feedUrl); Assertions.assertArrayEquals(feedContent, result.getContent()); @@ -105,6 +105,18 @@ class HttpGetterTest { Assertions.assertEquals(this.feedUrl, result.getUrlAfterRedirect()); } + @Test + void ignoreInvalidCacheControlValue() throws Exception { + this.mockServerClient.when(HttpRequest.request().withMethod("GET")) + .respond(HttpResponse.response() + .withBody(feedContent) + .withContentType(MediaType.APPLICATION_ATOM_XML) + .withHeader(HttpHeaders.CACHE_CONTROL, "max-age=60; must-revalidate")); + + HttpResult result = getter.get(this.feedUrl); + Assertions.assertEquals(Duration.ZERO, result.getValidFor()); + } + @ParameterizedTest @ValueSource( ints = { HttpStatus.SC_MOVED_PERMANENTLY, HttpStatus.SC_MOVED_TEMPORARILY, HttpStatus.SC_TEMPORARY_REDIRECT,