DefaultResponse   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 25
dl 0
loc 53
rs 10
c 0
b 0
f 0
wmc 11

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 1 1
A checkSameUri() 0 14 4
A __invoke() 0 14 3
A buildRedirectUri() 0 16 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Lochmueller\LanguageDetection\Response;
6
7
use Lochmueller\LanguageDetection\Domain\Model\Dto\SiteConfiguration;
8
use Lochmueller\LanguageDetection\Event\BuildResponseEvent;
9
use Lochmueller\LanguageDetection\Service\SiteConfigurationService;
10
use Psr\Http\Message\ServerRequestInterface;
11
use TYPO3\CMS\Core\Http\RedirectResponse;
12
use TYPO3\CMS\Core\Http\Uri;
13
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
14
use TYPO3\CMS\Core\Utility\GeneralUtility;
15
16
class DefaultResponse
17
{
18
    public function __construct(protected SiteConfigurationService $siteConfigurationService) {}
19
20
    public function __invoke(BuildResponseEvent $event): void
21
    {
22
        $config = $this->siteConfigurationService->getConfiguration($event->getSite());
23
        $targetUri = $this->buildRedirectUri($config, $event->getRequest(), $event->getSelectedLanguage());
24
        if ($this->checkSameUri($event->getRequest(), $targetUri)) {
25
            $code = $config->getRedirectHttpStatusCode();
26
            if ($code <= 0) {
27
                $code = 307;
28
            }
29
30
            $response = new RedirectResponse((string)$targetUri, $code);
31
            $response = $response->withHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
32
33
            $event->setResponse($response);
34
        }
35
    }
36
37
    protected function buildRedirectUri(SiteConfiguration $config, ServerRequestInterface $request, SiteLanguage $language): Uri
38
    {
39
        /** @var Uri $target */
40
        $target = $language->getBase();
41
42
        $params = GeneralUtility::trimExplode(',', $config->getForwardRedirectParameters(), true);
43
        parse_str($request->getUri()->getQuery(), $requestQuery);
44
        parse_str($target->getQuery(), $targetQuery);
45
46
        foreach ($params as $param) {
47
            if (isset($requestQuery[$param])) {
48
                $targetQuery[$param] = $requestQuery[$param];
49
            }
50
        }
51
52
        return $target->withQuery(http_build_query($targetQuery));
53
    }
54
55
    protected function checkSameUri(ServerRequestInterface $request, Uri $targetUri): bool
56
    {
57
        if ((string)$request->getUri() === (string)$targetUri) {
58
            return false;
59
        }
60
61
        if ((string)$targetUri->getHost() === '') {
62
            $absoluteTargetUri = $targetUri->withScheme($request->getUri()->getScheme())->withHost($request->getUri()->getHost());
63
            if ((string)$request->getUri() === (string)$absoluteTargetUri) {
64
                return false;
65
            }
66
        }
67
68
        return true;
69
    }
70
}
71