123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\App\Request;
- use Magento\Framework\App\HttpRequestInterface;
- use Magento\Framework\App\RequestContentInterface;
- use Magento\Framework\App\RequestSafetyInterface;
- use Magento\Framework\App\Route\ConfigInterface\Proxy as ConfigInterface;
- use Magento\Framework\HTTP\PhpEnvironment\Request;
- use Magento\Framework\ObjectManagerInterface;
- use Magento\Framework\Stdlib\Cookie\CookieReaderInterface;
- use Magento\Framework\Stdlib\StringUtils;
- /**
- * Http request
- */
- class Http extends Request implements RequestContentInterface, RequestSafetyInterface, HttpRequestInterface
- {
- /**#@+
- * HTTP Ports
- */
- const DEFAULT_HTTP_PORT = 80;
- const DEFAULT_HTTPS_PORT = 443;
- /**#@-*/
- // Configuration path
- const XML_PATH_OFFLOADER_HEADER = 'web/secure/offloader_header';
- /**
- * @var string
- */
- protected $route;
- /**
- * PATH_INFO
- *
- * @var string
- */
- protected $pathInfo = '';
- /**
- * ORIGINAL_PATH_INFO
- *
- * @var string
- */
- protected $originalPathInfo = '';
- /**
- * @var array
- */
- protected $directFrontNames;
- /**
- * @var string
- */
- protected $controllerModule;
- /**
- * Request's original information before forward.
- *
- * @var array
- */
- protected $beforeForwardInfo = [];
- /**
- * @var ConfigInterface
- */
- protected $routeConfig;
- /**
- * @var PathInfoProcessorInterface
- */
- protected $pathInfoProcessor;
- /**
- * @var ObjectManagerInterface
- */
- protected $objectManager;
- /**
- * @var bool|null
- */
- protected $isSafeMethod = null;
- /**
- * @var array
- */
- protected $safeRequestTypes = ['GET', 'HEAD', 'TRACE', 'OPTIONS'];
- /**
- * @var string
- */
- private $distroBaseUrl;
- /**
- * @var PathInfo
- */
- private $pathInfoService;
- /**
- * @param CookieReaderInterface $cookieReader
- * @param StringUtils $converter
- * @param ConfigInterface $routeConfig
- * @param PathInfoProcessorInterface $pathInfoProcessor
- * @param ObjectManagerInterface $objectManager
- * @param \Zend\Uri\UriInterface|string|null $uri
- * @param array $directFrontNames
- * @param PathInfo|null $pathInfoService
- */
- public function __construct(
- CookieReaderInterface $cookieReader,
- StringUtils $converter,
- ConfigInterface $routeConfig,
- PathInfoProcessorInterface $pathInfoProcessor,
- ObjectManagerInterface $objectManager,
- $uri = null,
- $directFrontNames = [],
- PathInfo $pathInfoService = null
- ) {
- parent::__construct($cookieReader, $converter, $uri);
- $this->routeConfig = $routeConfig;
- $this->pathInfoProcessor = $pathInfoProcessor;
- $this->objectManager = $objectManager;
- $this->directFrontNames = $directFrontNames;
- $this->pathInfoService = $pathInfoService ?: \Magento\Framework\App\ObjectManager::getInstance()->get(
- PathInfo::class
- );
- }
- /**
- * Return the ORIGINAL_PATH_INFO.
- * This value is calculated and processed from $_SERVER due to cross-platform differences.
- * instead of reading PATH_INFO
- *
- * @return string
- */
- public function getOriginalPathInfo()
- {
- if (empty($this->originalPathInfo)) {
- $originalPathInfoFromRequest = $this->pathInfoService->getPathInfo(
- $this->getRequestUri(),
- $this->getBaseUrl()
- );
- $this->originalPathInfo = (string)$this->pathInfoProcessor->process($this, $originalPathInfoFromRequest);
- $this->requestString = $this->originalPathInfo
- . $this->pathInfoService->getQueryString($this->getRequestUri());
- }
- return $this->originalPathInfo;
- }
- /**
- * Return the path info
- *
- * @return string
- */
- public function getPathInfo()
- {
- if (empty($this->pathInfo)) {
- $this->pathInfo = $this->getOriginalPathInfo();
- }
- return $this->pathInfo;
- }
- /**
- * Set the PATH_INFO string.
- *
- * Set the ORIGINAL_PATH_INFO string.
- *
- * @param string|null $pathInfo
- * @return $this
- */
- public function setPathInfo($pathInfo = null)
- {
- $this->pathInfo = (string)$pathInfo;
- return $this;
- }
- /**
- * Check if code declared as direct access frontend name.
- *
- * This means what this url can be used without store code.
- *
- * @param string $code
- * @return bool
- */
- public function isDirectAccessFrontendName($code)
- {
- return isset($this->directFrontNames[$code]);
- }
- /**
- * Get base path
- *
- * @return string
- */
- public function getBasePath()
- {
- $path = parent::getBasePath();
- if (empty($path)) {
- $path = '/';
- } else {
- $path = str_replace('\\', '/', $path);
- }
- return $path;
- }
- /**
- * Retrieve request front name
- *
- * @return string|null
- */
- public function getFrontName()
- {
- $pathParts = explode('/', trim($this->getPathInfo(), '/'));
- return reset($pathParts);
- }
- /**
- * Set route name
- *
- * @param string $route
- * @return $this
- */
- public function setRouteName($route)
- {
- $this->route = $route;
- $module = $this->routeConfig->getRouteFrontName($route);
- if ($module) {
- $this->setModuleName($module);
- }
- return $this;
- }
- /**
- * Retrieve route name
- *
- * @return string|null
- */
- public function getRouteName()
- {
- return $this->route;
- }
- /**
- * Specify module name where was found currently used controller
- *
- * @param string $module
- * @return $this
- */
- public function setControllerModule($module)
- {
- $this->controllerModule = $module;
- return $this;
- }
- /**
- * Get module name of currently used controller
- *
- * @return string
- */
- public function getControllerModule()
- {
- return $this->controllerModule;
- }
- /**
- * Collect properties changed by _forward in protected storage before _forward was called first time.
- *
- * @return $this
- */
- public function initForward()
- {
- if (empty($this->beforeForwardInfo)) {
- $this->beforeForwardInfo = [
- 'params' => $this->getParams(),
- 'action_name' => $this->getActionName(),
- 'controller_name' => $this->getControllerName(),
- 'module_name' => $this->getModuleName(),
- 'route_name' => $this->getRouteName(),
- ];
- }
- return $this;
- }
- /**
- * Retrieve property's value which was before _forward call.
- * If property was not changed during _forward call null will be returned.
- * If passed name will be null whole state array will be returned.
- *
- * @param string $name
- * @return array|string|null
- */
- public function getBeforeForwardInfo($name = null)
- {
- if ($name === null) {
- return $this->beforeForwardInfo;
- } elseif (isset($this->beforeForwardInfo[$name])) {
- return $this->beforeForwardInfo[$name];
- }
- return null;
- }
- /**
- * Check is Request from AJAX
- *
- * @return boolean
- */
- public function isAjax()
- {
- if ($this->isXmlHttpRequest()) {
- return true;
- }
- if ($this->getParam('ajax') || $this->getParam('isAjax')) {
- return true;
- }
- return false;
- }
- /**
- * Get website instance base url
- *
- * @return string
- *
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- */
- public function getDistroBaseUrl()
- {
- if ($this->distroBaseUrl) {
- return $this->distroBaseUrl;
- }
- $headerHttpHost = $this->getServer('HTTP_HOST');
- $headerHttpHost = $this->converter->cleanString($headerHttpHost);
- $headerScriptName = $this->getServer('SCRIPT_NAME');
- if (isset($headerScriptName) && isset($headerHttpHost)) {
- if ($secure = $this->isSecure()) {
- $scheme = 'https://';
- } else {
- $scheme = 'http://';
- }
- $hostArr = explode(':', $headerHttpHost);
- $host = $hostArr[0];
- $port = isset($hostArr[1])
- && (!$secure && $hostArr[1] != 80 || $secure && $hostArr[1] != 443) ? ':' . $hostArr[1] : '';
- $path = $this->getBasePath();
- return $this->distroBaseUrl = $scheme . $host . $port . rtrim($path, '/') . '/';
- }
- return 'http://localhost/';
- }
- /**
- * Determines a base URL path from environment
- *
- * @param array $server
- * @return string
- */
- public static function getDistroBaseUrlPath($server)
- {
- $result = '';
- if (isset($server['SCRIPT_NAME'])) {
- $envPath = str_replace('\\', '/', dirname(str_replace('\\', '/', $server['SCRIPT_NAME'])));
- if ($envPath != '.' && $envPath != '/') {
- $result = $envPath;
- }
- }
- if (!preg_match('/\/$/', $result)) {
- $result .= '/';
- }
- return $result;
- }
- /**
- * Return url with no script name
- *
- * @param string $url
- * @return string
- */
- public static function getUrlNoScript($url)
- {
- if (!isset($_SERVER['SCRIPT_NAME'])) {
- return $url;
- }
- if (($pos = strripos($url, basename($_SERVER['SCRIPT_NAME']))) !== false) {
- $url = substr($url, 0, $pos);
- }
- return $url;
- }
- /**
- * Retrieve full action name
- *
- * @param string $delimiter
- * @return string
- */
- public function getFullActionName($delimiter = '_')
- {
- return $this->getRouteName() .
- $delimiter .
- $this->getControllerName() .
- $delimiter .
- $this->getActionName();
- }
- /**
- * Sleep
- *
- * @return array
- */
- public function __sleep()
- {
- return [];
- }
- /**
- * @inheritdoc
- */
- public function isSafeMethod()
- {
- if ($this->isSafeMethod === null) {
- if (isset($_SERVER['REQUEST_METHOD']) && (in_array($_SERVER['REQUEST_METHOD'], $this->safeRequestTypes))) {
- $this->isSafeMethod = true;
- } else {
- $this->isSafeMethod = false;
- }
- }
- return $this->isSafeMethod;
- }
- }
|