> > > Patches welcome. >
something like this? (only for text changes only in WsFrameBase) in the constructor of WsFrameBase // take the minimum from what is set by the user or the default. messageBufferText = CharBuffer.allocate(Math.min(Constants.DEFAULT_BUFFER_SIZE,wsSession.getMaxTextMessageBufferSize() )); so always init on the smallest set buffer size. and then for example in processDataText() remove all the userPartial() tests and the throw TooBig exceptions so only do always just (i think on 3 places) messageBufferText.flip(); sendMessageText(false); messageBufferText.clear(); in sendMessageText could become: private volatile StringBuilder messageBuffer; private void sendMessageText(boolean last) throws WsIOException { String message = null; if (!last) { // if this is not the last part, append it to the StringBuilder buffer. if (messageBuilder == null) messageBuilder = new StringBuilder(messageBufferText.length()*2); if ( (messageBuilder.length() + messageBufferText.length()) <= wsSession.getMaxTextMessageBufferSize()) { messageBuilder.append(messageBufferText.toString()); messageBufferText.clear(); return; } else if (usePartial()) { // if the stringbuilder buffer added with the current buffered text is greater then the max buffer size // then send this if partial is supported. message = messageBuilder.toString(); // reset the current buffered string builder. messageBuilder = null; // call resend so that the current BufferedText is added. sendMessageText(last); } else { // if partial is not supported throw the to big exception. throw new WsIOException(new CloseReason( CloseCodes.TOO_BIG, sm.getString("wsFrame.textMessageTooBig"))); } } else { // it was the last, if (messageBuilder == null) { // it was not part of a bigger one, just take the current message message = messageBufferText.toString(); } else { // it is the last of a bigger one, check the buffered size if ( (messageBuilder.length() + messageBufferText.length()) > wsSession.getMaxTextMessageBufferSize()) { throw new WsIOException(new CloseReason( CloseCodes.TOO_BIG, sm.getString("wsFrame.textMessageTooBig"))); } // size is correct append the last part and extract the complete message messageBuilder.append(messageBufferText.toString()); message = messageBuilder.toString(); messageBuilder = null; } } if (textMsgHandler != null) { if (textMsgHandler instanceof WrappedMessageHandler) { long maxMessageSize = ((WrappedMessageHandler) textMsgHandler).getMaxMessageSize(); if (maxMessageSize > -1 && message.length() > maxMessageSize) { throw new WsIOException(new CloseReason(CloseCodes.TOO_BIG, sm.getString("wsFrame.messageTooBig", Long.valueOf(messageBufferText.remaining()), Long.valueOf(maxMessageSize)))); } } try { if (textMsgHandler instanceof MessageHandler.Partial<?>) { ((MessageHandler.Partial<String>) textMsgHandler).onMessage( message, last); } else { // Caller ensures last == true if this branch is used ((MessageHandler.Whole<String>) textMsgHandler).onMessage( message); } } catch (Throwable t) { ExceptionUtils.handleThrowable(t); wsSession.getLocal().onError(wsSession, t); } } }