Exemplo n.º 1
0
 /**
  * Returns a Request object representing the current request.
  *
  * Note that due to the way PHP works, the request body will be empty
  * when the Content-Type is multipart/form-data.
  *
  * Note that the query string data is purposefully parsed from the REQUEST_URI,
  * and not just taken from the $_GET superglobal.
  * This is to provide a consistent behaviour even when mod_rewrite is in use.
  *
  * @param boolean $trustProxy     Whether to trust X-Forwarded-* headers.
  * @param integer $hostPortSource One of the PREFER_* or ONLY_* constants.
  *
  * @return Request
  */
 public static function getCurrent($trustProxy = false, $hostPortSource = self::PREFER_HTTP_HOST)
 {
     $request = new Request();
     if (isset($_SERVER['HTTPS'])) {
         if ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === '1') {
             $request->isSecure = true;
             $request->port = 443;
         }
     }
     $httpHost = null;
     $httpPort = null;
     $serverName = null;
     $serverPort = null;
     if (isset($_SERVER['HTTP_HOST'])) {
         $host = $_SERVER['HTTP_HOST'];
         $pos = strrpos($host, ':');
         if ($pos === false) {
             $httpHost = $host;
             $httpPort = $request->port;
         } else {
             $httpHost = substr($host, 0, $pos);
             $httpPort = (int) substr($host, $pos + 1);
         }
     }
     if (isset($_SERVER['SERVER_NAME'])) {
         $serverName = $_SERVER['SERVER_NAME'];
     }
     if (isset($_SERVER['SERVER_PORT'])) {
         $serverPort = (int) $_SERVER['SERVER_PORT'];
     }
     $host = null;
     $port = null;
     switch ($hostPortSource) {
         case self::PREFER_HTTP_HOST:
             $host = $httpHost !== null ? $httpHost : $serverName;
             $port = $httpPort !== null ? $httpPort : $serverPort;
             break;
         case self::PREFER_SERVER_NAME:
             $host = $serverName !== null ? $serverName : $httpHost;
             $port = $serverPort !== null ? $serverPort : $httpPort;
             break;
         case self::ONLY_HTTP_HOST:
             $host = $httpHost;
             $port = $httpPort;
             break;
         case self::ONLY_SERVER_NAME:
             $host = $serverName;
             $port = $serverPort;
             break;
     }
     if ($host !== null) {
         $request->host = $host;
     }
     if ($port !== null) {
         $request->port = $port;
     }
     if (isset($_SERVER['REQUEST_METHOD'])) {
         $request->method = $_SERVER['REQUEST_METHOD'];
     }
     if (isset($_SERVER['REQUEST_URI'])) {
         $request->setRequestUri($_SERVER['REQUEST_URI']);
     }
     if (isset($_SERVER['SERVER_PROTOCOL'])) {
         if (preg_match('|^HTTP/(.+)$|', $_SERVER['SERVER_PROTOCOL'], $matches) !== 1) {
             throw new HttpBadRequestException('Invalid protocol: ' . $_SERVER['SERVER_PROTOCOL']);
         }
         $request->protocolVersion = $matches[1];
     }
     if (isset($_SERVER['REMOTE_ADDR'])) {
         $request->clientIp = $_SERVER['REMOTE_ADDR'];
     }
     $request->headers = self::getCurrentRequestHeaders();
     $request->post = $_POST;
     $request->cookies = $_COOKIE;
     $request->files = UploadedFileMap::createFromFilesGlobal($_FILES);
     if (isset($_SERVER['CONTENT_LENGTH']) || isset($_SERVER['HTTP_TRANSFER_ENCODING'])) {
         $request->body = new MessageBodyResource(fopen('php://input', 'rb'));
     }
     if ($trustProxy) {
         if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
             $ips = preg_split('/,\\s*/', $_SERVER['HTTP_X_FORWARDED_FOR']);
             $request->clientIp = array_pop($ips);
         }
         if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
             $request->host = $_SERVER['HTTP_X_FORWARDED_HOST'];
         }
         if (isset($_SERVER['HTTP_X_FORWARDED_PORT'])) {
             $request->port = (int) $_SERVER['HTTP_X_FORWARDED_PORT'];
         }
         if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
             $request->isSecure = $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https';
         }
     }
     return $request;
 }
Exemplo n.º 2
0
 /**
  * @dataProvider providerGetSetUrl
  *
  * @param string       $url         The URL to test.
  * @param string|null  $expectedUrl The expected URL, or NULL to use the original URL.
  * @param string       $host        The expected host name.
  * @param integer      $port        The expected port number.
  * @param string       $requestUri  The expected request URI.
  * @param string       $path        The expected path.
  * @param string       $qs          The expected query string.
  * @param string       $isSecure    The expected isSecure flag.
  * @param array        $query       The expected query parameters.
  */
 public function testGetSetUrl($url, $expectedUrl, $host, $port, $requestUri, $path, $qs, $isSecure, array $query)
 {
     $request = new Request();
     // Set some values to ensure the defaults get overridden.
     $request->setPort(999);
     $request->setSecure(true);
     $request->setRequestUri('/path?a=b');
     $this->assertSame($request, $request->setUrl($url));
     $this->assertSame($expectedUrl ?: $url, $request->getUrl());
     $this->assertSame($host, $request->getHost());
     $this->assertSame($port, $request->getPort());
     $this->assertSame($requestUri, $request->getRequestUri());
     $this->assertSame($path, $request->getPath());
     $this->assertSame($qs, $request->getQueryString());
     $this->assertSame($isSecure, $request->isSecure());
     $this->assertSame($query, $request->getQuery());
 }