Skip to content

Commit

Permalink
started removing request bundle dep
Browse files Browse the repository at this point in the history
  • Loading branch information
koertho committed Mar 19, 2023
1 parent 265259b commit 0eb3ad5
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 47 deletions.
36 changes: 19 additions & 17 deletions src/Driver/DC_Table_Utils.php
Expand Up @@ -11,7 +11,9 @@
use Contao\Controller;
use Contao\DataContainer;
use Contao\DC_Table;
use Contao\Environment;
use Contao\Model;
use Contao\RequestToken;
use Contao\System;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

Expand All @@ -29,22 +31,22 @@ public function __construct($strTable, $arrModule = [])

/** @var SessionInterface $objSession */
$objSession = System::getContainer()->get('session');
$request = System::getContainer()->get('huh.request');
$request = System::getContainer()->get('request_stack')->getCurrentRequest();

// Check the request token (see #4007)
if ($request->hasGet('act')) {
if (!$request->hasGet('rt') || !\RequestToken::validate($request->getGet('rt'))) {
$objSession->set('INVALID_TOKEN_URL', \Environment::get('request'));
if ($request->query->has('act')) {
if (!$request->query->get('rt') || !RequestToken::validate($request->query->get('rt'))) {
$objSession->set('INVALID_TOKEN_URL', Environment::get('request'));
$this->redirect('contao/confirm.php');
}
}

Controller::loadDataContainer($strTable);

$this->intId = $request->getGet('id');
$this->intId = $request->query->get('id');

// Clear the clipboard
if ($request->hasGet('clipboard')) {
if ($request->query->has('clipboard')) {
$objSession->set('CLIPBOARD', []);
$this->redirect($this->getReferer());
}
Expand All @@ -56,8 +58,8 @@ public function __construct($strTable, $arrModule = [])
}

// Set IDs and redirect
if ('tl_select' == $request->getPost('FORM_SUBMIT')) {
$ids = $request->getPost('IDS');
if ('tl_select' == $request->request->get('FORM_SUBMIT')) {
$ids = $request->request->get('IDS');

if (empty($ids) || !\is_array($ids)) {
$this->reload();
Expand All @@ -67,24 +69,24 @@ public function __construct($strTable, $arrModule = [])
$session['CURRENT']['IDS'] = $ids;
$objSession->replace($session);

if ($request->hasPost('edit')) {
if ($request->request->has('edit')) {
$this->redirect(str_replace('act=select', 'act=editAll', \Environment::get('request')));
} elseif ($request->hasPost('delete')) {
} elseif ($request->request->has('delete')) {
$this->redirect(str_replace('act=select', 'act=deleteAll', \Environment::get('request')));
} elseif ($request->hasPost('override')) {
} elseif ($request->request->has('override')) {
$this->redirect(str_replace('act=select', 'act=overrideAll', \Environment::get('request')));
} elseif ($request->hasPost('cut') || $request->hasPost('copy')) {
} elseif ($request->request->has('cut') || $request->request->has('copy')) {
$arrClipboard = $objSession->get('CLIPBOARD');

$arrClipboard[$strTable] = [
'id' => $ids,
'mode' => ($request->hasPost('cut') ? 'cutAll' : 'copyAll'),
'mode' => ($request->request->has('cut') ? 'cutAll' : 'copyAll'),
];

$objSession->set('CLIPBOARD', $arrClipboard);

// Support copyAll in the list view (see #7499)
if ($request->hasPost('copy') && $GLOBALS['TL_DCA'][$strTable]['list']['sorting']['mode'] < 4) {
if ($request->request->has('copy') && $GLOBALS['TL_DCA'][$strTable]['list']['sorting']['mode'] < 4) {
$this->redirect(str_replace('act=select', 'act=copyAll', \Environment::get('request')));
}

Expand Down Expand Up @@ -124,9 +126,9 @@ public function __construct($strTable, $arrModule = [])
$route = $request->attributes->get('_route');

// Store the current referer
if (!empty($this->ctable) && !$request->getGet('act') && !$request->getGet('key') && !$request->getGet('token') && 'contao_backend' == $route
&& !\Environment::get('isAjaxRequest')) {
$strKey = $request->getGet('popup') ? 'popupReferer' : 'referer';
if (!empty($this->ctable) && !$request->query->get('act') && !$request->query->get('key') && !$request->query->get('token') && 'contao_backend' == $route
&& !Environment::get('isAjaxRequest')) {
$strKey = $request->query->get('popup') ? 'popupReferer' : 'referer';
$strRefererId = $request->attributes->get('_contao_referer_id');

$session = $objSession->get($strKey);
Expand Down
1 change: 1 addition & 0 deletions src/Resources/config/services.yml
Expand Up @@ -118,6 +118,7 @@ services:
huh.twig.extension.download:
class: HeimrichHannot\UtilsBundle\Twig\DownloadExtension
public: true
autowire: true
tags: [twig.extension]
huh.twig.extension.file:
class: HeimrichHannot\UtilsBundle\Twig\FileExtension
Expand Down
19 changes: 18 additions & 1 deletion src/Twig/DownloadExtension.php
Expand Up @@ -18,11 +18,23 @@
use Contao\StringUtil;
use Contao\System;
use Contao\Validator;
use Symfony\Component\HttpFoundation\RequestStack;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class DownloadExtension extends AbstractExtension
{
/**
* @var RequestStack
*/
private $requestStack;

public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}


/**
* Get list of twig filters.
*
Expand Down Expand Up @@ -79,7 +91,12 @@ public function getDownloadData($path, array $data = []): ?array
}
}

$requestedFile = System::getContainer()->get('huh.request')->getGet('file', true);
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return null;
}

$requestedFile = $request->query->get('file');

// Send the file to the browser and do not send a 404 header (see #4632)
if ('' != $requestedFile && $requestedFile == $file->path) {
Expand Down
10 changes: 8 additions & 2 deletions src/Url/UrlUtil.php
Expand Up @@ -15,6 +15,7 @@
use Contao\System;
use HeimrichHannot\UtilsBundle\Exception\InvalidUrlException;
use HeimrichHannot\UtilsBundle\Request\RequestUtil;
use Symfony\Component\HttpFoundation\RequestStack;

class UrlUtil
{
Expand All @@ -27,11 +28,16 @@ class UrlUtil
* @var RequestUtil
*/
private $requestUtil;
/**
* @var RequestStack
*/
private $requestStack;

public function __construct(ContaoFrameworkInterface $framework, RequestUtil $requestUtil)
public function __construct(ContaoFrameworkInterface $framework, RequestUtil $requestUtil, RequestStack $requestStack)
{
$this->framework = $framework;
$this->requestUtil = $requestUtil;
$this->requestStack = $requestStack;
}

/**
Expand Down Expand Up @@ -224,7 +230,7 @@ public function redirect($strLocation, $intStatus = 303, $test = false, $skipSen
}

// Ajax request
if (System::getContainer()->get('huh.request')->isXmlHttpRequest()) {
if (($request = $this->requestStack->getCurrentRequest()) && $request->isXmlHttpRequest()) {
$headers[] = 'HTTP/1.1 204 No Content';
$headers[] = 'X-Ajax-Location: '.$strLocation;
} else {
Expand Down
56 changes: 29 additions & 27 deletions tests/Url/UrlUtilTest.php
Expand Up @@ -14,11 +14,11 @@
use Contao\PageModel;
use Contao\System;
use Contao\TestCase\ContaoTestCase;
use HeimrichHannot\RequestBundle\Component\HttpFoundation\Request;
use HeimrichHannot\UtilsBundle\Exception\InvalidUrlException;
use HeimrichHannot\UtilsBundle\Request\RequestUtil;
use HeimrichHannot\UtilsBundle\Url\UrlUtil;
use PHPUnit\Framework\MockObject\MockObject;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcher;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;
Expand Down Expand Up @@ -55,9 +55,13 @@ public function createTestInstance(array $parameter = [])
if (!isset($parameter['framework'])) {
$parameter['framework'] = $this->mockContaoFramework();
}

$requestStack = $parameter['requestStack'] ?? $this->createMock(RequestStack::class);

/** @var RequestUtil|MockObject $requestUtil */
$requestUtil = $this->createMock(RequestUtil::class);
$instance = new UrlUtil($parameter['framework'], $requestUtil);

$instance = new UrlUtil($parameter['framework'], $requestUtil, $requestStack);

return $instance;
}
Expand Down Expand Up @@ -111,14 +115,12 @@ public function testRedirectHeadersAlreadySent()

$scopeMatcher = new ScopeMatcher($backendMatcher, $frontendMatcher);

$request = new \Symfony\Component\HttpFoundation\Request();
$request = new Request();

$requestStack = new RequestStack();
$requestStack->push($request);

System::getContainer()->set('huh.request', new Request($this->mockContaoFramework(), $requestStack, $scopeMatcher));

$urlUtil = $this->createTestInstance();
$urlUtil = $this->createTestInstance(['requestStack' => $requestStack]);
$this->assertSame(UrlUtil::TERMINATE_HEADERS_ALREADY_SENT, $urlUtil->redirect('/test?foo=bar&amp;test=123', 301, true));
}

Expand All @@ -132,14 +134,14 @@ public function test301RedirectWithHtmlAmpersandParams()

$scopeMatcher = new ScopeMatcher($backendMatcher, $frontendMatcher);

$request = new \Symfony\Component\HttpFoundation\Request();
$request = new Request();

$requestStack = new RequestStack();
$requestStack->push($request);

System::getContainer()->set('huh.request', new Request($this->mockContaoFramework(), $requestStack, $scopeMatcher));

$urlUtil = $this->createTestInstance();
$urlUtil = $this->createTestInstance([
'requestStack' => $requestStack
]);
$headers = $urlUtil->redirect('/test?foo=bar&amp;test=123', 301, true, true);
$this->assertNotEmpty($headers);
$this->assertSame(['HTTP/1.1 301 Moved Permanently', 'Location: http://localhost/test?foo=bar&test=123'], $headers);
Expand All @@ -155,14 +157,14 @@ public function test302Redirect()

$scopeMatcher = new ScopeMatcher($backendMatcher, $frontendMatcher);

$request = new \Symfony\Component\HttpFoundation\Request();
$request = new Request();

$requestStack = new RequestStack();
$requestStack->push($request);

System::getContainer()->set('huh.request', new Request($this->mockContaoFramework(), $requestStack, $scopeMatcher));

$urlUtil = $this->createTestInstance();
$urlUtil = $this->createTestInstance([
'requestStack' => $requestStack
]);
$headers = $urlUtil->redirect('http://test.com/test?foo=bar', 302, true, true);
$this->assertNotEmpty($headers);
$this->assertSame(['HTTP/1.1 302 Found', 'Location: http://test.com/test?foo=bar'], $headers);
Expand All @@ -178,14 +180,14 @@ public function test303Redirect()

$scopeMatcher = new ScopeMatcher($backendMatcher, $frontendMatcher);

$request = new \Symfony\Component\HttpFoundation\Request();
$request = new Request();

$requestStack = new RequestStack();
$requestStack->push($request);

System::getContainer()->set('huh.request', new Request($this->mockContaoFramework(), $requestStack, $scopeMatcher));

$urlUtil = $this->createTestInstance();
$urlUtil = $this->createTestInstance([
'requestStack' => $requestStack
]);
$headers = $urlUtil->redirect('http://test.com/test?foo=bar', 303, true, true);
$this->assertNotEmpty($headers);
$this->assertSame(['HTTP/1.1 303 See Other', 'Location: http://test.com/test?foo=bar'], $headers);
Expand All @@ -201,14 +203,14 @@ public function test307Redirect()

$scopeMatcher = new ScopeMatcher($backendMatcher, $frontendMatcher);

$request = new \Symfony\Component\HttpFoundation\Request();
$request = new Request();

$requestStack = new RequestStack();
$requestStack->push($request);

System::getContainer()->set('huh.request', new Request($this->mockContaoFramework(), $requestStack, $scopeMatcher));

$urlUtil = $this->createTestInstance();
$urlUtil = $this->createTestInstance([
'requestStack' => $requestStack
]);
$headers = $urlUtil->redirect('http://test.com/test?foo=bar', 307, true, true);
$this->assertNotEmpty($headers);
$this->assertSame(['HTTP/1.1 307 Temporary Redirect', 'Location: http://test.com/test?foo=bar'], $headers);
Expand All @@ -224,14 +226,14 @@ public function testXhrRedirect()

$scopeMatcher = new ScopeMatcher($backendMatcher, $frontendMatcher);

$request = new \Symfony\Component\HttpFoundation\Request([], [], [], [], [], ['HTTP_X-Requested-With' => 'XMLHttpRequest']);
$request = new Request([], [], [], [], [], ['HTTP_X-Requested-With' => 'XMLHttpRequest']);

$requestStack = new RequestStack();
$requestStack->push($request);

System::getContainer()->set('huh.request', new Request($this->mockContaoFramework(), $requestStack, $scopeMatcher));

$urlUtil = $this->createTestInstance();
$urlUtil = $this->createTestInstance([
'requestStack' => $requestStack
]);
$headers = $urlUtil->redirect('http://test.com/test?foo=bar', 307, true, true);
$this->assertNotEmpty($headers);
$this->assertSame(['HTTP/1.1 204 No Content', 'X-Ajax-Location: http://test.com/test?foo=bar'], $headers);
Expand All @@ -240,7 +242,7 @@ public function testXhrRedirect()
public function createRequestStackMock()
{
$requestStack = new RequestStack();
$request = new \Symfony\Component\HttpFoundation\Request();
$request = new Request();
$request->attributes->set('_contao_referer_id', 'foobar');
$requestStack->push($request);

Expand Down

0 comments on commit 0eb3ad5

Please sign in to comment.