11package com .github .greengerong ;
22
3+ import com .google .common .base .Function ;
34import com .google .common .base .Predicate ;
45import org .apache .commons .lang .StringUtils ;
56import org .apache .http .*;
2021import java .io .PrintWriter ;
2122import java .net .URI ;
2223import java .net .URISyntaxException ;
24+ import java .util .Arrays ;
2325import java .util .Enumeration ;
2426import java .util .List ;
2527import java .util .Map ;
2628import java .util .regex .Pattern ;
2729
2830import static com .google .common .collect .FluentIterable .from ;
31+ import static org .apache .commons .lang .StringUtils .isNotBlank ;
32+ import static org .apache .http .HttpHeaders .CONTENT_LENGTH ;
33+ import static org .apache .http .HttpHeaders .HOST ;
2934
3035public class PrerenderSeoService {
31- public static final int HTTP_OK = 200 ;
3236 private final static Logger log = LoggerFactory .getLogger (PrerenderSeoService .class );
3337 /**
3438 * These are the "hop-by-hop" headers that should not be copied.
@@ -37,6 +41,7 @@ public class PrerenderSeoService {
3741 * approach does case insensitive lookup faster.
3842 */
3943 private static final HeaderGroup hopByHopHeaders ;
44+ public static final String ESCAPED_FRAGMENT_KEY = "_escaped_fragment_" ;
4045 private CloseableHttpClient httpClient ;
4146 private PrerenderConfig prerenderConfig ;
4247 private PreRenderEventHandler preRenderEventHandler ;
@@ -90,7 +95,7 @@ private boolean shouldShowPrerenderedPage(HttpServletRequest request) throws URI
9095 final String url = getRequestURL (request );
9196 final String referer = request .getHeader ("Referer" );
9297
93- log .trace ("checking request for " + url + " from User-Agent " + userAgent + " and referer " + referer );
98+ log .trace (String . format ( "checking request for %s from User-Agent %s and referer %s" , url , userAgent , referer ) );
9499
95100 if (!HttpGet .METHOD_NAME .equals (request .getMethod ())) {
96101 log .trace ("Request is not HTTP GET; intercept: no" );
@@ -153,14 +158,14 @@ private void copyRequestHeaders(HttpServletRequest servletRequest, HttpRequest p
153158 while (enumerationOfHeaderNames .hasMoreElements ()) {
154159 String headerName = (String ) enumerationOfHeaderNames .nextElement ();
155160 //Instead the content-length is effectively set via InputStreamEntity
156- if (!headerName .equalsIgnoreCase (HttpHeaders . CONTENT_LENGTH ) && !hopByHopHeaders .containsHeader (headerName )) {
161+ if (!headerName .equalsIgnoreCase (CONTENT_LENGTH ) && !hopByHopHeaders .containsHeader (headerName )) {
157162 Enumeration <?> headers = servletRequest .getHeaders (headerName );
158163 while (headers .hasMoreElements ()) {//sometimes more than one value
159164 String headerValue = (String ) headers .nextElement ();
160165 // In case the proxy host is running multiple virtual servers,
161166 // rewrite the Host header to ensure that we get content from
162167 // the correct virtual server
163- if (headerName .equalsIgnoreCase (HttpHeaders . HOST )) {
168+ if (headerName .equalsIgnoreCase (HOST )) {
164169 HttpHost host = URIUtils .extractHost (new URI (prerenderConfig .getPrerenderServiceUrl ()));
165170 headerValue = host .getHostName ();
166171 if (host .getPort () != -1 ) {
@@ -194,12 +199,19 @@ private String getApiUrl(String url) {
194199 /**
195200 * Copy proxied response headers back to the servlet client.
196201 */
197- private void copyResponseHeaders (HttpResponse proxyResponse , HttpServletResponse servletResponse ) {
198- for (Header header : proxyResponse .getAllHeaders ()) {
199- if (!hopByHopHeaders .containsHeader (header .getName ())) {
202+ private void copyResponseHeaders (HttpResponse proxyResponse , final HttpServletResponse servletResponse ) {
203+ from (Arrays .asList (proxyResponse .getAllHeaders ())).filter (new Predicate <Header >() {
204+ @ Override
205+ public boolean apply (Header header ) {
206+ return !hopByHopHeaders .containsHeader (header .getName ());
207+ }
208+ }).transform (new Function <Header , Boolean >() {
209+ @ Override
210+ public Boolean apply (Header header ) {
200211 servletResponse .addHeader (header .getName (), header .getValue ());
212+ return true ;
201213 }
202- }
214+ }). toList ();
203215 }
204216
205217 private String getResponseHtml (HttpResponse proxyResponse )
@@ -234,7 +246,7 @@ protected void closeQuietly(Closeable closeable) {
234246 }
235247
236248 private boolean hasEscapedFragment (HttpServletRequest request ) {
237- return request .getParameterMap ().containsKey ("_escaped_fragment_" );
249+ return request .getParameterMap ().containsKey (ESCAPED_FRAGMENT_KEY );
238250 }
239251
240252 private boolean isInBlackList (final String url , final String referer , List <String > blacklist ) {
@@ -280,7 +292,7 @@ public boolean apply(String regex) {
280292 private boolean beforeRender (HttpServletRequest request , HttpServletResponse response ) throws IOException {
281293 if (preRenderEventHandler != null ) {
282294 final String html = preRenderEventHandler .beforeRender (request );
283- if (StringUtils . isNotBlank (html )) {
295+ if (isNotBlank (html )) {
284296 final PrintWriter writer = response .getWriter ();
285297 writer .write (html );
286298 writer .flush ();
@@ -323,17 +335,14 @@ private String afterRender(HttpServletRequest clientRequest, HttpServletResponse
323335 private void withPrerenderToken (HttpRequest proxyRequest ) {
324336 final String token = prerenderConfig .getPrerenderToken ();
325337 //for new version prerender with token.
326- if (StringUtils . isNotBlank (token )) {
338+ if (isNotBlank (token )) {
327339 proxyRequest .addHeader ("X-Prerender-Token" , token );
328340 }
329341 }
330342
331343 private String getFullUrl (HttpServletRequest request ) {
332344 final String url = getRequestURL (request );
333345 final String queryString = request .getQueryString ();
334- if (queryString != null ) {
335- return url + '?' + queryString ;
336- }
337- return url ;
346+ return isNotBlank (queryString ) ? String .format ("%s?%s" , url , queryString ) : url ;
338347 }
339348}
0 commit comments