/** * 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; }
/** * @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()); }