>
>
> 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);
            }
        }
    }

Reply via email to