Issue #1270 Avoid GzipHandler rework by DispatcherType exclusion

This commit is contained in:
Greg Wilkins 2017-01-18 14:11:25 +11:00
parent a4dd1672da
commit 70866690e4
1 changed files with 35 additions and 4 deletions

View File

@ -20,9 +20,12 @@ package org.eclipse.jetty.server.handler.gzip;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Set; import java.util.Set;
import java.util.zip.Deflater; import java.util.zip.Deflater;
import javax.servlet.DispatcherType;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -65,6 +68,7 @@ public class GzipHandler extends HandlerWrapper implements GzipFactory
private int _compressionLevel=Deflater.DEFAULT_COMPRESSION; private int _compressionLevel=Deflater.DEFAULT_COMPRESSION;
private boolean _checkGzExists = true; private boolean _checkGzExists = true;
private boolean _syncFlush = false; private boolean _syncFlush = false;
private EnumSet<DispatcherType> _dispatchers = EnumSet.of(DispatcherType.REQUEST);
// non-static, as other GzipHandler instances may have different configurations // non-static, as other GzipHandler instances may have different configurations
private final ThreadLocal<Deflater> _deflater = new ThreadLocal<>(); private final ThreadLocal<Deflater> _deflater = new ThreadLocal<>();
@ -126,6 +130,25 @@ public class GzipHandler extends HandlerWrapper implements GzipFactory
_methods.exclude(m); _methods.exclude(m);
} }
/* ------------------------------------------------------------ */
public EnumSet<DispatcherType> getDispatcherTypes()
{
return _dispatchers;
}
/* ------------------------------------------------------------ */
public void setDispatcherTypes(EnumSet<DispatcherType> dispatchers)
{
_dispatchers = dispatchers;
}
/* ------------------------------------------------------------ */
public void setDispatcherTypes(DispatcherType... dispatchers)
{
_dispatchers = EnumSet.copyOf(Arrays.asList(dispatchers));
}
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** /**
* Set the mime types. * Set the mime types.
@ -349,15 +372,16 @@ public class GzipHandler extends HandlerWrapper implements GzipFactory
/* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */
/** /**
* Get the minimum reponse size. * Get the minimum response size.
* *
* @return minimum reponse size * @return minimum response size
*/ */
public int getMinGzipSize() public int getMinGzipSize()
{ {
return _minGzipSize; return _minGzipSize;
} }
/* ------------------------------------------------------------ */
protected HttpField getVaryField() protected HttpField getVaryField()
{ {
return _vary; return _vary;
@ -374,8 +398,15 @@ public class GzipHandler extends HandlerWrapper implements GzipFactory
String path = context==null?baseRequest.getRequestURI():URIUtil.addPaths(baseRequest.getServletPath(),baseRequest.getPathInfo()); String path = context==null?baseRequest.getRequestURI():URIUtil.addPaths(baseRequest.getServletPath(),baseRequest.getPathInfo());
LOG.debug("{} handle {} in {}",this,baseRequest,context); LOG.debug("{} handle {} in {}",this,baseRequest,context);
HttpOutput out = baseRequest.getResponse().getHttpOutput(); if (!_dispatchers.contains(baseRequest.getDispatcherType()))
{
LOG.debug("{} excluded by dispatcherType {}",this,baseRequest.getDispatcherType());
_handler.handle(target,baseRequest, request, response);
return;
}
// Are we already being gzipped? // Are we already being gzipped?
HttpOutput out = baseRequest.getResponse().getHttpOutput();
HttpOutput.Interceptor interceptor = out.getInterceptor(); HttpOutput.Interceptor interceptor = out.getInterceptor();
while (interceptor!=null) while (interceptor!=null)
{ {
@ -406,7 +437,7 @@ public class GzipHandler extends HandlerWrapper implements GzipFactory
} }
// Exclude non compressible mime-types known from URI extension. - no Vary because no matter what client, this URI is always excluded // Exclude non compressible mime-types known from URI extension. - no Vary because no matter what client, this URI is always excluded
String mimeType = context==null?null:context.getMimeType(path); String mimeType = context==null?MimeTypes.getDefaultMimeByExtension(path):context.getMimeType(path);
if (mimeType!=null) if (mimeType!=null)
{ {
mimeType = MimeTypes.getContentTypeWithoutCharset(mimeType); mimeType = MimeTypes.getContentTypeWithoutCharset(mimeType);