code: private boolean decodeBulkStringContent(ByteBuf in, List<Object> out) throws Exception {
          final int readableBytes = in.readableBytes();
          if (readableBytes == 0 || remainingBulkLength == 0 && readableBytes < RedisConstants.EOL_LENGTH) {
              return false;
          }
  
          // if this is last frame.
          if (readableBytes >= remainingBulkLength + RedisConstants.EOL_LENGTH) {
              ByteBuf content = in.readSlice(remainingBulkLength);
              readEndOfLine(in);
              // Only call retain after readEndOfLine(...) as the method may throw an exception.
              out.add(new DefaultLastBulkStringRedisContent(content.retain()));
              resetDecoder();
              return true;
          }
  
          // chunked write.
          int toRead = Math.min(remainingBulkLength, readableBytes);
          remainingBulkLength -= toRead;
          out.add(new DefaultBulkStringRedisContent(in.readSlice(toRead).retain()));
          return true;
      }
docs: ${expectedBulkLength}\r\n <here> {data...}\r\n