code: @Override
      public int read(final byte[] b, final int off, final int len) throws IOException {
  
          if (closed) {
              throw new IOException("Attempted read from closed stream.");
          }
  
          if (eof) {
              return -1;
          }
          if (state != CHUNK_DATA) {
              nextChunk();
              if (eof) {
                  return -1;
              }
          }
          final int bytesRead = in.read(b, off, (int) Math.min(len, chunkSize - pos));
          if (bytesRead != -1) {
              pos += bytesRead;
              if (pos >= chunkSize) {
                  state = CHUNK_CRLF;
              }
              return bytesRead;
          } else {
              eof = true;
              throw new TruncatedChunkException("Truncated chunk "
                      + "( expected size: " + chunkSize
                      + "; actual size: " + pos + ")");
          }
      }
docs: Read some bytes from the stream.
  @param b The byte array that will hold the contents from the stream.
  @param off The offset into the byte array at which bytes will start to be
  placed.
  @param len the maximum number of bytes that can be returned.
  @return The number of bytes returned or -1 if the end of stream has been
  reached.
  @throws IOException in case of an I/O error