Passed
Push — main ( 730e65...a2533d )
by Mariano
05:41 queued 02:39
created

AmpOptimizerSubscriber::getSubscribedEvents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 2
c 1
b 0
f 1
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
namespace Hola\AmpToolboxBundle\EventSubscriber;
4
5
use AmpProject\Optimizer\ErrorCollection;
6
use AmpProject\Optimizer\TransformationEngine;
7
use Psr\Log\LoggerInterface;
8
use Sunra\PhpSimple\HtmlDomParser;
9
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
10
use Symfony\Component\HttpFoundation\Response;
11
use Symfony\Component\HttpKernel\Event\ResponseEvent;
12
use Symfony\Component\HttpKernel\KernelEvents;
13
14
/**
15
 * Listen response event and optimize html
16
 * Class AmpOptimizerSubscriber
17
 * @package Hola\AmpToolboxBundle\EventSubscriber
18
 */
19
class AmpOptimizerSubscriber implements EventSubscriberInterface
20
{
21
22
    /**
23
     * @var LoggerInterface
24
     */
25
    private $logger;
26
27
    /**
28
     * @var TransformationEngine
29
     */
30
    private $transformationEngine;
31
32
    /**
33
     * @var array
34
     */
35
    private $config;
36
37
    /**
38
     * AmpOptimizerSubscriber constructor.
39
     * @param LoggerInterface $logger
40
     * @param TransformationEngine $transformationEngine
41
     * @param $config
42
     */
43 3
    public function __construct(LoggerInterface $logger, TransformationEngine $transformationEngine, $config)
44
    {
45 3
        $this->config = $config;
46 3
        $this->logger = $logger;
47 3
        $this->transformationEngine = $transformationEngine;
48 3
    }
49
50
    /**
51
     * @return array|array[]
52
     */
53 1
    public static function getSubscribedEvents()
54
    {
55
        return [
56 1
            KernelEvents::RESPONSE => ['onKernelResponse', -10],
57
        ];
58
    }
59
60
    /**
61
     * @param ResponseEvent $event
62
     * @return void
63
     */
64 3
    public function onKernelResponse(ResponseEvent $event): void
65
    {
66 3
        if (!array_key_exists('transform_enabled', $this->config) ||
67 3
            false === $this->config['transform_enabled']) {
68
            return;
69
        }
70
71 3
        if (!$event->isMasterRequest()) {
72 1
            return;
73
        }
74
75 2
        if (!$this->isAmpHtml($event->getResponse())) {
76 1
            return;
77
        }
78
79 1
        $errorCollection = new ErrorCollection();
80
81 1
        $optimizedHtml = $this->transformationEngine->optimizeHtml(
82 1
            $event->getResponse()->getContent(),
83 1
            $errorCollection
84
        );
85
86 1
        $event->getResponse()->setContent($optimizedHtml);
87 1
    }
88
89
    /**
90
     * @param Response $response
91
     * @return bool
92
     */
93 2
    private function isAmpHtml(Response $response): bool
94
    {
95 2
        $contentType = $response->headers->get('Content-type');
96 2
        if (strpos($contentType, 'text/html') === false) {
97 1
            return false;
98
        }
99
100 2
        $content = $response->getContent();
101 2
        $dom = HtmlDomParser::str_get_html($content);
102 2
        $htmlElementAttrs = $dom->find('html', 0)->getAllAttributes();
103 2
        if (empty(array_intersect(['⚡', 'amp'], array_keys($htmlElementAttrs)))) {
104 1
            return false;
105
        }
106
107 1
        return true;
108
    }
109
}