docs: public List<WsByteBuffer> decompress(WsByteBuffer inputBuffer) throws DataFormatException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "decompress, input=" + inputBuffer);
          }
          List<WsByteBuffer> list = new LinkedList<WsByteBuffer>();
          int dataSize = inputBuffer.remaining();
          byte[] input = new byte[dataSize];
          inputBuffer.get(input, 0, dataSize);
          int inOffset = 0;
  
          //if the inflater is finished, then this is a repeat call
          //to decompress with the same handler and a reset is required
          if (this.inflater.finished())
              reset();
  
          if (!this.inflater.finished()) {
              this.inflater.setInput(input, inOffset, dataSize - inOffset);
          }
          long initialBytesRead = this.inflater.getBytesRead();
          int outOffset = 0;
  
          // keep decompressing until we've used up the entire input buffer or reached
          // the end of the compressed stream
          int len = -1;
          while (inOffset < input.length && !this.inflater.finished() && 0 != len) {
              try {
                  len = this.inflater.inflate(this.buf, outOffset, this.buf.length - outOffset);
              } catch (DataFormatException dfe) {
                  // no FFDC required, clean up any buffers we've allocated so far
                  release(list);
                  throw dfe;
              }
              long bytesRead = this.inflater.getBytesRead();
              inOffset += (bytesRead - initialBytesRead);
              initialBytesRead = bytesRead;
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Decompressed amount=" + len + " inOffset=" + inOffset + " read=" + this.inflater.getBytesRead() + " written=" + this.inflater.getBytesWritten()
                               + " finished=" + this.inflater.finished());
              }
              outOffset += len;
              if (outOffset == this.buf.length) {
                  WsByteBuffer buffer = HttpDispatcher.getBufferManager().allocate(this.buf.length);
                  buffer.put(this.buf, 0, this.buf.length);
                  buffer.flip();
                  list.add(buffer);
                  outOffset = 0;
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Storing decompressed buffer; " + buffer);
                  }
              }
          }
          // save off any extra output that is ready
          if (0 < outOffset) {
              WsByteBuffer buffer = HttpDispatcher.getBufferManager().allocate(outOffset);
              buffer.put(this.buf, 0, outOffset);
              buffer.flip();
              list.add(buffer);
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Stored final decompressed buffer; " + buffer);
              }
          }
          if (inOffset < dataSize) {
              // did not use the entire buffer
              inputBuffer.position(inputBuffer.position() - (dataSize - inOffset));
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "input buffer has unused data; " + inputBuffer);
              }
          }
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "decompress, output=" + list.size());
          }
          return list;
      }