/**
  * Return the URI of the request regardless of the server
  *
  * @return  KHttpUrl    A KHttpUri object
  */
 public static function url()
 {
     if (!isset(self::$_url)) {
         $url = self::protocol() . '://';
         if (PHP_SAPI !== 'cli') {
             /*
              * Since we are assigning the URI from the server variables, we first need
              * to determine if we are running on apache or IIS.  If PHP_SELF and REQUEST_URI
              * are present, we will assume we are running on apache.
              */
             if (!empty($_SERVER['PHP_SELF']) && !empty($_SERVER['REQUEST_URI'])) {
                 /*
                  * To build the entire URI we need to prepend the protocol, and the http host
                  * to the URI string.
                  */
                 $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
                 /*
                  * Since we do not have REQUEST_URI to work with, we will assume we are
                  * running on IIS and will therefore need to work some magic with the SCRIPT_NAME and
                  * QUERY_STRING environment variables.
                  */
             } else {
                 // IIS uses the SCRIPT_NAME variable instead of a REQUEST_URI variable
                 $url .= $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
                 // If the query string exists append it to the URI string
                 if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
                     $url .= '?' . $_SERVER['QUERY_STRING'];
                 }
             }
         } else {
             $url .= 'koowa';
         }
         // Sanitize the url since we can't trust the server var
         $url = KService::get('koowa:filter.url')->sanitize($url);
         // Create the URI object
         self::$_url = KService::get('koowa:http.url', array('url' => $url));
     }
     return self::$_url;
 }