/
var
/
www
/
html
/
boaz2
/
vendor
/
symfony
/
framework-bundle
/
Controller
/
Upload File
HOME
<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\FrameworkBundle\Controller; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; /** * Redirects a request to another URL. * * @author Fabien Potencier <fabien@symfony.com> * * @final */ class RedirectController { private $router; private $httpPort; private $httpsPort; public function __construct(UrlGeneratorInterface $router = null, int $httpPort = null, int $httpsPort = null) { $this->router = $router; $this->httpPort = $httpPort; $this->httpsPort = $httpsPort; } /** * Redirects to another route with the given name. * * The response status code is 302 if the permanent parameter is false (default), * and 301 if the redirection is permanent. * * In case the route name is empty, the status code will be 404 when permanent is false * and 410 otherwise. * * @param string $route The route name to redirect to * @param bool $permanent Whether the redirection is permanent * @param bool|array $ignoreAttributes Whether to ignore attributes or an array of attributes to ignore * @param bool $keepRequestMethod Whether redirect action should keep HTTP request method * * @throws HttpException In case the route name is empty */ public function redirectAction(Request $request, string $route, bool $permanent = false, $ignoreAttributes = false, bool $keepRequestMethod = false, bool $keepQueryParams = false): Response { if ('' == $route) { throw new HttpException($permanent ? 410 : 404); } $attributes = []; if (false === $ignoreAttributes || \is_array($ignoreAttributes)) { $attributes = $request->attributes->get('_route_params'); if ($keepQueryParams) { if ($query = $request->server->get('QUERY_STRING')) { $query = self::parseQuery($query); } else { $query = $request->query->all(); } $attributes = array_merge($query, $attributes); } unset($attributes['route'], $attributes['permanent'], $attributes['ignoreAttributes'], $attributes['keepRequestMethod'], $attributes['keepQueryParams']); if ($ignoreAttributes) { $attributes = array_diff_key($attributes, array_flip($ignoreAttributes)); } } if ($keepRequestMethod) { $statusCode = $permanent ? 308 : 307; } else { $statusCode = $permanent ? 301 : 302; } return new RedirectResponse($this->router->generate($route, $attributes, UrlGeneratorInterface::ABSOLUTE_URL), $statusCode); } /** * Redirects to a URL. * * The response status code is 302 if the permanent parameter is false (default), * and 301 if the redirection is permanent. * * In case the path is empty, the status code will be 404 when permanent is false * and 410 otherwise. * * @param string $path The absolute path or URL to redirect to * @param bool $permanent Whether the redirect is permanent or not * @param string|null $scheme The URL scheme (null to keep the current one) * @param int|null $httpPort The HTTP port (null to keep the current one for the same scheme or the default configured port) * @param int|null $httpsPort The HTTPS port (null to keep the current one for the same scheme or the default configured port) * @param bool $keepRequestMethod Whether redirect action should keep HTTP request method * * @throws HttpException In case the path is empty */ public function urlRedirectAction(Request $request, string $path, bool $permanent = false, string $scheme = null, int $httpPort = null, int $httpsPort = null, bool $keepRequestMethod = false): Response { if ('' == $path) { throw new HttpException($permanent ? 410 : 404); } if ($keepRequestMethod) { $statusCode = $permanent ? 308 : 307; } else { $statusCode = $permanent ? 301 : 302; } // redirect if the path is a full URL if (parse_url($path, \PHP_URL_SCHEME)) { return new RedirectResponse($path, $statusCode); } if (null === $scheme) { $scheme = $request->getScheme(); } if ($qs = $request->server->get('QUERY_STRING') ?: $request->getQueryString()) { if (false === strpos($path, '?')) { $qs = '?'.$qs; } else { $qs = '&'.$qs; } } $port = ''; if ('http' === $scheme) { if (null === $httpPort) { if ('http' === $request->getScheme()) { $httpPort = $request->getPort(); } else { $httpPort = $this->httpPort; } } if (null !== $httpPort && 80 != $httpPort) { $port = ":$httpPort"; } } elseif ('https' === $scheme) { if (null === $httpsPort) { if ('https' === $request->getScheme()) { $httpsPort = $request->getPort(); } else { $httpsPort = $this->httpsPort; } } if (null !== $httpsPort && 443 != $httpsPort) { $port = ":$httpsPort"; } } $url = $scheme.'://'.$request->getHost().$port.$request->getBaseUrl().$path.$qs; return new RedirectResponse($url, $statusCode); } public function __invoke(Request $request): Response { $p = $request->attributes->get('_route_params', []); if (\array_key_exists('route', $p)) { if (\array_key_exists('path', $p)) { throw new \RuntimeException(sprintf('Ambiguous redirection settings, use the "path" or "route" parameter, not both: "%s" and "%s" found respectively in "%s" routing configuration.', $p['path'], $p['route'], $request->attributes->get('_route'))); } return $this->redirectAction($request, $p['route'], $p['permanent'] ?? false, $p['ignoreAttributes'] ?? false, $p['keepRequestMethod'] ?? false, $p['keepQueryParams'] ?? false); } if (\array_key_exists('path', $p)) { return $this->urlRedirectAction($request, $p['path'], $p['permanent'] ?? false, $p['scheme'] ?? null, $p['httpPort'] ?? null, $p['httpsPort'] ?? null, $p['keepRequestMethod'] ?? false); } throw new \RuntimeException(sprintf('The parameter "path" or "route" is required to configure the redirect action in "%s" routing configuration.', $request->attributes->get('_route'))); } private static function parseQuery(string $query) { $q = []; foreach (explode('&', $query) as $v) { if (false !== $i = strpos($v, "\0")) { $v = substr($v, 0, $i); } if (false === $i = strpos($v, '=')) { $k = urldecode($v); $v = ''; } else { $k = urldecode(substr($v, 0, $i)); $v = substr($v, $i); } if (false !== $i = strpos($k, "\0")) { $k = substr($k, 0, $i); } $k = ltrim($k, ' '); if (false === $i = strpos($k, '[')) { $q[] = bin2hex($k).$v; } else { $q[] = bin2hex(substr($k, 0, $i)).rawurlencode(substr($k, $i)).$v; } } parse_str(implode('&', $q), $q); $query = []; foreach ($q as $k => $v) { if (false !== $i = strpos($k, '_')) { $query[substr_replace($k, hex2bin(substr($k, 0, $i)).'[', 0, 1 + $i)] = $v; } else { $query[hex2bin($k)] = $v; } } return $query; } }