From 69cb62febdbe232a41255be85ec5175bd5fc90e9 Mon Sep 17 00:00:00 2001 From: Raul Date: Mon, 4 Feb 2019 12:30:33 -0500 Subject: [PATCH 1/9] Added support to remove paths from url to support hippo on reverse proxies --- pom.xml | 49 +++++++++++++------ prerender-java.iml | 26 ---------- .../greengerong/PreRenderSEOFilter.java | 18 +++---- .../github/greengerong/PrerenderConfig.java | 8 +++ .../greengerong/PrerenderSeoService.java | 15 +++++- 5 files changed, 63 insertions(+), 53 deletions(-) delete mode 100644 prerender-java.iml diff --git a/pom.xml b/pom.xml index 01017d3..3e8192a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.greengerong prerender-java - 1.6.5-SNAPSHOT + 1.6.5.1 jar prerender-java @@ -40,6 +40,40 @@ 1.7.5 + + + authx-nexus + http://nexus.authxlab.com/repository/releases/ + + + authx-nexus + http://nexus.authxlab.com/repository/snapshots/ + + + + + + hippo + Hippo maven 2 repository. + https://maven.onehippo.com/maven2/ + + + + hippo-maven2-enterprise + Hippo Enterprise Maven 2 + https://maven.onehippo.com/maven2-enterprise + + never + fail + + + + + authxlab-nexus + http://nexus.authxlab.com/repository/releases/ + + + com.google.guava @@ -87,19 +121,6 @@ - - - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - sonatype-nexus-staging - Nexus Release Repository - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - diff --git a/prerender-java.iml b/prerender-java.iml deleted file mode 100644 index f74aa01..0000000 --- a/prerender-java.iml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java index 39195f9..56265a9 100644 --- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java +++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java @@ -1,23 +1,19 @@ package com.github.greengerong; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Map; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; public class PreRenderSEOFilter implements Filter { public static final List PARAMETER_NAMES = Lists.newArrayList("preRenderEventHandler", "proxy", "proxyPort", "prerenderToken", "forwardedURLHeader", "crawlerUserAgents", "extensionsToIgnore", "whitelist", - "blacklist", "prerenderServiceUrl", "protocol"); + "blacklist", "prerenderServiceUrl", "protocol","pathsToIgnore"); private PrerenderSeoService prerenderSeoService; @Override diff --git a/src/main/java/com/github/greengerong/PrerenderConfig.java b/src/main/java/com/github/greengerong/PrerenderConfig.java index a18d314..e2496c8 100644 --- a/src/main/java/com/github/greengerong/PrerenderConfig.java +++ b/src/main/java/com/github/greengerong/PrerenderConfig.java @@ -135,4 +135,12 @@ private String getDefaultPrerenderIoServiceUrl() { final String prerenderServiceUrlInEnv = System.getProperty("PRERENDER_SERVICE_URL"); return isNotBlank(prerenderServiceUrlInEnv) ? prerenderServiceUrlInEnv : PRERENDER_IO_SERVICE_URL; } + + public List getPathsToRemove(){ + final String pathsToIgnoreFromConfig = config.get("pathsToIgnore"); + if (isNotBlank(pathsToIgnoreFromConfig)) { + return Arrays.asList(pathsToIgnoreFromConfig.trim().split(",")); + } + return null; + } } diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index 043a4a9..6e187cb 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -45,6 +45,7 @@ public class PrerenderSeoService { private CloseableHttpClient httpClient; private PrerenderConfig prerenderConfig; private PreRenderEventHandler preRenderEventHandler; + private static final String EMPTY_STRING = ""; public PrerenderSeoService(Map config) { this.prerenderConfig = new PrerenderConfig(config); @@ -190,9 +191,19 @@ private String getRequestURL(HttpServletRequest request) { return url; } } + String url = ""; if (StringUtils.isNotEmpty(prerenderConfig.getProtocol())) { - String url = request.getRequestURL().toString(); - return url.replace(request.getScheme(), prerenderConfig.getProtocol()); + url = request.getRequestURL().toString(); + url = url.replace(request.getScheme(), prerenderConfig.getProtocol()); + } + if (prerenderConfig.getPathsToRemove() != null){ + url = StringUtils.isNotEmpty(url)?url:request.getRequestURL().toString(); + for(String path: prerenderConfig.getPathsToRemove()){ + url = url.replace(path,EMPTY_STRING); + } + } + if(StringUtils.isNotBlank(url)){ + return url; } return request.getRequestURL().toString(); } From cfa9f2fe2e669c04fc517ee703f70db72eec9a1e Mon Sep 17 00:00:00 2001 From: Raul Date: Wed, 6 Feb 2019 07:17:56 -0500 Subject: [PATCH 2/9] Added logs --- pom.xml | 2 +- .../greengerong/PreRenderSEOFilter.java | 19 +++-- .../github/greengerong/PrerenderConfig.java | 2 +- .../greengerong/PrerenderSeoService.java | 75 ++++++++++++------- .../greengerong/PreRenderSEOFilterTest.java | 2 +- 5 files changed, 67 insertions(+), 33 deletions(-) diff --git a/pom.xml b/pom.xml index 3e8192a..64900a8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.greengerong prerender-java - 1.6.5.1 + 1.6.5.6.debug jar prerender-java diff --git a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java index 56265a9..ba42f48 100644 --- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java +++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java @@ -2,6 +2,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import org.apache.commons.lang.ArrayUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -18,17 +19,25 @@ public class PreRenderSEOFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { - this.prerenderSeoService = new PrerenderSeoService(toMap(filterConfig)); + this.prerenderSeoService = new PrerenderSeoService(toMap(filterConfig),java.util.UUID.randomUUID().toString()); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - boolean isPrerendered = prerenderSeoService.prerenderIfEligible( - (HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); - if (!isPrerendered) { - filterChain.doFilter(servletRequest, servletResponse); + String token = java.util.UUID.randomUUID().toString(); + + try { + boolean isPrerendered = prerenderSeoService.prerenderIfEligible( + (HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse,token ); + if (!isPrerendered) { + filterChain.doFilter(servletRequest, servletResponse); + } + }catch (Exception e){ + e.printStackTrace(); + System.out.println(String.format("Token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); } + } @Override diff --git a/src/main/java/com/github/greengerong/PrerenderConfig.java b/src/main/java/com/github/greengerong/PrerenderConfig.java index e2496c8..5ee9d71 100644 --- a/src/main/java/com/github/greengerong/PrerenderConfig.java +++ b/src/main/java/com/github/greengerong/PrerenderConfig.java @@ -20,7 +20,7 @@ public class PrerenderConfig { private final static Logger log = LoggerFactory.getLogger(PrerenderConfig.class); - public static final String PRERENDER_IO_SERVICE_URL = "http://service.prerender.io/"; + public static final String PRERENDER_IO_SERVICE_URL = "https://service.prerender.io/"; private Map config; public PrerenderConfig(Map config) { diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index 6e187cb..581066c 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -2,6 +2,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.*; import org.apache.http.client.methods.CloseableHttpResponse; @@ -41,13 +42,16 @@ public class PrerenderSeoService { * approach does case insensitive lookup faster. */ private static final HeaderGroup hopByHopHeaders; + private static final String ACCEPT_VALUE = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"; + private static final String ACCEPT_HEADER = "accept"; public static final String ESCAPED_FRAGMENT_KEY = "_escaped_fragment_"; private CloseableHttpClient httpClient; + private PrerenderConfig prerenderConfig; private PreRenderEventHandler preRenderEventHandler; private static final String EMPTY_STRING = ""; - public PrerenderSeoService(Map config) { + public PrerenderSeoService(Map config,String token) { this.prerenderConfig = new PrerenderConfig(config); this.httpClient = getHttpClient(); } @@ -69,42 +73,49 @@ public void destroy() { closeQuietly(httpClient); } - public boolean prerenderIfEligible(HttpServletRequest servletRequest, HttpServletResponse servletResponse) { + public boolean prerenderIfEligible(HttpServletRequest servletRequest, HttpServletResponse servletResponse, String token) { try { - if (handlePrerender(servletRequest, servletResponse)) { + if (handlePrerender(servletRequest, servletResponse,token)) { return true; } } catch (Exception e) { log.error("Prerender service error", e); + System.out.println(String.format("token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); } return false; } - private boolean handlePrerender(HttpServletRequest servletRequest, HttpServletResponse servletResponse) + private boolean handlePrerender(HttpServletRequest servletRequest, HttpServletResponse servletResponse,String token) throws URISyntaxException, IOException { - if (shouldShowPrerenderedPage(servletRequest)) { + if (shouldShowPrerenderedPage(token,servletRequest)) { + System.out.println(String.format("token: %s Request is Prerendered",token)); this.preRenderEventHandler = prerenderConfig.getEventHandler(); - if (beforeRender(servletRequest, servletResponse) || proxyPrerenderedPageResponse(servletRequest, servletResponse)) { + if (beforeRender(servletRequest, servletResponse) || proxyPrerenderedPageResponse(token,servletRequest, servletResponse)) { return true; } } + System.out.println(String.format("token: %s Request is not Prerendered",token)); return false; } - private boolean shouldShowPrerenderedPage(HttpServletRequest request) throws URISyntaxException { + private boolean shouldShowPrerenderedPage(String token, HttpServletRequest request) throws URISyntaxException { + final String userAgent = request.getHeader("User-Agent"); - final String url = getRequestURL(request); + final String url = getRequestURL(token, request); final String referer = request.getHeader("Referer"); - log.trace(String.format("checking request for %s from User-Agent %s and referer %s", url, userAgent, referer)); + log.trace(String.format("token: %s checking request for %s from User-Agent %s and referer %s",token, url, userAgent, referer)); + System.out.println(String.format("token: %s checking request for %s from User-Agent %s and referer %s",token, url, userAgent, referer)); if (!HttpGet.METHOD_NAME.equals(request.getMethod())) { - log.trace("Request is not HTTP GET; intercept: no"); + log.trace(String.format("token: %s Request is not HTTP GET; intercept: no"),token); + System.out.println(String.format("token: %s Request is not HTTP GET; intercept: no",token)); return false; } if (isInResources(url)) { - log.trace("request is for a (static) resource; intercept: no"); + log.trace(String.format("token: %s request is for a (static) resource; intercept: no",token)); + System.out.println(String.format("token: %s request is for a (static) resource; intercept: no",token)); return false; } @@ -115,32 +126,38 @@ private boolean shouldShowPrerenderedPage(HttpServletRequest request) throws URI final List whiteList = prerenderConfig.getWhitelist(); if (whiteList != null && !isInWhiteList(url, whiteList)) { - log.trace("Whitelist is enabled, but this request is not listed; intercept: no"); + log.trace(String.format("token: %s Whitelist is enabled, but this request is not listed; intercept: no",token)); + System.out.println(String.format("token: %s Whitelist is enabled, but this request is not listed; intercept: no",token)); return false; } final List blacklist = prerenderConfig.getBlacklist(); if (blacklist != null && isInBlackList(url, referer, blacklist)) { - log.trace("Blacklist is enabled, and this request is listed; intercept: no"); + log.trace(String.format("token: %s Blacklist is enabled, and this request is listed; intercept: no",token)); + System.out.println(String.format("token: %s Blacklist is enabled, and this request is listed; intercept: no",token)); return false; } if (hasEscapedFragment(request)) { - log.trace("Request Has _escaped_fragment_; intercept: yes"); + log.trace(String.format("token: %s Request Has _escaped_fragment_; intercept: yes",token)); + System.out.println(String.format("token: %s Request Has _escaped_fragment_; intercept: yes",token)); return true; } if (StringUtils.isBlank(userAgent)) { - log.trace("Request has blank userAgent; intercept: no"); + log.trace(String.format("token: %s Request has blank userAgent; intercept: no",token)); + System.out.println(String.format("token: %s Request has blank userAgent; intercept: no",token)); return false; } if (!isInSearchUserAgent(userAgent)) { - log.trace("Request User-Agent is not a search bot; intercept: no"); + log.trace(String.format("token: %s Request User-Agent is not a search bot; intercept: no",token)); + System.out.println(String.format("token: %s Request User-Agent is not a search bot; intercept: no",token)); return false; } - log.trace(String.format("Defaulting to request intercept(user-agent=%s): yes", userAgent)); + log.trace(String.format("token: %s Defaulting to request intercept(user-agent=%s): yes",token, userAgent)); + System.out.println(String.format("token: %s Defaulting to request intercept(user-agent=%s): yes",token, userAgent)); return true; } @@ -157,10 +174,11 @@ protected CloseableHttpClient getHttpClient() { * * @throws java.net.URISyntaxException */ - private void copyRequestHeaders(HttpServletRequest servletRequest, HttpRequest proxyRequest) + private void copyRequestHeaders(String token, HttpServletRequest servletRequest, HttpRequest proxyRequest) throws URISyntaxException { // Get an Enumeration of all of the header names sent by the client Enumeration enumerationOfHeaderNames = servletRequest.getHeaderNames(); + List headersName; while (enumerationOfHeaderNames.hasMoreElements()) { String headerName = (String) enumerationOfHeaderNames.nextElement(); //Instead the content-length is effectively set via InputStreamEntity @@ -178,13 +196,18 @@ private void copyRequestHeaders(HttpServletRequest servletRequest, HttpRequest p headerValue += ":" + host.getPort(); } } + // Added to avoid 301 loops due to edit-connect asking json + if (headerName.toLowerCase().equals(ACCEPT_HEADER)){ + System.out.println(String.format("token %s Setting up the ACCEPT header",token)); + headerValue = ACCEPT_VALUE; + } proxyRequest.addHeader(headerName, headerValue); } } } } - private String getRequestURL(HttpServletRequest request) { + private String getRequestURL(String token, HttpServletRequest request) { if (StringUtils.isNotEmpty(prerenderConfig.getForwardedURLHeader())) { String url = request.getHeader(prerenderConfig.getForwardedURLHeader()); if (StringUtils.isNotEmpty(url)) { @@ -203,6 +226,7 @@ private String getRequestURL(HttpServletRequest request) { } } if(StringUtils.isNotBlank(url)){ + System.out.println(String.format("token: %s OriginalUrl %s / NewUrl: %s",token,request.getRequestURL().toString(),url)); return url; } return request.getRequestURL().toString(); @@ -344,12 +368,13 @@ private boolean beforeRender(HttpServletRequest request, HttpServletResponse res return false; } - private boolean proxyPrerenderedPageResponse(HttpServletRequest request, HttpServletResponse response) + private boolean proxyPrerenderedPageResponse(String token, HttpServletRequest request, HttpServletResponse response) throws IOException, URISyntaxException { - final String apiUrl = getApiUrl(getFullUrl(request)); - log.trace(String.format("Prerender proxy will send request to:%s", apiUrl)); + final String apiUrl = getApiUrl(getFullUrl(token, request)); + log.trace(String.format("token %s Prerender proxy will send request to:%s",token, apiUrl)); + System.out.println(String.format("token %s Prerender proxy will send request to:%s", token, apiUrl)); final HttpGet getMethod = getHttpGet(apiUrl); - copyRequestHeaders(request, getMethod); + copyRequestHeaders(token,request, getMethod); withPrerenderToken(getMethod); CloseableHttpResponse prerenderServerResponse = null; @@ -381,8 +406,8 @@ private void withPrerenderToken(HttpRequest proxyRequest) { } } - private String getFullUrl(HttpServletRequest request) { - final String url = getRequestURL(request); + private String getFullUrl(String token, HttpServletRequest request) { + final String url = getRequestURL(token, request); final String queryString = request.getQueryString(); return isNotBlank(queryString) ? String.format("%s?%s", url, queryString) : url; } diff --git a/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java b/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java index ba81d67..7d23adf 100644 --- a/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java +++ b/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java @@ -58,7 +58,7 @@ public void setUp() throws Exception { preRenderSEOFilter = new PreRenderSEOFilter() { @Override public void init(FilterConfig filterConfig) throws ServletException { - setPrerenderSeoService(new PrerenderSeoService(toMap(filterConfig)) { + setPrerenderSeoService(new PrerenderSeoService(toMap(filterConfig),"") { @Override protected CloseableHttpClient getHttpClient() { return httpClient; From 5e543a854c0ec5242f9c4b3a19785c29cc6c0f9e Mon Sep 17 00:00:00 2001 From: Raul Date: Wed, 6 Feb 2019 07:26:52 -0500 Subject: [PATCH 3/9] Removed output logging --- pom.xml | 2 +- .../greengerong/PrerenderSeoService.java | 35 +++++++++++-------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 64900a8..3e8192a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.greengerong prerender-java - 1.6.5.6.debug + 1.6.5.1 jar prerender-java diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index 581066c..ec6c926 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -80,7 +80,8 @@ public boolean prerenderIfEligible(HttpServletRequest servletRequest, HttpServle } } catch (Exception e) { log.error("Prerender service error", e); - System.out.println(String.format("token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); + log.error(String.format("token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); + //System.out.println(String.format("token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); } return false; } @@ -88,13 +89,15 @@ public boolean prerenderIfEligible(HttpServletRequest servletRequest, HttpServle private boolean handlePrerender(HttpServletRequest servletRequest, HttpServletResponse servletResponse,String token) throws URISyntaxException, IOException { if (shouldShowPrerenderedPage(token,servletRequest)) { - System.out.println(String.format("token: %s Request is Prerendered",token)); + //System.out.println(String.format("token: %s Request is Prerendered",token)); + log.trace(String.format("token: %s Request is Prerendered",token)); this.preRenderEventHandler = prerenderConfig.getEventHandler(); if (beforeRender(servletRequest, servletResponse) || proxyPrerenderedPageResponse(token,servletRequest, servletResponse)) { return true; } } - System.out.println(String.format("token: %s Request is not Prerendered",token)); + //System.out.println(String.format("token: %s Request is not Prerendered",token)); + log.trace(String.format("token: %s Request is not Prerendered",token)); return false; } @@ -105,17 +108,17 @@ private boolean shouldShowPrerenderedPage(String token, HttpServletRequest reque final String referer = request.getHeader("Referer"); log.trace(String.format("token: %s checking request for %s from User-Agent %s and referer %s",token, url, userAgent, referer)); - System.out.println(String.format("token: %s checking request for %s from User-Agent %s and referer %s",token, url, userAgent, referer)); + //System.out.println(String.format("token: %s checking request for %s from User-Agent %s and referer %s",token, url, userAgent, referer)); if (!HttpGet.METHOD_NAME.equals(request.getMethod())) { log.trace(String.format("token: %s Request is not HTTP GET; intercept: no"),token); - System.out.println(String.format("token: %s Request is not HTTP GET; intercept: no",token)); + //System.out.println(String.format("token: %s Request is not HTTP GET; intercept: no",token)); return false; } if (isInResources(url)) { log.trace(String.format("token: %s request is for a (static) resource; intercept: no",token)); - System.out.println(String.format("token: %s request is for a (static) resource; intercept: no",token)); + //System.out.println(String.format("token: %s request is for a (static) resource; intercept: no",token)); return false; } @@ -127,37 +130,37 @@ private boolean shouldShowPrerenderedPage(String token, HttpServletRequest reque final List whiteList = prerenderConfig.getWhitelist(); if (whiteList != null && !isInWhiteList(url, whiteList)) { log.trace(String.format("token: %s Whitelist is enabled, but this request is not listed; intercept: no",token)); - System.out.println(String.format("token: %s Whitelist is enabled, but this request is not listed; intercept: no",token)); + //System.out.println(String.format("token: %s Whitelist is enabled, but this request is not listed; intercept: no",token)); return false; } final List blacklist = prerenderConfig.getBlacklist(); if (blacklist != null && isInBlackList(url, referer, blacklist)) { log.trace(String.format("token: %s Blacklist is enabled, and this request is listed; intercept: no",token)); - System.out.println(String.format("token: %s Blacklist is enabled, and this request is listed; intercept: no",token)); + //System.out.println(String.format("token: %s Blacklist is enabled, and this request is listed; intercept: no",token)); return false; } if (hasEscapedFragment(request)) { log.trace(String.format("token: %s Request Has _escaped_fragment_; intercept: yes",token)); - System.out.println(String.format("token: %s Request Has _escaped_fragment_; intercept: yes",token)); + //System.out.println(String.format("token: %s Request Has _escaped_fragment_; intercept: yes",token)); return true; } if (StringUtils.isBlank(userAgent)) { log.trace(String.format("token: %s Request has blank userAgent; intercept: no",token)); - System.out.println(String.format("token: %s Request has blank userAgent; intercept: no",token)); + //System.out.println(String.format("token: %s Request has blank userAgent; intercept: no",token)); return false; } if (!isInSearchUserAgent(userAgent)) { log.trace(String.format("token: %s Request User-Agent is not a search bot; intercept: no",token)); - System.out.println(String.format("token: %s Request User-Agent is not a search bot; intercept: no",token)); + //System.out.println(String.format("token: %s Request User-Agent is not a search bot; intercept: no",token)); return false; } log.trace(String.format("token: %s Defaulting to request intercept(user-agent=%s): yes",token, userAgent)); - System.out.println(String.format("token: %s Defaulting to request intercept(user-agent=%s): yes",token, userAgent)); + //System.out.println(String.format("token: %s Defaulting to request intercept(user-agent=%s): yes",token, userAgent)); return true; } @@ -198,7 +201,8 @@ private void copyRequestHeaders(String token, HttpServletRequest servletRequest, } // Added to avoid 301 loops due to edit-connect asking json if (headerName.toLowerCase().equals(ACCEPT_HEADER)){ - System.out.println(String.format("token %s Setting up the ACCEPT header",token)); + //System.out.println(String.format("token %s Setting up the ACCEPT header",token)); + log.trace(String.format("token %s Setting up the ACCEPT header",token)); headerValue = ACCEPT_VALUE; } proxyRequest.addHeader(headerName, headerValue); @@ -226,7 +230,8 @@ private String getRequestURL(String token, HttpServletRequest request) { } } if(StringUtils.isNotBlank(url)){ - System.out.println(String.format("token: %s OriginalUrl %s / NewUrl: %s",token,request.getRequestURL().toString(),url)); + //System.out.println(String.format("token: %s OriginalUrl %s / NewUrl: %s",token,request.getRequestURL().toString(),url)); + log.trace(String.format("token: %s OriginalUrl %s / NewUrl: %s",token,request.getRequestURL().toString(),url)); return url; } return request.getRequestURL().toString(); @@ -372,7 +377,7 @@ private boolean proxyPrerenderedPageResponse(String token, HttpServletRequest re throws IOException, URISyntaxException { final String apiUrl = getApiUrl(getFullUrl(token, request)); log.trace(String.format("token %s Prerender proxy will send request to:%s",token, apiUrl)); - System.out.println(String.format("token %s Prerender proxy will send request to:%s", token, apiUrl)); + //System.out.println(String.format("token %s Prerender proxy will send request to:%s", token, apiUrl)); final HttpGet getMethod = getHttpGet(apiUrl); copyRequestHeaders(token,request, getMethod); withPrerenderToken(getMethod); From 8bf4f38bd8975c6979e4b466c15f884fc3f831b4 Mon Sep 17 00:00:00 2001 From: Raul Date: Tue, 12 Mar 2019 23:20:10 -0500 Subject: [PATCH 4/9] Added support to remove querystring from request calls --- pom.xml | 2 +- .../java/com/github/greengerong/PreRenderSEOFilter.java | 2 +- src/main/java/com/github/greengerong/PrerenderConfig.java | 7 +++++++ .../java/com/github/greengerong/PrerenderSeoService.java | 7 ++++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 3e8192a..4ceef38 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.greengerong prerender-java - 1.6.5.1 + 1.6.5.2 jar prerender-java diff --git a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java index ba42f48..4e468f6 100644 --- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java +++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java @@ -14,7 +14,7 @@ public class PreRenderSEOFilter implements Filter { public static final List PARAMETER_NAMES = Lists.newArrayList("preRenderEventHandler", "proxy", "proxyPort", "prerenderToken", "forwardedURLHeader", "crawlerUserAgents", "extensionsToIgnore", "whitelist", - "blacklist", "prerenderServiceUrl", "protocol","pathsToIgnore"); + "blacklist", "prerenderServiceUrl", "protocol","pathsToIgnore","qsappend"); private PrerenderSeoService prerenderSeoService; @Override diff --git a/src/main/java/com/github/greengerong/PrerenderConfig.java b/src/main/java/com/github/greengerong/PrerenderConfig.java index 5ee9d71..c1e5dd7 100644 --- a/src/main/java/com/github/greengerong/PrerenderConfig.java +++ b/src/main/java/com/github/greengerong/PrerenderConfig.java @@ -143,4 +143,11 @@ public List getPathsToRemove(){ } return null; } + public boolean getQSAppend(){ + final String qsappend = config.get("qsappend"); + if (isNotBlank(qsappend) && qsappend.trim().toLowerCase().equals("true")) { + return true; + } + return false; + } } diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index ec6c926..e6ca235 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -414,6 +414,11 @@ private void withPrerenderToken(HttpRequest proxyRequest) { private String getFullUrl(String token, HttpServletRequest request) { final String url = getRequestURL(token, request); final String queryString = request.getQueryString(); - return isNotBlank(queryString) ? String.format("%s?%s", url, queryString) : url; + //Added by RPO + //If we ask to provide the querystring + if(prerenderConfig.getQSAppend()) { + return isNotBlank(queryString) ? String.format("%s?%s", url, queryString) : url; + } + return url; } } From 5cb3b3eb905bececcdaf049775b9be367518d2d8 Mon Sep 17 00:00:00 2001 From: Raul Date: Thu, 21 Mar 2019 10:20:13 -0500 Subject: [PATCH 5/9] Added support to set timeout to request --- .../com/github/greengerong/PreRenderSEOFilter.java | 2 +- .../java/com/github/greengerong/PrerenderConfig.java | 10 ++++++++++ .../com/github/greengerong/PrerenderSeoService.java | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java index 4e468f6..f6a6d3f 100644 --- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java +++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java @@ -14,7 +14,7 @@ public class PreRenderSEOFilter implements Filter { public static final List PARAMETER_NAMES = Lists.newArrayList("preRenderEventHandler", "proxy", "proxyPort", "prerenderToken", "forwardedURLHeader", "crawlerUserAgents", "extensionsToIgnore", "whitelist", - "blacklist", "prerenderServiceUrl", "protocol","pathsToIgnore","qsappend"); + "blacklist", "prerenderServiceUrl", "protocol","pathsToIgnore","qsappend","requestTimeOut"); private PrerenderSeoService prerenderSeoService; @Override diff --git a/src/main/java/com/github/greengerong/PrerenderConfig.java b/src/main/java/com/github/greengerong/PrerenderConfig.java index c1e5dd7..e17346e 100644 --- a/src/main/java/com/github/greengerong/PrerenderConfig.java +++ b/src/main/java/com/github/greengerong/PrerenderConfig.java @@ -20,6 +20,7 @@ public class PrerenderConfig { private final static Logger log = LoggerFactory.getLogger(PrerenderConfig.class); + private final static int REQUEST_TIME_OUT = 3000; public static final String PRERENDER_IO_SERVICE_URL = "https://service.prerender.io/"; private Map config; @@ -150,4 +151,13 @@ public boolean getQSAppend(){ } return false; } + public int getRequestTimeOut(){ + final String requestTimeOut = config.get("requestTimeOut"); + if (isNotBlank(requestTimeOut)) { + try{ return Integer.parseInt(requestTimeOut);}finally { + return REQUEST_TIME_OUT; + } + } + return REQUEST_TIME_OUT; + } } diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index e6ca235..2311083 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -5,6 +5,7 @@ import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.http.*; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIUtils; @@ -381,6 +382,8 @@ private boolean proxyPrerenderedPageResponse(String token, HttpServletRequest re final HttpGet getMethod = getHttpGet(apiUrl); copyRequestHeaders(token,request, getMethod); withPrerenderToken(getMethod); + //Added logic to set timeout on request + withRequestConfig(getMethod); CloseableHttpResponse prerenderServerResponse = null; try { @@ -410,6 +413,13 @@ private void withPrerenderToken(HttpRequest proxyRequest) { proxyRequest.addHeader("X-Prerender-Token", token); } } + private void withRequestConfig(HttpGet proxyRequest){ + RequestConfig.Builder requestConfig = RequestConfig.custom(); + requestConfig.setConnectTimeout(prerenderConfig.getRequestTimeOut()); + requestConfig.setConnectionRequestTimeout(prerenderConfig.getRequestTimeOut()); + requestConfig.setSocketTimeout(prerenderConfig.getRequestTimeOut()); + proxyRequest.setConfig(requestConfig.build()); + } private String getFullUrl(String token, HttpServletRequest request) { final String url = getRequestURL(token, request); From b7a2d34a9dad8a6055265ef3370b812f3e75f7d9 Mon Sep 17 00:00:00 2001 From: Raul Date: Mon, 25 Mar 2019 10:57:46 -0500 Subject: [PATCH 6/9] Fix on log trace --- src/main/java/com/github/greengerong/PrerenderSeoService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index 2311083..a98b725 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -112,7 +112,7 @@ private boolean shouldShowPrerenderedPage(String token, HttpServletRequest reque //System.out.println(String.format("token: %s checking request for %s from User-Agent %s and referer %s",token, url, userAgent, referer)); if (!HttpGet.METHOD_NAME.equals(request.getMethod())) { - log.trace(String.format("token: %s Request is not HTTP GET; intercept: no"),token); + log.trace(String.format("token: %s Request is not HTTP GET; intercept: no",token)); //System.out.println(String.format("token: %s Request is not HTTP GET; intercept: no",token)); return false; } From 5606bf3accf9fd9cb1625a7af1a98018e192f2f4 Mon Sep 17 00:00:00 2001 From: Alberto Borda Date: Tue, 1 Sep 2020 15:32:33 -0500 Subject: [PATCH 7/9] Update libraries --- pom.xml | 14 ++++----- .../greengerong/PreRenderSEOFilterTest.java | 30 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 4ceef38..2c8e5e0 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.greengerong prerender-java - 1.6.5.2 + 1.6.6 jar prerender-java @@ -32,12 +32,12 @@ UTF-8 4.11 1.9.5 - 15.0 + 27.0-jre 2.6 - 2.4 - 2.5 - 4.3.1 - 1.7.5 + 2.6 + 3.1.0 + 4.5.6 + 1.7.25 @@ -105,7 +105,7 @@ javax.servlet - servlet-api + javax.servlet-api ${servlet-api.version} provided diff --git a/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java b/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java index 7d23adf..4114e60 100644 --- a/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java +++ b/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java @@ -100,8 +100,8 @@ public void should_handle_when_url_with_escaped_fragment_() throws Exception { when(servletRequest.getHeaderNames()).thenReturn(mock(Enumeration.class)); when(httpClient.execute(httpGet)).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(statusLine); - final HashMap map = Maps.newHashMap(); - map.put(ESCAPED_FRAGMENT_KEY, ""); + final HashMap map = Maps.newHashMap(); + map.put(ESCAPED_FRAGMENT_KEY, new String[0]); when(servletRequest.getParameterMap()).thenReturn(map); when(statusLine.getStatusCode()).thenReturn(SC_OK); when(httpResponse.getAllHeaders()).thenReturn(new Header[0]); @@ -122,7 +122,7 @@ public void should_not_handle_when_user_agent_is_not_crawler() throws Exception when(servletRequest.getRequestURL()).thenReturn(new StringBuffer("http://localhost/test")); when(servletRequest.getMethod()).thenReturn(METHOD_NAME); - when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); + when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); when(servletRequest.getHeader("User-Agent")).thenReturn("no"); //when preRenderSEOFilter.doFilter(servletRequest, servletResponse, filterChain); @@ -140,7 +140,7 @@ public void should_not_handle_when_x_prerender_header_is_present() throws Except when(servletRequest.getRequestURL()).thenReturn(new StringBuffer("http://localhost/test")); when(servletRequest.getMethod()).thenReturn(METHOD_NAME); - when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); + when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); when(servletRequest.getHeader("User-Agent")).thenReturn("crawler1"); when(servletRequest.getHeader("X-Prerender")).thenReturn("1"); //when @@ -159,7 +159,7 @@ public void should_not_handle_when_url_is_a_resource() throws Exception { when(servletRequest.getRequestURL()).thenReturn(new StringBuffer("http://localhost/test.js")); when(servletRequest.getMethod()).thenReturn(METHOD_NAME); - when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); + when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); when(servletRequest.getHeader("User-Agent")).thenReturn("crawler1"); //when preRenderSEOFilter.doFilter(servletRequest, servletResponse, filterChain); @@ -178,7 +178,7 @@ public void should_not_handle_when_white_list_is_not_empty_and_url_is_not_in_whi when(servletRequest.getRequestURL()).thenReturn(new StringBuffer("http://localhost/test")); when(servletRequest.getMethod()).thenReturn(METHOD_NAME); - when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); + when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); when(servletRequest.getHeader("User-Agent")).thenReturn("crawler1"); //when preRenderSEOFilter.doFilter(servletRequest, servletResponse, filterChain); @@ -197,7 +197,7 @@ public void should_not_handle_when_black_list_is_not_empty_and_url_is_in_black_l when(servletRequest.getRequestURL()).thenReturn(new StringBuffer("http://localhost/test")); when(servletRequest.getMethod()).thenReturn(METHOD_NAME); - when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); + when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); when(servletRequest.getHeader("User-Agent")).thenReturn("crawler1"); //when preRenderSEOFilter.doFilter(servletRequest, servletResponse, filterChain); @@ -223,8 +223,8 @@ public void should_handle_when_user_agent_is_crawler_and_url_is_not_resource_and when(servletRequest.getHeaderNames()).thenReturn(mock(Enumeration.class)); when(httpClient.execute(httpGet)).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(statusLine); - final HashMap map = Maps.newHashMap(); - map.put(ESCAPED_FRAGMENT_KEY, ""); + final HashMap map = Maps.newHashMap(); + map.put(ESCAPED_FRAGMENT_KEY, new String[0]); when(servletRequest.getParameterMap()).thenReturn(map); when(statusLine.getStatusCode()).thenReturn(SC_OK); when(httpResponse.getAllHeaders()).thenReturn(new Header[0]); @@ -253,8 +253,8 @@ public void should_handle_when_every_thing_is_ok_but_prerender_server_response_i when(servletRequest.getHeaderNames()).thenReturn(mock(Enumeration.class)); when(httpClient.execute(httpGet)).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(statusLine); - final HashMap map = Maps.newHashMap(); - map.put(ESCAPED_FRAGMENT_KEY, ""); + final HashMap map = Maps.newHashMap(); + map.put(ESCAPED_FRAGMENT_KEY, new String[0]); when(servletRequest.getParameterMap()).thenReturn(map); when(statusLine.getStatusCode()).thenReturn(SC_NOT_FOUND); when(httpResponse.getAllHeaders()).thenReturn(new Header[0]); @@ -290,8 +290,8 @@ public void should_handle_when_user_agent_is_crawler_and_url_is_not_resource_and when(servletRequest.getHeaderNames()).thenReturn(mock(Enumeration.class)); when(httpClient.execute(httpGet)).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(statusLine); - final HashMap map = Maps.newHashMap(); - map.put(ESCAPED_FRAGMENT_KEY, ""); + final HashMap map = Maps.newHashMap(); + map.put(ESCAPED_FRAGMENT_KEY, new String[0]); when(servletRequest.getParameterMap()).thenReturn(map); when(statusLine.getStatusCode()).thenReturn(SC_OK); when(httpResponse.getAllHeaders()).thenReturn(new Header[0]); @@ -324,8 +324,8 @@ public void should_use_request_url_from_custom_header_if_available() throws Exce when(servletRequest.getHeaderNames()).thenReturn(mock(Enumeration.class)); when(httpClient.execute(httpGet)).thenReturn(httpResponse); when(httpResponse.getStatusLine()).thenReturn(statusLine); - final HashMap map = Maps.newHashMap(); - map.put(ESCAPED_FRAGMENT_KEY, ""); + final HashMap map = Maps.newHashMap(); + map.put(ESCAPED_FRAGMENT_KEY, new String[0]); when(servletRequest.getParameterMap()).thenReturn(map); when(statusLine.getStatusCode()).thenReturn(SC_OK); when(httpResponse.getAllHeaders()).thenReturn(new Header[0]); From b08a839029c4c06e436653402c2548ee6b76ca63 Mon Sep 17 00:00:00 2001 From: Alberto Borda Date: Tue, 1 Sep 2020 16:46:40 -0500 Subject: [PATCH 8/9] Update libraries --- pom.xml | 2 +- .../greengerong/PrerenderSeoService.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c8e5e0..5e2ecae 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ com.google.guava guava ${guava.version} - cdi1.0 + junit diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index a98b725..0362f90 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -13,6 +13,7 @@ import org.apache.http.message.BasicHeader; import org.apache.http.message.HeaderGroup; import org.apache.http.util.EntityUtils; +import org.checkerframework.checker.nullness.qual.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -256,6 +257,11 @@ private void copyResponseHeaders(HttpResponse proxyResponse, final HttpServletRe public boolean apply(Header header) { return !hopByHopHeaders.containsHeader(header.getName()); } + + @Override + public boolean test(@Nullable Header input) { + return false; + } }).transform(new Function() { @Override public Boolean apply(Header header) { @@ -328,6 +334,11 @@ public boolean apply(String regex) { return pattern.matcher(url).matches() || (!StringUtils.isBlank(referer) && pattern.matcher(referer).matches()); } + + @Override + public boolean test(@Nullable String input) { + return false; + } }); } @@ -337,6 +348,11 @@ private boolean isInSearchUserAgent(final String userAgent) { public boolean apply(String item) { return userAgent.toLowerCase().contains(item.toLowerCase()); } + + @Override + public boolean test(@Nullable String input) { + return false; + } }); } @@ -348,6 +364,11 @@ public boolean apply(String item) { return (url.indexOf('?') >= 0 ? url.substring(0, url.indexOf('?')) : url) .toLowerCase().endsWith(item); } + + @Override + public boolean test(@Nullable String input) { + return false; + } }); } @@ -357,6 +378,11 @@ private boolean isInWhiteList(final String url, List whitelist) { public boolean apply(String regex) { return Pattern.compile(regex).matcher(url).matches(); } + + @Override + public boolean test(@Nullable String input) { + return false; + } }); } From ca2437d438ba61427c87b0d9bc031e3164532e42 Mon Sep 17 00:00:00 2001 From: Eric Huiza Date: Wed, 14 Sep 2022 12:23:14 -0500 Subject: [PATCH 9/9] added better error handling for prerender.io errors --- pom.xml | 2 +- .../greengerong/PreRenderSEOFilter.java | 16 +++++----- .../greengerong/PrerenderSeoService.java | 31 ++++++++++--------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index 5e2ecae..7f4e839 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.greengerong prerender-java - 1.6.6 + 1.6.7 jar prerender-java diff --git a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java index f6a6d3f..59a4d19 100644 --- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java +++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java @@ -14,7 +14,7 @@ public class PreRenderSEOFilter implements Filter { public static final List PARAMETER_NAMES = Lists.newArrayList("preRenderEventHandler", "proxy", "proxyPort", "prerenderToken", "forwardedURLHeader", "crawlerUserAgents", "extensionsToIgnore", "whitelist", - "blacklist", "prerenderServiceUrl", "protocol","pathsToIgnore","qsappend","requestTimeOut"); + "blacklist", "prerenderServiceUrl", "protocol", "pathsToIgnore", "qsappend", "requestTimeOut", "socketTimeout"); private PrerenderSeoService prerenderSeoService; @Override @@ -23,21 +23,21 @@ public void init(FilterConfig filterConfig) throws ServletException { } @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { String token = java.util.UUID.randomUUID().toString(); + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + try { - boolean isPrerendered = prerenderSeoService.prerenderIfEligible( - (HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse,token ); + boolean isPrerendered = prerenderSeoService.prerenderIfEligible(request, response, token); if (!isPrerendered) { filterChain.doFilter(servletRequest, servletResponse); } - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); - System.out.println(String.format("Token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); + System.out.printf("Token: %s Exception: %s \n StackTrace: \n%s%n", token, e, ArrayUtils.toString(e.getStackTrace())); } - } @Override diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index 0362f90..7cff00b 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -77,34 +77,30 @@ public void destroy() { public boolean prerenderIfEligible(HttpServletRequest servletRequest, HttpServletResponse servletResponse, String token) { try { - if (handlePrerender(servletRequest, servletResponse,token)) { + if (handlePrerender(servletRequest, servletResponse, token)) { return true; } } catch (Exception e) { log.error("Prerender service error", e); - log.error(String.format("token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); - //System.out.println(String.format("token: %s Exception: %s \n StackTrace: \n%s",token, e.toString(), ArrayUtils.toString(e.getStackTrace()))); + log.error(String.format("token: %s Exception: %s \n StackTrace: \n%s", token, e, ArrayUtils.toString(e.getStackTrace()))); } return false; } - private boolean handlePrerender(HttpServletRequest servletRequest, HttpServletResponse servletResponse,String token) - throws URISyntaxException, IOException { + protected boolean handlePrerender(HttpServletRequest servletRequest, HttpServletResponse servletResponse, String token) throws URISyntaxException, IOException { if (shouldShowPrerenderedPage(token,servletRequest)) { - //System.out.println(String.format("token: %s Request is Prerendered",token)); log.trace(String.format("token: %s Request is Prerendered",token)); this.preRenderEventHandler = prerenderConfig.getEventHandler(); if (beforeRender(servletRequest, servletResponse) || proxyPrerenderedPageResponse(token,servletRequest, servletResponse)) { return true; } } - //System.out.println(String.format("token: %s Request is not Prerendered",token)); log.trace(String.format("token: %s Request is not Prerendered",token)); + return false; } - private boolean shouldShowPrerenderedPage(String token, HttpServletRequest request) throws URISyntaxException { - + protected boolean shouldShowPrerenderedPage(String token, HttpServletRequest request) throws URISyntaxException { final String userAgent = request.getHeader("User-Agent"); final String url = getRequestURL(token, request); final String referer = request.getHeader("Referer"); @@ -386,7 +382,7 @@ public boolean test(@Nullable String input) { }); } - private boolean beforeRender(HttpServletRequest request, HttpServletResponse response) throws IOException { + protected boolean beforeRender(HttpServletRequest request, HttpServletResponse response) throws IOException { if (preRenderEventHandler != null) { final String html = preRenderEventHandler.beforeRender(request); if (isNotBlank(html)) { @@ -400,14 +396,14 @@ private boolean beforeRender(HttpServletRequest request, HttpServletResponse res return false; } - private boolean proxyPrerenderedPageResponse(String token, HttpServletRequest request, HttpServletResponse response) - throws IOException, URISyntaxException { + protected boolean proxyPrerenderedPageResponse(String token, HttpServletRequest request, HttpServletResponse response) throws IOException, URISyntaxException { final String apiUrl = getApiUrl(getFullUrl(token, request)); log.trace(String.format("token %s Prerender proxy will send request to:%s",token, apiUrl)); - //System.out.println(String.format("token %s Prerender proxy will send request to:%s", token, apiUrl)); + final HttpGet getMethod = getHttpGet(apiUrl); copyRequestHeaders(token,request, getMethod); withPrerenderToken(getMethod); + //Added logic to set timeout on request withRequestConfig(getMethod); CloseableHttpResponse prerenderServerResponse = null; @@ -420,12 +416,17 @@ private boolean proxyPrerenderedPageResponse(String token, HttpServletRequest re html = afterRender(request, response, prerenderServerResponse, html); responseEntity(html, response); return true; - } finally { + } + catch (IOException ex) { + response.setStatus(504); + throw new IOException(ex); + } + finally { closeQuietly(prerenderServerResponse); } } - private String afterRender(HttpServletRequest clientRequest, HttpServletResponse clientResponse, CloseableHttpResponse prerenderServerResponse, String responseHtml) { + protected String afterRender(HttpServletRequest clientRequest, HttpServletResponse clientResponse, CloseableHttpResponse prerenderServerResponse, String responseHtml) { if (preRenderEventHandler != null) { return preRenderEventHandler.afterRender(clientRequest, clientResponse, prerenderServerResponse, responseHtml); }