Passed
Push — master ( 4d2afb...37b1cc )
by Tim
02:49
created

DefaultResponse::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LD\LanguageDetection\Response;
6
7
use LD\LanguageDetection\Domain\Model\Dto\SiteConfiguration;
8
use LD\LanguageDetection\Event\BuildResponse;
9
use LD\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
    protected SiteConfigurationService $siteConfigurationService;
19
20
    public function __construct(SiteConfigurationService $siteConfigurationService)
21
    {
22
        $this->siteConfigurationService = $siteConfigurationService;
23
    }
24
25
    public function __invoke(BuildResponse $event): void
26
    {
27
        $config = $this->siteConfigurationService->getConfiguration($event->getSite());
28
        $targetUri = $this->buildRedirectUri($config, $event->getRequest(), $event->getSelectedLanguage());
29
        if ($this->checkSameUri($event->getRequest(), $targetUri)) {
30
            $code = $config->getRedirectHttpStatusCode();
31
            if ($code <= 0) {
32
                $code = 307;
33
            }
34
35
            $event->setResponse(new RedirectResponse((string)$targetUri, $code));
36
        }
37
    }
38
39
    protected function buildRedirectUri(SiteConfiguration $config, ServerRequestInterface $request, SiteLanguage $language): Uri
40
    {
41
        /** @var Uri $target */
42
        $target = $language->getBase();
43
44
        $params = GeneralUtility::trimExplode(',', $config->getForwardRedirectParameters(), true);
45
        parse_str($request->getUri()->getQuery(), $requestQuery);
46
        parse_str($target->getQuery(), $targetQuery);
47
48
        foreach ($params as $param) {
49
            if (isset($requestQuery[$param])) {
50
                $targetQuery[$param] = $requestQuery[$param];
51
            }
52
        }
53
54
        return $target->withQuery(http_build_query($targetQuery));
55
    }
56
57
    protected function checkSameUri(ServerRequestInterface $request, Uri $targetUri): bool
58
    {
59
        if ((string)$request->getUri() === (string)$targetUri) {
60
            return false;
61
        }
62
63
        if ('' === (string)$targetUri->getHost()) {
64
            $absoluteTargetUri = $targetUri->withScheme($request->getUri()->getScheme())->withHost($request->getUri()->getHost());
65
            if ((string)$request->getUri() === (string)$absoluteTargetUri) {
66
                return false;
67
            }
68
        }
69
70
        return true;
71
    }
72
}
73