code: private byte[] getInputStreamAsByteArray(InputStream stream, int length)
  			throws IOException {
  		byte[] contents;
  		if (length == -1) {
  			contents = new byte[0];
  			int contentsLength = 0;
  			int amountRead = -1;
  			do {
  				int amountRequested = Math.max(stream.available(), DEFAULT_READING_SIZE);  // read at least 8K
  
  				// resize contents if needed
  				if (contentsLength + amountRequested > contents.length) {
  					System.arraycopy(
  						contents,
  						0,
  						contents = new byte[contentsLength + amountRequested],
  						0,
  						contentsLength);
  				}
  
  				// read as many bytes as possible
  				amountRead = stream.read(contents, contentsLength, amountRequested);
  
  				if (amountRead > 0) {
  					// remember length of contents
  					contentsLength += amountRead;
  				}
  			} while (amountRead != -1);
  
  			// resize contents if necessary
  			if (contentsLength < contents.length) {
  				System.arraycopy(
  					contents,
  					0,
  					contents = new byte[contentsLength],
  					0,
  					contentsLength);
  			}
  		} else {
  			contents = new byte[length];
  			int len = 0;
  			int readSize = 0;
  			while ((readSize != -1) && (len != length)) {
  				// See PR 1FMS89U
  				// We record first the read size. In this case len is the actual read size.
  				len += readSize;
  				readSize = stream.read(contents, len, length - len);
  			}
  		}
  
  		return contents;
  	}
docs: Returns the given input stream's contents as a byte array.
  If a length is specified (i.e. if length != -1), only length bytes
  are returned. Otherwise all bytes in the stream are returned.
  Note this doesn't close the stream.
  @throws IOException if a problem occured reading the stream.