diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java index f532770e99..22ecec6a81 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java @@ -24,6 +24,7 @@ import com.google.common.base.Strings; import com.google.common.cache.Cache; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.net.HttpHeaders; import com.google.gerrit.extensions.registration.RegistrationHandle; import com.google.gerrit.httpd.restapi.RestApiServlet; import com.google.gerrit.server.MimeUtilFileTypeRegistry; @@ -260,7 +261,7 @@ class HttpPluginServlet extends HttpServlet String file = pathInfo.substring(1); ResourceKey key = new ResourceKey(holder.plugin, file); Resource rsc = resourceCache.getIfPresent(key); - if (rsc != null) { + if (rsc != null && req.getHeader(HttpHeaders.IF_MODIFIED_SINCE) == null) { rsc.send(req, res); return; } @@ -278,7 +279,11 @@ class HttpPluginServlet extends HttpServlet PluginContentScanner scanner = holder.plugin.getContentScanner(); Optional entry = scanner.getEntry(file); if (entry.isPresent()) { - sendResource(scanner, entry.get(), key, res); + if (hasUpToDateCachedResource(rsc, entry.get().getTime())) { + rsc.send(req, res); + } else { + sendResource(scanner, entry.get(), key, res); + } } else { resourceCache.put(key, Resource.NOT_FOUND); Resource.NOT_FOUND.send(req, res); @@ -297,12 +302,26 @@ class HttpPluginServlet extends HttpServlet } if (!entry.isPresent() && file.endsWith("/index.html")) { String pfx = file.substring(0, file.length() - "index.html".length()); - sendAutoIndex(scanner, pfx, holder.plugin.getName(), key, res, - holder.plugin.getSrcFile().lastModified()); + long pluginLastModified = holder.plugin.getSrcFile().lastModified(); + if (hasUpToDateCachedResource(rsc, pluginLastModified)) { + rsc.send(req, res); + } else { + sendAutoIndex(scanner, pfx, holder.plugin.getName(), key, res, + pluginLastModified); + } } else if (entry.isPresent() && entry.get().getName().endsWith(".md")) { - sendMarkdownAsHtml(scanner, entry.get(), holder.plugin.getName(), key, res); + if (hasUpToDateCachedResource(rsc, entry.get().getTime())) { + rsc.send(req, res); + } else { + sendMarkdownAsHtml(scanner, entry.get(), holder.plugin.getName(), + key, res); + } } else if (entry.isPresent()) { - sendResource(scanner, entry.get(), key, res); + if (hasUpToDateCachedResource(rsc, entry.get().getTime())) { + rsc.send(req, res); + } else { + sendResource(scanner, entry.get(), key, res); + } } else { resourceCache.put(key, Resource.NOT_FOUND); Resource.NOT_FOUND.send(req, res); @@ -313,6 +332,11 @@ class HttpPluginServlet extends HttpServlet } } + private boolean hasUpToDateCachedResource(Resource cachedResource, long lastUpdateTime) { + return cachedResource != null + && cachedResource.isUnchanged(lastUpdateTime); + } + private void appendEntriesSection(PluginContentScanner scanner, List entries, String sectionTitle, StringBuilder md, String prefix, int nameOffset) throws IOException { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/Resource.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/Resource.java index f354fd5d32..b361fdc2cf 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/Resource.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/Resource.java @@ -34,9 +34,17 @@ abstract class Resource { CacheHeaders.setNotCacheable(res); res.sendError(HttpServletResponse.SC_NOT_FOUND); } + + @Override + boolean isUnchanged(long latestModifiedDate) { + return false; + } }; + abstract boolean isUnchanged(long latestModifiedDate); + abstract int weigh(); + abstract void send(HttpServletRequest req, HttpServletResponse res) throws IOException; -} \ No newline at end of file +} diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/SmallResource.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/SmallResource.java index 72e238d23d..2a3da57093 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/SmallResource.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/SmallResource.java @@ -71,4 +71,9 @@ final class SmallResource extends Resource { res.setContentLength(data.length); res.getOutputStream().write(data); } + + @Override + boolean isUnchanged(long lastModified) { + return this.lastModified == lastModified; + } }