public static Buffer appendContentAndTrim(
      final MemoryManager memoryManager, Buffer dstBuffer, Buffer httpContentBuffer) {
    Buffer resultBuffer = null;
    do {
      Buffer contentRemainder = null;
      if (httpContentBuffer.remaining() > MAX_BODY_CHUNK_CONTENT_SIZE) {
        contentRemainder =
            httpContentBuffer.split(httpContentBuffer.position() + MAX_BODY_CHUNK_CONTENT_SIZE);
      }

      final Buffer encodedContentChunk =
          appendContentChunkAndTrim(memoryManager, dstBuffer, httpContentBuffer);
      resultBuffer = Buffers.appendBuffers(memoryManager, resultBuffer, encodedContentChunk);

      // dstBuffer use only once, when it comes from caller
      dstBuffer = null;
      httpContentBuffer = contentRemainder;
    } while (httpContentBuffer != null && httpContentBuffer.hasRemaining());

    return resultBuffer;
  }
  /**
   * @param size the requested size of the {@link Buffer} to be returned.
   * @return the {@link Buffer} of a given size, which represents a chunk of the underlying {@link
   *     Buffer} which contains incoming request data. This method detaches the returned {@link
   *     Buffer}, so user code becomes responsible for handling its life-cycle.
   */
  public Buffer readBuffer(final int size) {
    if (LOGGER.isLoggable(LOGGER_LEVEL)) {
      log(
          "InputBuffer %s readBuffer(size), size: %s. Ready content: %s",
          this, size, inputContentBuffer);
    }

    final int remaining = inputContentBuffer.remaining();
    if (size > remaining) {
      throw new IllegalStateException("Can not read more bytes than available");
    }

    final Buffer buffer;
    if (size == remaining) {
      buffer = inputContentBuffer;
      inputContentBuffer = Buffers.EMPTY_BUFFER;
    } else {
      final Buffer tmpBuffer = inputContentBuffer.split(inputContentBuffer.position() + size);
      buffer = inputContentBuffer;
      inputContentBuffer = tmpBuffer;
    }

    return buffer;
  }