diff --git a/core/includes/menu.inc b/core/includes/menu.inc index 0b59cfe..ca116de 100644 --- a/core/includes/menu.inc +++ b/core/includes/menu.inc @@ -8,6 +8,7 @@ use Drupal\Component\Utility\NestedArray; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Language\Language; +use Drupal\Core\Routing\RequestHelper; use Drupal\Core\Template\Attribute; use Drupal\menu_link\Entity\MenuLink; use Drupal\menu_link\MenuLinkStorageController; @@ -969,7 +970,7 @@ function _menu_link_translate(&$item, $translate = FALSE) { * If the system path in $href does not match the $route. */ function menu_item_route_access(Route $route, $href, &$map) { - $request = Request::create('/' . $href); + $request = RequestHelper::duplicate(\Drupal::request(), '/' . $href); $request->attributes->set('_system_path', $href); // Attempt to match this path to provide a fully built request to the // access checker. diff --git a/core/lib/Drupal/Core/Access/AccessManager.php b/core/lib/Drupal/Core/Access/AccessManager.php index a3b6191..5e935e0 100644 --- a/core/lib/Drupal/Core/Access/AccessManager.php +++ b/core/lib/Drupal/Core/Access/AccessManager.php @@ -8,6 +8,7 @@ namespace Drupal\Core\Access; use Drupal\Core\ParamConverter\ParamConverterManager; +use Drupal\Core\Routing\RequestHelper; use Drupal\Core\Routing\RouteProviderInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\RouteCollection; @@ -191,7 +192,7 @@ public function checkNamedRoute($route_name, array $parameters = array(), Reques $route = $this->routeProvider->getRouteByName($route_name, $parameters); if (empty($route_request)) { // Create a request and copy the account from the current request. - $route_request = Request::create($this->urlGenerator->generate($route_name, $parameters)); + $route_request = RequestHelper::duplicate($this->request, $this->urlGenerator->generate($route_name, $parameters)); $defaults = $parameters; $defaults['_account'] = $this->request->attributes->get('_account'); $defaults[RouteObjectInterface::ROUTE_OBJECT] = $route; diff --git a/core/lib/Drupal/Core/Routing/RequestHelper.php b/core/lib/Drupal/Core/Routing/RequestHelper.php new file mode 100644 index 0000000..6b75040 --- /dev/null +++ b/core/lib/Drupal/Core/Routing/RequestHelper.php @@ -0,0 +1,127 @@ +duplicate($query, $request, $attributes, $cookies, $files, $server); + + $server = array(); + + $server['PATH_INFO'] = ''; + $server['REQUEST_METHOD'] = strtoupper($method); + + $components = parse_url($uri); + if (isset($components['host'])) { + $server['SERVER_NAME'] = $components['host']; + $server['HTTP_HOST'] = $components['host']; + } + + if (isset($components['scheme'])) { + if ('https' === $components['scheme']) { + $server['HTTPS'] = 'on'; + $server['SERVER_PORT'] = 443; + } + else { + unset($server['HTTPS']); + $server['SERVER_PORT'] = 80; + } + } + + if (isset($components['port'])) { + $server['SERVER_PORT'] = $components['port']; + $server['HTTP_HOST'] = $server['HTTP_HOST'] . ':' . $components['port']; + } + + if (isset($components['user'])) { + $server['PHP_AUTH_USER'] = $components['user']; + } + + if (isset($components['pass'])) { + $server['PHP_AUTH_PW'] = $components['pass']; + } + + if (!isset($components['path'])) { + $components['path'] = '/'; + } + + switch (strtoupper($method)) { + case 'POST': + case 'PUT': + case 'DELETE': + if (!isset($server['CONTENT_TYPE'])) { + $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; + } + case 'PATCH': + $request = $parameters; + $query = array(); + break; + default: + $request = array(); + $query = $parameters; + break; + } + + if (isset($components['query'])) { + parse_str(html_entity_decode($components['query']), $query_string); + $query = array_replace($query_string, $query); + } + $query_string = http_build_query($query, '', '&'); + + // Prepend a ? if there is a query string. + $query_string = $query_string === '' ?: '?' . $query_string; + $server['REQUEST_URI'] = $components['path'] . $query_string; + $server['QUERY_STRING'] = $query_string; + $request_clone->server->add($server); + + $request_clone->request->add($request); + $request_clone->query->add($query); + + return $request_clone; + } + +}