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 2016/09/26 11:42:26 UTC

svn commit: r1762324 - in /tomcat/trunk/java/org/apache/tomcat/websocket: WsFrameBase.java WsFrameClient.java server/WsFrameServer.java

Author: violetagg
Date: Mon Sep 26 11:42:26 2016
New Revision: 1762324

URL: http://svn.apache.org/viewvc?rev=1762324&view=rev
Log:
Websocket read implementation now uses SocketWrapperBase.read(boolean, ByteBuffer)

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java?rev=1762324&r1=1762323&r2=1762324&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java Mon Sep 26 11:42:26 2016
@@ -47,7 +47,7 @@ public abstract class WsFrameBase {
 
     // Connection level attributes
     protected final WsSession wsSession;
-    protected final byte[] inputBuffer;
+    protected final ByteBuffer inputBuffer;
     private final Transformation transformation;
 
     // Attributes for control messages
@@ -84,11 +84,10 @@ public abstract class WsFrameBase {
     // Attributes tracking state
     private volatile State state = State.NEW_FRAME;
     private volatile boolean open = true;
-    private volatile int readPos = 0;
-    protected volatile int writePos = 0;
 
     public WsFrameBase(WsSession wsSession, Transformation transformation) {
-        inputBuffer = new byte[Constants.DEFAULT_BUFFER_SIZE];
+        inputBuffer = ByteBuffer.allocate(Constants.DEFAULT_BUFFER_SIZE);
+        inputBuffer.position(0).limit(0);
         messageBufferBinary =
                 ByteBuffer.allocate(wsSession.getMaxBinaryMessageBufferSize());
         messageBufferText =
@@ -142,10 +141,10 @@ public abstract class WsFrameBase {
      */
     private boolean processInitialHeader() throws IOException {
         // Need at least two bytes of data to do this
-        if (writePos - readPos < 2) {
+        if (inputBuffer.remaining() < 2) {
             return false;
         }
-        int b = inputBuffer[readPos++];
+        int b = inputBuffer.get();
         fin = (b & 0x80) > 0;
         rsv = (b & 0x70) >>> 4;
         opCode = (byte) (b & 0x0F);
@@ -212,7 +211,7 @@ public abstract class WsFrameBase {
             }
             continuationExpected = !fin;
         }
-        b = inputBuffer[readPos++];
+        b = inputBuffer.get();
         // Client data must be masked
         if ((b & 0x80) == 0 && isMasked()) {
             throw new WsIOException(new CloseReason(
@@ -251,16 +250,18 @@ public abstract class WsFrameBase {
         } else if (payloadLength == 127) {
             headerLength += 8;
         }
-        if (writePos - readPos < headerLength) {
+        if (inputBuffer.remaining() < headerLength) {
             return false;
         }
         // Calculate new payload length if necessary
         if (payloadLength == 126) {
-            payloadLength = byteArrayToLong(inputBuffer, readPos, 2);
-            readPos += 2;
+            payloadLength = byteArrayToLong(inputBuffer.array(),
+                    inputBuffer.arrayOffset() + inputBuffer.position(), 2);
+            inputBuffer.position(inputBuffer.position() + 2);
         } else if (payloadLength == 127) {
-            payloadLength = byteArrayToLong(inputBuffer, readPos, 8);
-            readPos += 8;
+            payloadLength = byteArrayToLong(inputBuffer.array(),
+                    inputBuffer.arrayOffset() + inputBuffer.position(), 8);
+            inputBuffer.position(inputBuffer.position() + 8);
         }
         if (Util.isControl(opCode)) {
             if (payloadLength > 125) {
@@ -276,8 +277,7 @@ public abstract class WsFrameBase {
             }
         }
         if (isMasked()) {
-            System.arraycopy(inputBuffer, readPos, mask, 0, 4);
-            readPos += 4;
+            inputBuffer.get(mask, 0, 4);
         }
         state = State.DATA;
         return true;
@@ -607,9 +607,8 @@ public abstract class WsFrameBase {
 
 
     private void newFrame() {
-        if (readPos == writePos) {
-            readPos = 0;
-            writePos = 0;
+        if (inputBuffer.remaining() == 0) {
+            inputBuffer.position(0).limit(0);
         }
 
         maskIndex = 0;
@@ -626,7 +625,7 @@ public abstract class WsFrameBase {
     private void checkRoomHeaders() {
         // Is the start of the current frame too near the end of the input
         // buffer?
-        if (inputBuffer.length - readPos < 131) {
+        if (inputBuffer.capacity() - inputBuffer.position() < 131) {
             // Limit based on a control frame with a full payload
             makeRoom();
         }
@@ -634,17 +633,15 @@ public abstract class WsFrameBase {
 
 
     private void checkRoomPayload() {
-        if (inputBuffer.length - readPos - payloadLength + payloadWritten < 0) {
+        if (inputBuffer.capacity() - inputBuffer.position() - payloadLength + payloadWritten < 0) {
             makeRoom();
         }
     }
 
 
     private void makeRoom() {
-        System.arraycopy(inputBuffer, readPos, inputBuffer, 0,
-                writePos - readPos);
-        writePos = writePos - readPos;
-        readPos = 0;
+        inputBuffer.compact();
+        inputBuffer.flip();
     }
 
 
@@ -661,8 +658,8 @@ public abstract class WsFrameBase {
 
 
     private boolean swallowInput() {
-        long toSkip = Math.min(payloadLength - payloadWritten, writePos - readPos);
-        readPos += toSkip;
+        long toSkip = Math.min(payloadLength - payloadWritten, inputBuffer.remaining());
+        inputBuffer.position(inputBuffer.position() + (int) toSkip);
         payloadWritten += toSkip;
         if (payloadWritten == payloadLength) {
             if (continuationExpected) {
@@ -758,16 +755,18 @@ public abstract class WsFrameBase {
             // opCodes
             // rsv is ignored as it known to be zero at this point
             long toWrite = Math.min(
-                    payloadLength - payloadWritten, writePos - readPos);
+                    payloadLength - payloadWritten, inputBuffer.remaining());
             toWrite = Math.min(toWrite, dest.remaining());
 
-            dest.put(inputBuffer, readPos, (int) toWrite);
-            readPos += toWrite;
+            int orgLimit = inputBuffer.limit();
+            inputBuffer.limit(inputBuffer.position() + (int) toWrite);
+            dest.put(inputBuffer);
+            inputBuffer.limit(orgLimit);
             payloadWritten += toWrite;
 
             if (payloadWritten == payloadLength) {
                 return TransformationResult.END_OF_FRAME;
-            } else if (readPos == writePos) {
+            } else if (inputBuffer.remaining() == 0) {
                 return TransformationResult.UNDERFLOW;
             } else {
                 // !dest.hasRemaining()
@@ -797,20 +796,19 @@ public abstract class WsFrameBase {
             // 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 &&
+            while (payloadWritten < payloadLength && inputBuffer.remaining() > 0 &&
                     dest.hasRemaining()) {
-                byte b = (byte) ((inputBuffer[readPos] ^ mask[maskIndex]) & 0xFF);
+                byte b = (byte) ((inputBuffer.get() ^ mask[maskIndex]) & 0xFF);
                 maskIndex++;
                 if (maskIndex == 4) {
                     maskIndex = 0;
                 }
-                readPos++;
                 payloadWritten++;
                 dest.put(b);
             }
             if (payloadWritten == payloadLength) {
                 return TransformationResult.END_OF_FRAME;
-            } else if (readPos == writePos) {
+            } else if (inputBuffer.remaining() == 0) {
                 return TransformationResult.UNDERFLOW;
             } else {
                 // !dest.hasRemaining()

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java?rev=1762324&r1=1762323&r2=1762324&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java Mon Sep 26 11:42:26 2016
@@ -60,14 +60,20 @@ public class WsFrameClient extends WsFra
     private void processSocketRead() throws IOException {
 
         while (response.hasRemaining()) {
-            int remaining = response.remaining();
+            inputBuffer.mark();
+            inputBuffer.position(inputBuffer.limit()).limit(inputBuffer.capacity());
 
-            int toCopy = Math.min(remaining, inputBuffer.length - writePos);
+            int toCopy = Math.min(response.remaining(), inputBuffer.remaining());
 
             // Copy remaining bytes read in HTTP phase to input buffer used by
             // frame processing
-            response.get(inputBuffer, writePos, toCopy);
-            writePos += toCopy;
+
+            int orgLimit = response.limit();
+            response.limit(response.position() + toCopy);
+            inputBuffer.put(response);
+            response.limit(orgLimit);
+
+            inputBuffer.limit(inputBuffer.position()).reset();
 
             // Process the data we have
             processInputBuffer();

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java?rev=1762324&r1=1762323&r2=1762324&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java Mon Sep 26 11:42:26 2016
@@ -57,15 +57,16 @@ public class WsFrameServer extends WsFra
         }
         while (isOpen() && socketWrapper.isReadyForRead()) {
             // Fill up the input buffer with as much data as we can
-            int read = socketWrapper.read(
-                    false, inputBuffer, writePos, inputBuffer.length - writePos);
+            inputBuffer.mark();
+            inputBuffer.position(inputBuffer.limit()).limit(inputBuffer.capacity());
+            int read = socketWrapper.read(false, inputBuffer);
+            inputBuffer.limit(inputBuffer.position()).reset();
             if (read <= 0) {
                 return;
             }
             if (log.isDebugEnabled()) {
                 log.debug(sm.getString("wsFrameServer.bytesRead", Integer.toString(read)));
             }
-            writePos += read;
             processInputBuffer();
         }
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org