X-Git-Url: https://juplo.de/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fthymeproxy%2FProxyHttpRequestHandler.java;h=8c52b26a59aa3e90546920c20ccce031171ba0d6;hb=53d411dcd6f52a22ec4513a9d43b3b5f737655a1;hp=8320c7ecd3fa42fed97478067547f3e3c7bca677;hpb=077089fbdea50e75fd478056665c81e8db07d6e9;p=maven-thymeleaf-skin diff --git a/src/main/java/de/juplo/thymeproxy/ProxyHttpRequestHandler.java b/src/main/java/de/juplo/thymeproxy/ProxyHttpRequestHandler.java index 8320c7e..8c52b26 100644 --- a/src/main/java/de/juplo/thymeproxy/ProxyHttpRequestHandler.java +++ b/src/main/java/de/juplo/thymeproxy/ProxyHttpRequestHandler.java @@ -15,6 +15,7 @@ import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; @@ -78,7 +79,9 @@ public class ProxyHttpRequestHandler ServletException, IOException { - String path = + LOG.debug("handling: {}", request.getRequestURI()); + + String path = (String) request.getAttribute( HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE @@ -100,25 +103,33 @@ public class ProxyHttpRequestHandler String resource = builder.toString(); + CloseableHttpResponse p_response = null; try { HttpGet p_request = new HttpGet(resource); - CloseableHttpResponse p_response = client.execute(p_request); + + p_response = client.execute(p_request); + + StatusLine status = p_response.getStatusLine(); + int code = status.getStatusCode(); + LOG.info("{} - {}: {}", code, status.getReasonPhrase(), resource); setCacheControl(computeCacheControl(p_response)); prepareResponse(response); - Header length = p_response.getLastHeader("Content-Length"); - if (length != null) - response.addHeader(length.getName(), length.getValue()); + /** Copy some headers, if present.. */ + ProxyHttpRequestHandler.copyHeader(p_response, response, "Date"); + ProxyHttpRequestHandler.copyHeader(p_response, response, "ETag"); + ProxyHttpRequestHandler.copyHeader(p_response, response, "Last-Modified"); + ProxyHttpRequestHandler.copyHeader(p_response, response, "Content-Length"); + ProxyHttpRequestHandler.copyHeader(p_response, response, "Content-Type"); - int status = p_response.getStatusLine().getStatusCode(); - switch (status) + switch (code) { case HttpServletResponse.SC_FOUND: case HttpServletResponse.SC_OK: /** OK. Continue as normal... */ - response.setStatus(status); + response.setStatus(code); HttpEntity entity = p_response.getEntity(); @@ -128,12 +139,12 @@ public class ProxyHttpRequestHandler EntityUtils.consume(entity); p_response.close(); - break; + return; case HttpServletResponse.SC_NOT_FOUND: case HttpServletResponse.SC_GONE: /** The resource can not be resolved through this origin */ - response.sendError(status, p_response.getStatusLine().getReasonPhrase()); + response.sendError(code, status.getReasonPhrase()); return; case HttpServletResponse.SC_MOVED_PERMANENTLY: @@ -157,6 +168,28 @@ public class ProxyHttpRequestHandler // TODO: throw sensible exceptions, to communicate resolving-errors throw new RuntimeException(e); } + finally + { + if (p_response != null) + { + EntityUtils.consumeQuietly(p_response.getEntity()); + p_response.close(); + } + } + } + + public static void copyHeader( + HttpResponse source, + HttpServletResponse target, + String name + ) + { + Header header = source.getLastHeader(name); + if (header != null) + { + LOG.trace("copy header {}: {}", header.getName(), header.getValue()); + target.addHeader(header.getName(), header.getValue()); + } } public CacheControl computeCacheControl(HttpResponse response) @@ -326,9 +359,10 @@ public class ProxyHttpRequestHandler * * @see org.springframework.web.util.UrlPathHelper#setAlwaysUseFullPath */ - public void setAlwaysUseFullPath(boolean alwaysUseFullPath) + public ProxyHttpRequestHandler setAlwaysUseFullPath(boolean alwaysUseFullPath) { this.urlPathHelper.setAlwaysUseFullPath(alwaysUseFullPath); + return this; } /** @@ -341,9 +375,10 @@ public class ProxyHttpRequestHandler * * @see org.springframework.web.util.UrlPathHelper#setUrlDecode */ - public void setUrlDecode(boolean urlDecode) + public ProxyHttpRequestHandler setUrlDecode(boolean urlDecode) { this.urlPathHelper.setUrlDecode(urlDecode); + return this; } /** @@ -352,9 +387,10 @@ public class ProxyHttpRequestHandler * @see * org.springframework.web.util.UrlPathHelper#setRemoveSemicolonContent(boolean) */ - public void setRemoveSemicolonContent(boolean removeSemicolonContent) + public ProxyHttpRequestHandler setRemoveSemicolonContent(boolean removeSemicolonContent) { this.urlPathHelper.setRemoveSemicolonContent(removeSemicolonContent); + return this; } /** @@ -368,17 +404,10 @@ public class ProxyHttpRequestHandler * @see * org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#setUrlPathHelper */ - public void setUrlPathHelper(UrlPathHelper urlPathHelper) + public ProxyHttpRequestHandler setUrlPathHelper(UrlPathHelper urlPathHelper) { Assert.notNull(urlPathHelper, "UrlPathHelper must not be null"); this.urlPathHelper = urlPathHelper; - } - - /** - * Return the UrlPathHelper to use for the resolution of lookup paths. - */ - protected UrlPathHelper getUrlPathHelper() - { - return this.urlPathHelper; + return this; } }