@Nullable
  protected final <T> T readContent(@NotNull ByteBuf input, @NotNull ChannelHandlerContext context, int contentLength, @NotNull FullMessageConsumer<T> fullMessageConsumer) throws IOException {
    ByteBuf buffer = getBufferIfSufficient(input, contentLength, context);
    if (buffer == null) {
      return null;
    }

    boolean isCumulateBuffer = buffer != input;
    int oldReaderIndex = input.readerIndex();
    try {
      return fullMessageConsumer.contentReceived(buffer, context, isCumulateBuffer);
    }
    finally {
      if (isCumulateBuffer) {
        // cumulation buffer - release it
        buffer.release();
      }
      else {
        buffer.readerIndex(oldReaderIndex + contentLength);
      }
    }
  }
@Nullable
  protected final <T> T readContent(@NotNull ByteBuf input, @NotNull ChannelHandlerContext context, int contentLength, @NotNull FullMessageConsumer<T> fullMessageConsumer)