From cade74c18cf965ec79dd13fe0cf4de0e09a314b8 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 27 Sep 2019 22:16:02 -0400 Subject: [PATCH] feed controller: add etag --- .../http/service/feed/FeedController.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java b/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java index c679cd319f..480478c9d0 100644 --- a/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java +++ b/http-service/src/main/java/net/runelite/http/service/feed/FeedController.java @@ -24,6 +24,9 @@ */ package net.runelite.http.service.feed; +import com.google.common.hash.HashCode; +import com.google.common.hash.Hasher; +import com.google.common.hash.Hashing; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -51,7 +54,26 @@ public class FeedController private final TwitterService twitterService; private final OSRSNewsService osrsNewsService; - private FeedResult feedResult; + private static class MemoizedFeed + { + final FeedResult feedResult; + final String hash; + + MemoizedFeed(FeedResult feedResult) + { + this.feedResult = feedResult; + + Hasher hasher = Hashing.sha256().newHasher(); + for (FeedItem itemPrice : feedResult.getItems()) + { + hasher.putBytes(itemPrice.getTitle().getBytes()).putBytes(itemPrice.getContent().getBytes()); + } + HashCode code = hasher.hash(); + hash = code.toString(); + } + } + + private MemoizedFeed memoizedFeed; @Autowired public FeedController(BlogService blogService, TwitterService twitterService, OSRSNewsService osrsNewsService) @@ -93,20 +115,21 @@ public class FeedController log.warn(e.getMessage()); } - feedResult = new FeedResult(items); + memoizedFeed = new MemoizedFeed(new FeedResult(items)); } @GetMapping public ResponseEntity getFeed() { - if (feedResult == null) + if (memoizedFeed == null) { return ResponseEntity.notFound() .build(); } return ResponseEntity.ok() + .eTag(memoizedFeed.hash) .cacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES).cachePublic()) - .body(feedResult); + .body(memoizedFeed.feedResult); } }