docs: public void ungetRequestBytes(final PooledByteBuffer unget) {
          if (getExtraBytes() == null) {
              setExtraBytes(unget);
          } else {
              PooledByteBuffer eb = getExtraBytes();
              ByteBuffer buf = eb.getBuffer();
              final ByteBuffer ugBuffer = unget.getBuffer();
  
              if (ugBuffer.limit() - ugBuffer.remaining() > buf.remaining()) {
                  //stuff the existing data after the data we are ungetting
                  ugBuffer.compact();
                  ugBuffer.put(buf);
                  ugBuffer.flip();
                  eb.close();
                  setExtraBytes(unget);
              } else {
                  //TODO: this is horrible, but should not happen often
                  final byte[] data = new byte[ugBuffer.remaining() + buf.remaining()];
                  int first = ugBuffer.remaining();
                  ugBuffer.get(data, 0, ugBuffer.remaining());
                  buf.get(data, first, buf.remaining());
                  eb.close();
                  unget.close();
                  final ByteBuffer newBuffer = ByteBuffer.wrap(data);
                  setExtraBytes(new ImmediatePooledByteBuffer(newBuffer));
              }
          }
      }