diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java index 0ce0a5be660..0187179ca7b 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java @@ -315,7 +315,10 @@ public class HttpChannel implements Runnable else { error=true; - throw e; + LOG.warn(String.valueOf(_uri), e); + _state.error(e); + _request.setHandled(true); + handleException(e); } } catch (Exception e) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java index 706b988bffc..6faa3261ddb 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/RequestLogHandler.java @@ -66,6 +66,9 @@ public class RequestLogHandler extends HandlerWrapper @Override public void onError(AsyncEvent event) throws IOException { + HttpServletResponse response = (HttpServletResponse)event.getAsyncContext().getResponse(); + if (!response.isCommitted()) + response.setStatus(500); } @@ -91,6 +94,12 @@ public class RequestLogHandler extends HandlerWrapper { super.handle(target, baseRequest, request, response); } + catch(Error|IOException|ServletException|RuntimeException e) + { + if (!response.isCommitted() && !baseRequest.getHttpChannelState().isAsync()) + response.setStatus(500); + throw e; + } finally { if (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST)) diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java index 9097aa47b50..48df10cc280 100644 --- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java +++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/AsyncGzipFilter.java @@ -130,6 +130,7 @@ public class AsyncGzipFilter extends UserAgentFilter implements GzipFactory private static final Logger LOG = Log.getLogger(AsyncGzipFilter.class); public final static String GZIP = "gzip"; public static final String DEFLATE = "deflate"; + public final static String ETAG_GZIP="--gzip"; public final static String ETAG = "o.e.j.s.GzipFilter.ETag"; public final static int DEFAULT_MIN_GZIP_SIZE=256; @@ -364,9 +365,8 @@ public class AsyncGzipFilter extends UserAgentFilter implements GzipFactory String etag = request.getHeader("If-None-Match"); if (etag!=null) { - int dd=etag.indexOf("--"); - if (dd>0) - request.setAttribute(ETAG,etag.substring(0,dd)+(etag.endsWith("\"")?"\"":"")); + if (etag.contains(ETAG_GZIP)) + request.setAttribute(ETAG,etag.replace(ETAG_GZIP,"")); } HttpChannel channel = HttpChannel.getCurrentHttpChannel(); diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java index 6808c439e83..fc5b8bf978b 100644 --- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java +++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/AbstractCompressedStream.java @@ -255,7 +255,7 @@ public abstract class AbstractCompressedStream extends ServletOutputStream String etag=_wrapper.getETag(); if (etag!=null) - setHeader("ETag",etag.substring(0,etag.length()-1)+'-'+_encoding+'"'); + setHeader("ETag",etag.substring(0,etag.length()-1)+"--"+_encoding+'"'); return; } } diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHttpOutput.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHttpOutput.java index 3e41b51877e..bb77f37d5fc 100644 --- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHttpOutput.java +++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipHttpOutput.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.server.HttpChannel; import org.eclipse.jetty.server.HttpOutput; import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.servlets.AsyncGzipFilter; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.IteratingNestedCallback; @@ -195,7 +196,7 @@ public class GzipHttpOutput extends HttpOutput response.setContentLength(-1); String etag=fields.get(HttpHeader.ETAG); if (etag!=null) - fields.put(HttpHeader.ETAG,etag.substring(0,etag.length()-1)+"--gzip\""); + fields.put(HttpHeader.ETAG,etag.substring(0,etag.length()-1)+AsyncGzipFilter.ETAG_GZIP+ '"'); LOG.debug("{} compressing {}",this,_deflater); _state.set(GZState.COMPRESSING); diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java index dfb2ee46bf1..02e3d8a2b67 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppClassLoader.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; +import java.lang.instrument.Instrumentation; import java.net.URL; import java.net.URLClassLoader; import java.security.CodeSource; @@ -461,16 +462,43 @@ public class WebAppClassLoader extends URLClassLoader } /* ------------------------------------------------------------ */ + /** + * @see addTransformer + * @deprecated + */ public void addClassFileTransformer(ClassFileTransformer transformer) { _transformers.add(transformer); } /* ------------------------------------------------------------ */ + /** + * @see removeTransformer + * @deprecated + */ public boolean removeClassFileTransformer(ClassFileTransformer transformer) { return _transformers.remove(transformer); } + + /* ------------------------------------------------------------ */ + /** + * @see addClassFileTransformer + */ + public void addTransformer(ClassFileTransformer transformer) + { + _transformers.add(transformer); + } + + /* ------------------------------------------------------------ */ + /** + * @see removeClassFileTransformer + */ + public boolean removeTransformer(ClassFileTransformer transformer) + { + return _transformers.remove(transformer); + } + /* ------------------------------------------------------------ */ @Override diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java index 0e341fc2c9a..adf4e255e2a 100644 --- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java +++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java @@ -97,7 +97,7 @@ public class WebAppClassLoaderTest { final List results=new ArrayList(); - _loader.addClassFileTransformer(new ClassFileTransformer() + _loader.addTransformer(new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException @@ -109,7 +109,7 @@ public class WebAppClassLoaderTest return b; } }); - _loader.addClassFileTransformer(new ClassFileTransformer() + _loader.addTransformer(new ClassFileTransformer() { public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException