From 1ef011e66d2f20f12d02860e9843e4713980da66 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Sat, 12 Jan 2013 13:29:53 +0000 Subject: [PATCH] Moving ETags a layer higher (to make it faster and do no File operations). --- .../lotro/async/LotroHttpRequestHandler.java | 43 +++++-------------- .../gempukku/lotro/async/ResponseWriter.java | 2 +- .../async/handler/WebRequestHandler.java | 27 +++++++++++- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java index ec5a74fe2..1a95c4afa 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java @@ -32,12 +32,10 @@ public class LotroHttpRequestHandler extends SimpleChannelUpstreamHandler { private Map _objects; private UriRequestHandler _uriRequestHandler; - private String _uniqueEtag; public LotroHttpRequestHandler(Map objects, UriRequestHandler uriRequestHandler) { _objects = objects; _uriRequestHandler = uriRequestHandler; - _uniqueEtag = "\"" + String.valueOf(System.currentTimeMillis()) + "\""; } @Override @@ -90,8 +88,8 @@ public class LotroHttpRequestHandler extends SimpleChannelUpstreamHandler { } @Override - public void writeFile(File file) { - writeFileResponse(request, file, e); + public void writeFile(File file, Map headers) { + writeFileResponse(request, file, headers, e); } }; @@ -107,7 +105,7 @@ public class LotroHttpRequestHandler extends SimpleChannelUpstreamHandler { private Map _fileCache = Collections.synchronizedMap(new HashMap()); - private void writeFileResponse(HttpRequest request, File file, MessageEvent e) { + private void writeFileResponse(HttpRequest request, File file, Map headers, MessageEvent e) { try { String canonicalPath = file.getCanonicalPath(); byte[] fileBytes = _fileCache.get(canonicalPath); @@ -128,39 +126,21 @@ public class LotroHttpRequestHandler extends SimpleChannelUpstreamHandler { } } - if (clientHasCurrentVersion(request)) { - Map headers = new HashMap(); - headers.put(ETAG, _uniqueEtag); - writeHttpErrorResponse(request, 304, headers, e); - } else { - writeHttpByteResponse(request, fileBytes, getHeadersForFile(file), e); - } + writeHttpByteResponse(request, fileBytes, getHeadersForFile(headers, file), e); } catch (IOException exp) { writeHttpErrorResponse(request, 500, null, e); } } - private boolean clientHasCurrentVersion(HttpRequest request) { - String ifNoneMatch = request.getHeader(IF_NONE_MATCH); - if (ifNoneMatch != null) { - String[] clientKnownVersions = ifNoneMatch.split(","); - for (String clientKnownVersion : clientKnownVersions) { - if (clientKnownVersion.trim().equals(_uniqueEtag)) - return true; - } - } - return false; - } - - private Map getHeadersForFile(File file) { - Map headers = new HashMap(); + private Map getHeadersForFile(Map headers, File file) { + Map fileHeaders = new HashMap(headers); String fileName = file.getName(); String contentType; if (fileName.endsWith(".html")) { - headers.put(CACHE_CONTROL, "no-cache"); - headers.put(PRAGMA, "no-cache"); - headers.put(EXPIRES, String.valueOf(-1)); + fileHeaders.put(CACHE_CONTROL, "no-cache"); + fileHeaders.put(PRAGMA, "no-cache"); + fileHeaders.put(EXPIRES, String.valueOf(-1)); contentType = "text/html; charset=UTF-8"; } else if (fileName.endsWith(".js")) { contentType = "application/javascript; charset=UTF-8"; @@ -177,9 +157,8 @@ public class LotroHttpRequestHandler extends SimpleChannelUpstreamHandler { } else { contentType = "application/octet-stream"; } - headers.put(CONTENT_TYPE, contentType); - headers.put(ETAG, _uniqueEtag); - return headers; + fileHeaders.put(CONTENT_TYPE, contentType); + return fileHeaders; } private void writeHttpErrorResponse(HttpRequest request, int status, Map headers, MessageEvent e) { diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java index 0b1f1e7e8..7b102ee1d 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/ResponseWriter.java @@ -9,7 +9,7 @@ public interface ResponseWriter { public void writeError(int status); public void writeError(int status, Map headers); - public void writeFile(File file); + public void writeFile(File file, Map headers); public void writeHtmlResponse(String html); diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/WebRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/WebRequestHandler.java index 4fee4e0a8..973faae46 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/WebRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/WebRequestHandler.java @@ -2,21 +2,31 @@ package com.gempukku.lotro.async.handler; import com.gempukku.lotro.async.ResponseWriter; import org.jboss.netty.channel.MessageEvent; +import org.jboss.netty.handler.codec.http.HttpHeaders; +import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.IF_NONE_MATCH; import org.jboss.netty.handler.codec.http.HttpRequest; import java.io.File; import java.lang.reflect.Type; +import java.util.Collections; import java.util.Map; public class WebRequestHandler implements UriRequestHandler { private String _root; + private String _uniqueEtag; public WebRequestHandler(String root) { _root = root; + _uniqueEtag = "\"" + String.valueOf(System.currentTimeMillis()) + "\""; } @Override public void handleRequest(String uri, HttpRequest request, Map context, ResponseWriter responseWriter, MessageEvent e) throws Exception { + if (clientHasCurrentVersion(request)) { + responseWriter.writeError(304); + return; + } + if (uri.equals("")) uri = "index.html"; @@ -30,8 +40,21 @@ public class WebRequestHandler implements UriRequestHandler { File file = new File(_root + uri); if (!file.getCanonicalPath().startsWith(_root)) responseWriter.writeError(403); - else - responseWriter.writeFile(file); + else { + responseWriter.writeFile(file, Collections.singletonMap(HttpHeaders.Names.ETAG, _uniqueEtag)); + } } } + + private boolean clientHasCurrentVersion(HttpRequest request) { + String ifNoneMatch = request.getHeader(IF_NONE_MATCH); + if (ifNoneMatch != null) { + String[] clientKnownVersions = ifNoneMatch.split(","); + for (String clientKnownVersion : clientKnownVersions) { + if (clientKnownVersion.trim().equals(_uniqueEtag)) + return true; + } + } + return false; + } }