Skip to content

Commit

Permalink
Compatibility with Neos 5.0
Browse files Browse the repository at this point in the history
  • Loading branch information
ComiR committed Nov 12, 2019
1 parent 5c08b53 commit 30e6406
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 73 deletions.
102 changes: 31 additions & 71 deletions Classes/ViewHelpers/RequestViewHelper.php
Expand Up @@ -2,81 +2,47 @@
namespace MOC\NotFound\ViewHelpers;

use Neos\Flow\Annotations as Flow;
use Neos\Flow\Configuration\ConfigurationManager;
use Neos\Flow\Core\Bootstrap;
use Neos\Flow\Http\Request;
use Neos\Flow\Http\RequestHandler;
use Neos\Flow\Http\Response;
use Neos\Flow\Http\Uri;
use Neos\Flow\Mvc\ActionRequest;
use Neos\Flow\Mvc\Dispatcher;
use Neos\Flow\Http\Client\CurlEngine;
use Neos\Flow\Http\Client\CurlEngineException;
use Neos\Flow\Http\Helper\RequestInformationHelper;
use Neos\Flow\Mvc\Exception\NoMatchingRouteException;
use Neos\Flow\Mvc\Routing\Dto\RouteContext;
use Neos\Flow\Mvc\Routing\Dto\RouteParameters;
use Neos\Flow\Mvc\Routing\Router;
use Neos\Flow\Security\Context as SecurityContext;
use Neos\FluidAdaptor\Core\ViewHelper\AbstractViewHelper;
use Neos\FluidAdaptor\Core\ViewHelper\Exception as ViewHelperException;
use Neos\Http\Factories\ServerRequestFactory;
use Neos\Neos\Domain\Service\ContentDimensionPresetSourceInterface;
use Neos\Neos\Routing\FrontendNodeRoutePartHandler;
use Psr\Http\Message\ServerRequestInterface;

/**
* Loads the content of a given URL
*/
class RequestViewHelper extends AbstractViewHelper
{
/**
* @Flow\Inject
* @var Dispatcher
*/
protected $dispatcher;

/**
* @Flow\Inject(lazy=false)
* @var Bootstrap
*/
protected $bootstrap;

/**
* @Flow\Inject(lazy=false)
* @var Router
*/
protected $router;

/**
* @Flow\Inject(lazy=false)
* @var SecurityContext
* @Flow\Inject
* @var ContentDimensionPresetSourceInterface
*/
protected $securityContext;
protected $contentDimensionPresetSource;

/**
* @Flow\Inject
* @var ConfigurationManager
* @var ServerRequestFactory
*/
protected $configurationManager;
protected $serverRequestFactory;

/**
* @Flow\InjectConfiguration(path="routing.supportEmptySegmentForDimensions", package="Neos.Neos")
* @var boolean
*/
protected $supportEmptySegmentForDimensions;

/**
* @Flow\Inject
* @var ContentDimensionPresetSourceInterface
*/
protected $contentDimensionPresetSource;

/**
* Initialize this engine
*
* @return void
*/
public function initializeObject()
{
$this->router->setRoutesConfiguration($this->configurationManager->getConfiguration(ConfigurationManager::CONFIGURATION_TYPE_ROUTES));
}

/**
* @return void
* @throws ViewHelperException
Expand All @@ -90,40 +56,34 @@ public function initializeArguments()

/**
* @return string
* @throws \Exception
* @throws \RuntimeException
* @throws CurlEngineException
* @throws NoMatchingRouteException
*/
public function render()
public function render() : string
{
$path = $this->arguments['path'];
$this->appendFirstUriPartIfValidDimension($path);
/** @var RequestHandler $activeRequestHandler */
$activeRequestHandler = $this->bootstrap->getActiveRequestHandler();
$parentHttpRequest = $activeRequestHandler->getHttpRequest();
$uri = rtrim($parentHttpRequest->getBaseUri(), '/') . '/' . $path;
$httpRequest = Request::create(new Uri($uri));
$routeContext = new RouteContext($httpRequest, RouteParameters::createEmpty());
try {
$matchingRoute = $this->router->route($routeContext);
} catch (NoMatchingRouteException $exception) {
$matchingRoute = null;
}
if (!$matchingRoute) {
$exception = new \Exception(sprintf('Uri with path "%s" could not be found.', $uri), 1426446160);
$exceptionHandler = set_exception_handler(null)[0];
$exceptionHandler->handleException($exception);
exit();
}
$request = new ActionRequest($parentHttpRequest);
foreach ($matchingRoute as $argumentName => $argumentValue) {
$request->setArgument($argumentName, $argumentValue);

$request = $this->bootstrap->getActiveRequestHandler()->getHttpRequest();
\assert($request instanceof ServerRequestInterface);

$userAgent = $request->getHeader('User-Agent');
if (isset($userAgent[0]) && strncmp($userAgent[0], 'Flow', 4) === 0) {
// To prevent a request loop, requests from Flow will be ignored.
return '';
}
$response = new Response($activeRequestHandler->getHttpResponse());

$this->securityContext->withoutAuthorizationChecks(function () use ($request, $response) {
$this->dispatcher->dispatch($request, $response);
});
$uri = RequestInformationHelper::generateBaseUri($request)->withPath($path);
// By default, the ServerRequestFactory sets the User-Agent header to "Flow/" followed by the version branch.
$serverRequest = $this->serverRequestFactory->createServerRequest('GET', $uri);
$response = (new CurlEngine())->sendRequest($serverRequest);

if ($response->getStatusCode() === 404) {
throw new NoMatchingRouteException(sprintf('Uri with path "%s" could not be found.', $uri), 1426446160);
}

return $response->getContent();
return $response->getBody()->getContents();
}

/**
Expand Down
17 changes: 15 additions & 2 deletions composer.json
Expand Up @@ -16,7 +16,7 @@
}
],
"require": {
"neos/neos": ">3.3"
"neos/neos": "^4.0 || ^5.0"
},
"autoload": {
"psr-4": {
Expand Down Expand Up @@ -95,7 +95,20 @@
"Neos.Neos-20161219122512",
"Neos.Fusion-20161219130100",
"Neos.Neos-20161220163741",
"Neos.Fusion-20170120013047"
"Neos.Fusion-20170120013047",
"Neos.ContentRepository.Search-20161210231100",
"Neos.Neos-20170115114620",
"Neos.Flow-20170125103800",
"Neos.Seo-20170127154600",
"Neos.Flow-20170127183102",
"Neos.Fusion-20180211175500",
"Neos.Fusion-20180211184832",
"Neos.Flow-20180415105700",
"Neos.Neos-20180907103800",
"Neos.Neos.Ui-20190319094900",
"Neos.Flow-20190425144900",
"Neos.Flow-20190515215000",
"Neos.NodeTypes-20190917101945"
]
}
}

0 comments on commit 30e6406

Please sign in to comment.