diff --git a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java index 6eb721f..b70c894 100644 --- a/src/main/java/com/github/greengerong/PreRenderSEOFilter.java +++ b/src/main/java/com/github/greengerong/PreRenderSEOFilter.java @@ -7,14 +7,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Map; public class PreRenderSEOFilter implements Filter { public static final List PARAMETER_NAMES = Lists.newArrayList("preRenderEventHandler", "proxy", "proxyPort", "prerenderToken", "forwardedURLHeader", "crawlerUserAgents", "extensionsToIgnore", "whitelist", - "blacklist", "prerenderServiceUrl"); + "blacklist", "prerenderServiceUrl", "ignoreUserAgent"); 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 90c2240..6cbc541 100644 --- a/src/main/java/com/github/greengerong/PrerenderConfig.java +++ b/src/main/java/com/github/greengerong/PrerenderConfig.java @@ -127,6 +127,11 @@ public String getPrerenderServiceUrl() { return isNotBlank(prerenderServiceUrl) ? prerenderServiceUrl : getDefaultPrerenderIoServiceUrl(); } + public Boolean getIgnoreUserAgent() { + String s = config.get("ignoreUserAgent"); + return s == null ? null : Boolean.valueOf(s); + } + private String getDefaultPrerenderIoServiceUrl() { final String prerenderServiceUrlInEnv = System.getProperty("PRERENDER_SERVICE_URL"); return isNotBlank(prerenderServiceUrlInEnv) ? prerenderServiceUrlInEnv : PRERENDER_IO_SERVICE_URL; diff --git a/src/main/java/com/github/greengerong/PrerenderSeoService.java b/src/main/java/com/github/greengerong/PrerenderSeoService.java index 250b075..6f9d2f6 100644 --- a/src/main/java/com/github/greengerong/PrerenderSeoService.java +++ b/src/main/java/com/github/greengerong/PrerenderSeoService.java @@ -129,7 +129,7 @@ private boolean shouldShowPrerenderedPage(HttpServletRequest request) throws URI return false; } - if (!isInSearchUserAgent(userAgent)) { + if (!ignoreUserAgent() && !isInSearchUserAgent(userAgent)) { log.trace("Request User-Agent is not a search bot; intercept: no"); return false; } @@ -281,6 +281,11 @@ public boolean apply(String regex) { }); } + private boolean ignoreUserAgent() { + Boolean b = prerenderConfig.getIgnoreUserAgent(); + return b == null ? false : b; + } + private boolean isInSearchUserAgent(final String userAgent) { return from(prerenderConfig.getCrawlerUserAgents()).anyMatch(new Predicate() { @Override diff --git a/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java b/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java index 6776586..f2cb2ae 100644 --- a/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java +++ b/src/test/java/com/github/greengerong/PreRenderSEOFilterTest.java @@ -169,6 +169,59 @@ public void should_not_handle_when_white_list_is_not_empty_and_url_is_not_in_whi verify(filterChain).doFilter(servletRequest, servletResponse); } + @Test + public void should_handle_when_url_in_whitelist_and_user_agent_is_ignored() throws Exception { + //given + when(filterConfig.getInitParameter("whitelist")).thenReturn("\\/test.*,\\/test1.*"); + when(filterConfig.getInitParameter("ignoreUserAgent")).thenReturn("true"); + preRenderSEOFilter.init(filterConfig); + final CloseableHttpResponse httpResponse = mock(CloseableHttpResponse.class); + final StatusLine statusLine = mock(StatusLine.class); + // Ignore copyResponseHeaders mocks + + when(servletRequest.getRequestURL()).thenReturn(new StringBuffer("/test")); + when(servletRequest.getMethod()).thenReturn(METHOD_NAME); + when(servletRequest.getHeaderNames()).thenReturn(mock(Enumeration.class)); + when(httpClient.execute(httpGet)).thenReturn(httpResponse); + when(httpResponse.getStatusLine()).thenReturn(statusLine); + when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); + when(servletRequest.getHeader("User-Agent")).thenReturn("human-browser"); // Regardless of User-Agent + + //when + preRenderSEOFilter.doFilter(servletRequest, servletResponse, filterChain); + + //then + verify(httpClient).execute(httpGet); + verify(filterChain).doFilter(servletRequest, servletResponse); + } + + @Test + public void should_not_handle_when_url_in_whitelist_but_user_agent_is_not_ignored() throws Exception { + //given + when(filterConfig.getInitParameter("crawlerUserAgents")).thenReturn("crawler1,crawler2"); + when(filterConfig.getInitParameter("whitelist")).thenReturn("\\/test.*,\\/test1.*"); + when(filterConfig.getInitParameter("ignoreUserAgent")).thenReturn("false"); + preRenderSEOFilter.init(filterConfig); + final CloseableHttpResponse httpResponse = mock(CloseableHttpResponse.class); + final StatusLine statusLine = mock(StatusLine.class); + // Ignore copyResponseHeaders mocks + + when(servletRequest.getRequestURL()).thenReturn(new StringBuffer("/test")); + when(servletRequest.getMethod()).thenReturn(METHOD_NAME); + when(servletRequest.getHeaderNames()).thenReturn(mock(Enumeration.class)); + when(httpClient.execute(httpGet)).thenReturn(httpResponse); + when(httpResponse.getStatusLine()).thenReturn(statusLine); + when(servletRequest.getParameterMap()).thenReturn(Maps.newHashMap()); + when(servletRequest.getHeader("User-Agent")).thenReturn("human-browser"); + + //when + preRenderSEOFilter.doFilter(servletRequest, servletResponse, filterChain); + + //then + verify(httpClient, never()).execute(httpGet); + verify(filterChain).doFilter(servletRequest, servletResponse); + } + @Test public void should_not_handle_when_black_list_is_not_empty_and_url_is_in_black_list() throws Exception { //given