diff --git a/pom.xml b/pom.xml index 01017d3..7f4e839 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.greengerong prerender-java - 1.6.5-SNAPSHOT + 1.6.7 jar prerender-java @@ -32,20 +32,54 @@ 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 + + + 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 guava ${guava.version} - cdi1.0 + junit @@ -71,7 +105,7 @@ javax.servlet - servlet-api + javax.servlet-api ${servlet-api.version} provided @@ -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..59a4d19 100644 --- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java +++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java @@ -1,37 +1,42 @@ package com.github.greengerong; +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; +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", "qsappend", "requestTimeOut", "socketTimeout"); private PrerenderSeoService prerenderSeoService; @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); + 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(request, response, token); + if (!isPrerendered) { + filterChain.doFilter(servletRequest, servletResponse); + } + } catch (Exception e) { + e.printStackTrace(); + System.out.printf("Token: %s Exception: %s \n StackTrace: \n%s%n", token, e, ArrayUtils.toString(e.getStackTrace())); } } diff --git a/src/main/java/com/github/greengerong/PrerenderConfig.java b/src/main/java/com/github/greengerong/PrerenderConfig.java index a18d314..e17346e 100644 --- a/src/main/java/com/github/greengerong/PrerenderConfig.java +++ b/src/main/java/com/github/greengerong/PrerenderConfig.java @@ -20,7 +20,8 @@ public class PrerenderConfig { private final static Logger log = LoggerFactory.getLogger(PrerenderConfig.class); - public static final String PRERENDER_IO_SERVICE_URL = "http://service.prerender.io/"; + private final static int REQUEST_TIME_OUT = 3000; + public static final String PRERENDER_IO_SERVICE_URL = "https://service.prerender.io/"; private Map config; public PrerenderConfig(Map config) { @@ -135,4 +136,28 @@ 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; + } + public boolean getQSAppend(){ + final String qsappend = config.get("qsappend"); + if (isNotBlank(qsappend) && qsappend.trim().toLowerCase().equals("true")) { + return true; + } + 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 043a4a9..7cff00b 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -2,8 +2,10 @@ 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.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIUtils; @@ -11,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; @@ -41,12 +44,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(); } @@ -68,42 +75,48 @@ 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); + 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) - throws URISyntaxException, IOException { - if (shouldShowPrerenderedPage(servletRequest)) { + protected boolean handlePrerender(HttpServletRequest servletRequest, HttpServletResponse servletResponse, String token) throws URISyntaxException, IOException { + if (shouldShowPrerenderedPage(token,servletRequest)) { + log.trace(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; } } + log.trace(String.format("token: %s Request is not Prerendered",token)); + return false; } - private boolean shouldShowPrerenderedPage(HttpServletRequest request) throws URISyntaxException { + protected 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; } @@ -114,32 +127,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; } @@ -156,10 +175,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 @@ -177,22 +197,40 @@ 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)); + log.trace(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)) { 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)){ + //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(); } @@ -215,6 +253,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) { @@ -287,6 +330,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; + } }); } @@ -296,6 +344,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; + } }); } @@ -307,6 +360,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; + } }); } @@ -316,10 +374,15 @@ 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; + } }); } - 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)) { @@ -333,13 +396,16 @@ private boolean beforeRender(HttpServletRequest request, HttpServletResponse res return false; } - private boolean proxyPrerenderedPageResponse(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)); + 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)); + final HttpGet getMethod = getHttpGet(apiUrl); - copyRequestHeaders(request, getMethod); + copyRequestHeaders(token,request, getMethod); withPrerenderToken(getMethod); + + //Added logic to set timeout on request + withRequestConfig(getMethod); CloseableHttpResponse prerenderServerResponse = null; try { @@ -350,12 +416,17 @@ private boolean proxyPrerenderedPageResponse(HttpServletRequest request, HttpSer 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); } @@ -369,10 +440,22 @@ 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(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; + //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; } } diff --git a/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java b/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java index ba81d67..4114e60 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; @@ -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]);