code: private boolean readData(ReadStream is,
                             int length,
                             int flags,
                             int streamId)
      throws IOException
    {
      ChannelHttp2 channel = _conn.getChannel(streamId);
      
      if (channel == null) {
        throw new IllegalStateException(L.l("Stream {0} is closed", streamId));
      }
      
      ChannelInHttp2 inChannel = channel.getInChannel();
      
      ChannelFlowHttp2 channelZero = _conn.channelZero();
      channelZero.onData(length, _conn, 0);
      
      boolean isEndStream = (flags & Http2Constants.END_STREAM) != 0;
  
      if (! isEndStream) {
        inChannel.onData(length, _conn, streamId);
      }
      
      while (length > 0) {
        TempBuffer tBuf;
      
        if (length < TempBuffer.SMALL_SIZE) {
          tBuf = TempBuffer.createSmall();
        }
        else {
          tBuf = TempBuffer.create();
        }
        
        byte []buffer = tBuf.buffer();
        
        int sublen = Math.min(length, buffer.length);
        
        sublen = is.readAll(buffer, 0, sublen);
        
        if (sublen < 0) {
          tBuf.free();
          
          return false;
        }
        
        tBuf.length(sublen);
        inChannel.onData(tBuf);
        
        length -= sublen;
      }
      
      if (isEndStream) {
        inChannel.close();
        
        if (onCloseStream() <= 0) {
          _inHandler.onGoAway();
        }
      }
      
      return true;
    }
docs: data (op=0)