Added CI_Input::input_stream()

Helps in reading php://input stream data by caching it when accessed for the first time.

(supersedes PR #1684)
diff --git a/system/core/Input.php b/system/core/Input.php
index c0158df..adc5f7a 100644
--- a/system/core/Input.php
+++ b/system/core/Input.php
@@ -100,6 +100,16 @@
 	protected $headers = array();
 
 	/**
+	 * Input stream data
+	 *
+	 * Parsed from php://input at runtime
+	 *
+	 * @see	CI_Input::input_stream()
+	 * @var	array
+	 */
+	protected $_input_stream = NULL;
+
+	/**
 	 * Class constructor
 	 *
 	 * Determines whether to globally enable the XSS processing
@@ -257,6 +267,37 @@
 	// ------------------------------------------------------------------------
 
 	/**
+	 * Fetch an item from the php://input stream
+	 *
+	 * Useful when you need to access PUT, DELETE or PATCH request data.
+	 *
+	 * @param	string	$index		Index for item to be fetched
+	 * @param	bool	$xss_clean	Whether to apply XSS filtering
+	 * @return	mixed
+	 */
+	public function input_stream($index = '', $xss_clean = FALSE)
+	{
+		// The input stream can only be read once, so we'll need to check
+		// if we have already done that first.
+		if (is_array($this->_input_stream))
+		{
+			return $this->_fetch_from_array($this->_input_stream, $index, $xss_clean);
+		}
+
+		// Parse the input stream in our cache var
+		parse_str(file_get_contents('php://input'), $this->_input_stream);
+		if ( ! is_array($this->_input_stream))
+		{
+			$this->_input_stream = array();
+			return NULL;
+		}
+
+		return $this->_fetch_from_array($this->_input_stream, $index, $xss_clean);
+	}
+
+	// ------------------------------------------------------------------------
+
+	/**
 	 * Set cookie
 	 *
 	 * Accepts an arbitrary number of parameters (up to 7) or an associative