private void handleNewFrame(
     StreamSourceFrameChannel channel, final WebSocketCallback<BufferedBinaryMessage> callback) {
   // TODO: remove this crap
   // basically some bogus web sockets TCK tests assume that messages will be broken up into frames
   // even if we have the full message available.
   if (!bufferFullMessage) {
     if (channel.getWebSocketFrameCount() != frameCount
         && current != null
         && !channel.isFinalFragment()) {
       frameCount = channel.getWebSocketFrameCount();
       callback.complete(channel.getWebSocketChannel(), this);
     }
   }
 }
 private void dealWithFullBuffer(StreamSourceFrameChannel channel) {
   if (!current.getResource().hasRemaining()) {
     current.getResource().flip();
     data.add(current);
     current = channel.getWebSocketChannel().getBufferPool().allocate();
   }
 }
 public void readBlocking(StreamSourceFrameChannel channel) throws IOException {
   if (current == null) {
     current = channel.getWebSocketChannel().getBufferPool().allocate();
   }
   for (; ; ) {
     int res = channel.read(current.getResource());
     if (res == -1) {
       complete = true;
       return;
     } else if (res == 0) {
       channel.awaitReadable();
     }
     checkMaxSize(channel, res);
     if (bufferFullMessage) {
       dealWithFullBuffer(channel);
     } else if (!current.getResource().hasRemaining()) {
       return;
     }
   }
 }
 private void checkMaxSize(StreamSourceFrameChannel channel, int res) throws IOException {
   currentSize += res;
   if (maxMessageSize > 0 && currentSize > maxMessageSize) {
     WebSockets.sendClose(
         new CloseMessage(
                 CloseMessage.MSG_TOO_BIG, WebSocketMessages.MESSAGES.messageToBig(maxMessageSize))
             .toByteBuffer(),
         channel.getWebSocketChannel(),
         null);
     throw new IOException(WebSocketMessages.MESSAGES.messageToBig(maxMessageSize));
   }
 }
  public void read(
      final StreamSourceFrameChannel channel,
      final WebSocketCallback<BufferedBinaryMessage> callback) {
    try {
      for (; ; ) {
        if (current == null) {
          current = channel.getWebSocketChannel().getBufferPool().allocate();
        }
        int res = channel.read(current.getResource());
        if (res == -1) {
          this.complete = true;
          callback.complete(channel.getWebSocketChannel(), this);
          return;
        } else if (res == 0) {
          channel
              .getReadSetter()
              .set(
                  new ChannelListener<StreamSourceFrameChannel>() {
                    @Override
                    public void handleEvent(StreamSourceFrameChannel channel) {
                      try {
                        for (; ; ) {
                          if (current == null) {
                            current = channel.getWebSocketChannel().getBufferPool().allocate();
                          }
                          int res = channel.read(current.getResource());
                          if (res == -1) {
                            complete = true;
                            channel.suspendReads();
                            callback.complete(
                                channel.getWebSocketChannel(), BufferedBinaryMessage.this);
                            return;
                          } else if (res == 0) {
                            return;
                          }

                          checkMaxSize(channel, res);
                          if (bufferFullMessage) {
                            dealWithFullBuffer(channel);
                          } else if (!current.getResource().hasRemaining()) {
                            callback.complete(
                                channel.getWebSocketChannel(), BufferedBinaryMessage.this);
                          } else {
                            handleNewFrame(channel, callback);
                          }
                        }
                      } catch (IOException e) {
                        channel.suspendReads();
                        callback.onError(
                            channel.getWebSocketChannel(), BufferedBinaryMessage.this, e);
                      }
                    }
                  });
          channel.resumeReads();
          return;
        }

        checkMaxSize(channel, res);
        if (bufferFullMessage) {
          dealWithFullBuffer(channel);
        } else if (!current.getResource().hasRemaining()) {
          callback.complete(channel.getWebSocketChannel(), BufferedBinaryMessage.this);
        } else {
          handleNewFrame(channel, callback);
        }
      }
    } catch (IOException e) {
      callback.onError(channel.getWebSocketChannel(), this, e);
    }
  }