You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by vi...@apache.org on 2014/09/13 18:18:57 UTC
svn commit: r1624761 - in /tomcat/tc7.0.x/trunk: ./
java/org/apache/tomcat/websocket/Transformation.java
java/org/apache/tomcat/websocket/WsFrameBase.java
Author: violetagg
Date: Sat Sep 13 16:18:56 2014
New Revision: 1624761
URL: http://svn.apache.org/r1624761
Log:
Merged revisions 1604776, 1604818 from tomcat/trunk:
- Add an interface for the transformation (by an extension) of WebSocket frames. Only supports transformation of incoming messages at this point.
- Add some inner classes that will be required when Transformation / extension support is plumbed in.
Added:
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/Transformation.java
- copied unchanged from r1604776, tomcat/trunk/java/org/apache/tomcat/websocket/Transformation.java
Modified:
tomcat/tc7.0.x/trunk/ (props changed)
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java
Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
Merged /tomcat/trunk:r1604776,1604818
Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java?rev=1624761&r1=1624760&r2=1624761&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java Sat Sep 13 16:18:56 2014
@@ -25,6 +25,7 @@ import java.nio.charset.CodingErrorActio
import javax.websocket.CloseReason;
import javax.websocket.CloseReason.CloseCodes;
+import javax.websocket.Extension;
import javax.websocket.MessageHandler;
import javax.websocket.PongMessage;
@@ -698,4 +699,86 @@ public abstract class WsFrameBase {
private static enum State {
NEW_FRAME, PARTIAL_HEADER, DATA
}
+
+
+ private abstract class TerminalTransformation implements Transformation {
+
+ @Override
+ public boolean validateRsvBits(int i) {
+ // Terminal transformations don't use RSV bits and there is no next
+ // transformation so always return true.
+ return true;
+ }
+
+ @Override
+ public Extension getExtensionResponse() {
+ // Return null since terminal transformations are not extensions
+ return null;
+ }
+
+ @Override
+ public void setNext(Transformation t) {
+ // NO-OP since this is the terminal transformation
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * Anything other than a value of zero for rsv is invalid.
+ */
+ @Override
+ public boolean validateRsv(int rsv, byte opCode) {
+ return rsv == 0;
+ }
+ }
+
+
+ /**
+ * For use by the client implementation that needs to obtain payload data
+ * without the need for unmasking.
+ */
+ private final class NoopTransformation extends TerminalTransformation {
+
+ @Override
+ public boolean getMoreData(byte opCode, int rsv, ByteBuffer dest) {
+ // opCode is ignored as the transformation is the same for all
+ // opCodes
+ // rsv is ignored as it known to be zero at this point
+ long toWrite = Math.min(
+ payloadLength - payloadWritten, writePos - readPos);
+ toWrite = Math.min(toWrite, dest.remaining());
+
+ dest.put(inputBuffer, readPos, (int) toWrite);
+ readPos += toWrite;
+ payloadWritten += toWrite;
+ return (payloadWritten == payloadLength);
+ }
+ }
+
+
+ /**
+ * For use by the server implementation that needs to obtain payload data
+ * and unmask it before any further processing.
+ */
+ private final class UnmaskTransformation extends TerminalTransformation {
+
+ @Override
+ public boolean getMoreData(byte opCode, int rsv, ByteBuffer dest) {
+ // opCode is ignored as the transformation is the same for all
+ // opCodes
+ // rsv is ignored as it known to be zero at this point
+ while (payloadWritten < payloadLength && readPos < writePos &&
+ dest.hasRemaining()) {
+ byte b = (byte) ((inputBuffer[readPos] ^ mask[maskIndex]) & 0xFF);
+ maskIndex++;
+ if (maskIndex == 4) {
+ maskIndex = 0;
+ }
+ readPos++;
+ payloadWritten++;
+ dest.put(b);
+ }
+ return (payloadWritten == payloadLength);
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org