You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/02/13 12:24:16 UTC
svn commit: r1445556 - in /tomcat/trunk/java/org/apache/tomcat/websocket:
Constants.java WsFrameBase.java WsFrameClient.java WsSession.java
WsWebSocketContainer.java server/WsFrameServer.java
server/WsProtocolHandler.java
Author: markt
Date: Wed Feb 13 11:24:16 2013
New Revision: 1445556
URL: http://svn.apache.org/r1445556
Log:
Implement per session message buffer size limits and check them on every new message.
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
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/WsSession.java
tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java?rev=1445556&r1=1445555&r2=1445556&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java Wed Feb 13 11:24:16 2013
@@ -36,6 +36,9 @@ public class Constants {
// Always set bit 4 so these will be treated as control codes
static final byte INTERNAL_OPCODE_FLUSH = 0x18;
+ // Buffers
+ static final int DEFAULT_BUFFER_SIZE = 8 * 1024;
+
// Client connection
public static final String HOST_HEADER_NAME = "Host";
public static final String UPGRADE_HEADER_NAME = "Upgrade";
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=1445556&r1=1445555&r2=1445556&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java Wed Feb 13 11:24:16 2013
@@ -51,9 +51,6 @@ public abstract class WsFrameBase {
private final CharBuffer controlBufferText = CharBuffer.allocate(125);
// Attributes of the current message
- // TODO: May need a new ByteBuffer per message
- private final ByteBuffer messageBufferBinary;
- private final CharBuffer messageBufferText;
private final CharsetDecoder utf8DecoderControl = new Utf8Decoder().
onMalformedInput(CodingErrorAction.REPORT).
onUnmappableCharacter(CodingErrorAction.REPORT);
@@ -62,6 +59,9 @@ public abstract class WsFrameBase {
onUnmappableCharacter(CodingErrorAction.REPORT);
private boolean continuationExpected = false;
private boolean textMessage = false;
+ // TODO: May need a new ByteBuffer per message
+ private ByteBuffer messageBufferBinary;
+ private CharBuffer messageBufferText;
// Attributes of the current frame
private boolean fin = false;
@@ -77,12 +77,13 @@ public abstract class WsFrameBase {
private int readPos = 0;
protected int writePos = 0;
- public WsFrameBase(int binaryMessageBufferSize, int textMessageBufferSize,
- WsSession wsSession) {
+ public WsFrameBase(WsSession wsSession) {
- inputBuffer = new byte[binaryMessageBufferSize];
- messageBufferBinary = ByteBuffer.allocate(binaryMessageBufferSize);
- messageBufferText = CharBuffer.allocate(textMessageBufferSize);
+ inputBuffer = new byte[Constants.DEFAULT_BUFFER_SIZE];
+ messageBufferBinary =
+ ByteBuffer.allocate(wsSession.getMaxBinaryMessageBufferSize());
+ messageBufferText =
+ CharBuffer.allocate(wsSession.getMaxTextMessageBufferSize());
this.wsSession = wsSession;
}
@@ -151,9 +152,19 @@ public abstract class WsFrameBase {
}
} else {
if (opCode == Constants.OPCODE_BINARY) {
+ // New binary message
textMessage = false;
+ int size = wsSession.getMaxBinaryMessageBufferSize();
+ if (size != messageBufferBinary.capacity()) {
+ messageBufferBinary = ByteBuffer.allocate(size);
+ }
} else if (opCode == Constants.OPCODE_TEXT) {
+ // New text message
textMessage = true;
+ int size = wsSession.getMaxTextMessageBufferSize();
+ if (size != messageBufferText.capacity()) {
+ messageBufferText = CharBuffer.allocate(size);
+ }
} else {
throw new WsIOException(new CloseReason(
CloseCodes.PROTOCOL_ERROR,
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=1445556&r1=1445555&r2=1445556&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java Wed Feb 13 11:24:16 2013
@@ -31,9 +31,8 @@ public class WsFrameClient extends WsFra
private final CompletionHandler<Integer,Void> handler;
public WsFrameClient(ByteBuffer response, AsynchronousSocketChannel channel,
- int binaryMessageBufferSize, int textMessageBufferSize,
WsSession wsSession) {
- super(binaryMessageBufferSize, textMessageBufferSize, wsSession);
+ super(wsSession);
this.response = response;
this.channel = channel;
this.handler = new WsFrameClientCompletionHandler();
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1445556&r1=1445555&r2=1445556&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Wed Feb 13 11:24:16 2013
@@ -59,6 +59,10 @@ public class WsSession implements Sessio
private volatile boolean open = true;
private final Object closeLock = new Object();
private Map<String,Object> userProperties = new ConcurrentHashMap<>();
+ private volatile int maxBinaryMessageBufferSize =
+ Constants.DEFAULT_BUFFER_SIZE;
+ private volatile int maxTextMessageBufferSize =
+ Constants.DEFAULT_BUFFER_SIZE;
/**
@@ -79,6 +83,10 @@ public class WsSession implements Sessio
applicationClassLoader = Thread.currentThread().getContextClassLoader();
wsRemoteEndpoint.setAsyncSendTimeout(
webSocketContainer.getDefaultAsyncSendTimeout());
+ this.maxBinaryMessageBufferSize =
+ webSocketContainer.getDefaultMaxBinaryMessageBufferSize();
+ this.maxTextMessageBufferSize =
+ webSocketContainer.getDefaultMaxTextMessageBufferSize();
}
@@ -206,33 +214,27 @@ public class WsSession implements Sessio
}
-
-
@Override
public void setMaxBinaryMessageBufferSize(int max) {
- // TODO Auto-generated method stub
-
+ this.maxBinaryMessageBufferSize = max;
}
@Override
public int getMaxBinaryMessageBufferSize() {
- // TODO Auto-generated method stub
- return 0;
+ return maxBinaryMessageBufferSize;
}
@Override
public void setMaxTextMessageBufferSize(int max) {
- // TODO Auto-generated method stub
-
+ this.maxTextMessageBufferSize = max;
}
@Override
public int getMaxTextMessageBufferSize() {
- // TODO Auto-generated method stub
- return 0;
+ return maxTextMessageBufferSize;
}
@@ -326,6 +328,20 @@ public class WsSession implements Sessio
@Override
+ public String getId() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ @Override
+ public Principal getUserPrincipal() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ @Override
public Map<String,Object> getUserProperties() {
return userProperties;
}
@@ -416,18 +432,4 @@ public class WsSession implements Sessio
return null;
}
}
-
-
- @Override
- public String getId() {
- // TODO Auto-generated method stub
- return null;
- }
-
-
- @Override
- public Principal getUserPrincipal() {
- // TODO Auto-generated method stub
- return null;
- }
}
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1445556&r1=1445555&r2=1445556&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Wed Feb 13 11:24:16 2013
@@ -52,11 +52,10 @@ public class WsWebSocketContainer implem
private static final Random random = new Random();
private static final Charset iso88591 = Charset.forName("ISO-8859-1");
private static final byte[] crlf = new byte[] {13, 10};
- private static final int DEFAULT_BUFFER_SIZE = 8 * 1024;
private long defaultAsyncTimeout = -1;
- private int maxBinaryMessageBufferSize = DEFAULT_BUFFER_SIZE;
- private int maxTextMessageBufferSize = DEFAULT_BUFFER_SIZE;
+ private int maxBinaryMessageBufferSize = Constants.DEFAULT_BUFFER_SIZE;
+ private int maxTextMessageBufferSize = Constants.DEFAULT_BUFFER_SIZE;
@Override
public Session connectToServer(Class<?> annotatedEndpointClass, URI path)
@@ -154,7 +153,6 @@ public class WsWebSocketContainer implem
// Object creation will trigger input processing
@SuppressWarnings("unused")
WsFrameClient wsFrameClient = new WsFrameClient(response, channel,
- maxBinaryMessageBufferSize, maxTextMessageBufferSize,
wsSession);
return wsSession;
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=1445556&r1=1445555&r2=1445556&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java Wed Feb 13 11:24:16 2013
@@ -30,9 +30,8 @@ public class WsFrameServer extends WsFra
private final Object connectionReadLock = new Object();
- public WsFrameServer(ServletInputStream sis, int binaryMessageBufferSize,
- int textMessageBufferSize, WsSession wsSession) {
- super(binaryMessageBufferSize, textMessageBufferSize, wsSession);
+ public WsFrameServer(ServletInputStream sis, WsSession wsSession) {
+ super(wsSession);
this.sis = sis;
}
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java?rev=1445556&r1=1445555&r2=1445556&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java Wed Feb 13 11:24:16 2013
@@ -88,8 +88,6 @@ public class WsProtocolHandler implement
ep, wsRemoteEndpointServer, webSocketContainer);
WsFrameServer wsFrame = new WsFrameServer(
sis,
- webSocketContainer.getDefaultMaxBinaryMessageBufferSize(),
- webSocketContainer.getDefaultMaxTextMessageBufferSize(),
wsSession);
sis.setReadListener(new WsReadListener(this, wsFrame));
sos.setWriteListener(
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org