From 9788712808e72ffbdf6f006d167d02072a5b210f Mon Sep 17 00:00:00 2001 From: Athou Date: Tue, 20 Oct 2026 08:28:15 +0200 Subject: [PATCH] add a global failsafe timeout to the feed fetching client --- .../java/com/commafeed/backend/HttpGetter.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 97b92c0d..6a0574ac 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/HttpGetter.java @@ -54,6 +54,8 @@ import java.time.InstantSource; import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; /** Smart HTTP getter: handles gzip, ssl, last modified, and etag headers */ @Singleton @@ -191,7 +193,13 @@ public class HttpGetter { client.execute(req, resp, context, callback); try { - Message message = future.get(); + Duration totalTimeout = + config.httpClient() + .connectTimeout() + .plus(config.httpClient().sslHandshakeTimeout()) + .plus(config.httpClient().responseTimeout()); + Message message = + future.get(totalTimeout.toSeconds(), TimeUnit.SECONDS); byte[] content = message.getBody(); int code = message.getHead().getCode(); @@ -245,7 +253,11 @@ public class HttpGetter { future.cancel(true); Thread.currentThread().interrupt(); throw new RuntimeException("interrupted while fetching " + request.getUrl(), e); + } catch (TimeoutException e) { + future.cancel(true); + throw new IOException("timed out while fetching " + request.getUrl(), e); } catch (ExecutionException e) { + future.cancel(true); throw Lombok.sneakyThrow(e.getCause()); } }