Author: markt Date: Wed Apr 6 17:15:45 2016 New Revision: 1738009 URL: http://svn.apache.org/viewvc?rev=1738009&view=rev Log: Restore correct class loader during processing of WebSocket messages post the 8.5.x/9.0.x connector refactoring
Added: tomcat/tc8.5.x/trunk/test/org/apache/tomcat/websocket/server/TestClassLoader.java - copied unchanged from r1738005, tomcat/trunk/test/org/apache/tomcat/websocket/server/TestClassLoader.java Modified: tomcat/tc8.5.x/trunk/ (props changed) tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc8.5.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Apr 6 17:15:45 2016 @@ -1 +1 @@ -/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737959 +/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737959,1738005,1738007 Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java?rev=1738009&r1=1738008&r2=1738009&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java Wed Apr 6 17:15:45 2016 @@ -377,7 +377,7 @@ public abstract class WsFrameBase { @SuppressWarnings("unchecked") - private void sendMessageText(boolean last) throws WsIOException { + protected void sendMessageText(boolean last) throws WsIOException { if (textMsgHandler instanceof WrappedMessageHandler) { long maxMessageSize = ((WrappedMessageHandler) textMsgHandler).getMaxMessageSize(); @@ -572,7 +572,7 @@ public abstract class WsFrameBase { @SuppressWarnings("unchecked") - private void sendMessageBinary(ByteBuffer msg, boolean last) + protected void sendMessageBinary(ByteBuffer msg, boolean last) throws WsIOException { if (binaryMsgHandler instanceof WrappedMessageHandler) { long maxMessageSize = Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java?rev=1738009&r1=1738008&r2=1738009&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java Wed Apr 6 17:15:45 2016 @@ -17,6 +17,7 @@ package org.apache.tomcat.websocket.server; import java.io.IOException; +import java.nio.ByteBuffer; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -24,6 +25,7 @@ import org.apache.tomcat.util.net.Socket import org.apache.tomcat.util.res.StringManager; import org.apache.tomcat.websocket.Transformation; import org.apache.tomcat.websocket.WsFrameBase; +import org.apache.tomcat.websocket.WsIOException; import org.apache.tomcat.websocket.WsSession; public class WsFrameServer extends WsFrameBase { @@ -32,12 +34,14 @@ public class WsFrameServer extends WsFra private static final StringManager sm = StringManager.getManager(WsFrameServer.class); private final SocketWrapperBase<?> socketWrapper; + private final ClassLoader applicationClassLoader; public WsFrameServer(SocketWrapperBase<?> socketWrapper, WsSession wsSession, - Transformation transformation) { + Transformation transformation, ClassLoader applicationClassLoader) { super(wsSession, transformation); this.socketWrapper = socketWrapper; + this.applicationClassLoader = applicationClassLoader; } @@ -92,4 +96,28 @@ public class WsFrameServer extends WsFra protected Log getLog() { return log; } + + + @Override + protected void sendMessageText(boolean last) throws WsIOException { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(applicationClassLoader); + super.sendMessageText(last); + } finally { + Thread.currentThread().setContextClassLoader(cl); + } + } + + + @Override + protected void sendMessageBinary(ByteBuffer msg, boolean last) throws WsIOException { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(applicationClassLoader); + super.sendMessageBinary(msg, last); + } finally { + Thread.currentThread().setContextClassLoader(cl); + } + } } Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1738009&r1=1738008&r2=1738009&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Wed Apr 6 17:15:45 2016 @@ -126,7 +126,8 @@ public class WsHttpUpgradeHandler implem handshakeRequest.getUserPrincipal(), httpSessionId, negotiatedExtensions, subProtocol, pathParameters, secure, endpointConfig); - wsFrame = new WsFrameServer(socketWrapper, wsSession, transformation); + wsFrame = new WsFrameServer(socketWrapper, wsSession, transformation, + applicationClassLoader); // WsFrame adds the necessary final transformations. Copy the // completed transformation chain to the remote end point. wsRemoteEndpointServer.setTransformation(wsFrame.getTransformation()); Modified: tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml?rev=1738009&r1=1738008&r2=1738009&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Wed Apr 6 17:15:45 2016 @@ -141,6 +141,11 @@ to allow frameworks to more easily dispatch requests to WebSocket endpoints. (violetagg) </fix> + <fix> + Fix a regression caused by the connector refactoring and ensure that the + thread context class loader is set to the to the web application + classloder when processing WebSocket messages on the server. (markt) + </fix> </changelog> </subsection> <subsection name="Web applications"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org