-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathResponsePlugin.php
116 lines (99 loc) · 2.61 KB
/
ResponsePlugin.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php declare(strict_types=1);
namespace Yireo\LinkPreload\Plugin;
use Magento\Framework\Stdlib\CookieManagerInterface;
use Magento\Framework\App\Request\Http as HttpRequest;
use Magento\Framework\App\Response\Http as HttpResponse;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
use Yireo\LinkPreload\Config\Config;
use Yireo\LinkPreload\Link\LinkParser;
/**
* Plugin to add a Link header for each static asset
*/
class ResponsePlugin
{
/**
* @var Config
*/
private $config;
/**
* @var HttpRequest
*/
private $request;
/**
* @var CookieManagerInterface
*/
private $cookieManager;
/**
* @var LinkParser
*/
private $linkParser;
/**
* @param Config $config
* @param HttpRequest $request
* @param CookieManagerInterface $cookieManager
* @param LinkParser $linkParser
*/
public function __construct(
Config $config,
HttpRequest $request,
CookieManagerInterface $cookieManager,
LinkParser $linkParser
) {
$this->config = $config;
$this->request = $request;
$this->cookieManager = $cookieManager;
$this->linkParser = $linkParser;
}
/**
* Intercept the sendResponse call
*
* @param ResponseInterface $response
*
* @throws LocalizedException
* @throws NoSuchEntityException
*/
public function beforeSendResponse(ResponseInterface $response)
{
if (!$response instanceof HttpResponse) {
return;
}
if (!$this->shouldAddLinkHeader($response)) {
return;
}
$this->linkParser->parse($response);
}
/**
* Check if the headers needs to be sent.
*
* @param HttpResponse $response
*
* @return bool
*/
private function shouldAddLinkHeader(HttpResponse $response)
{
if (false === $this->config->enabled()) {
return false;
}
if ($response->isRedirect()) {
return false;
}
if ($this->request->isAjax()) {
return false;
}
$content = $response->getContent();
if ($response->getContent() === false) {
return false;
}
if (false === stristr((string)$content, '<!doctype html>')) {
return false;
}
if ($this->config->useCookie()) {
if ((int)$this->cookieManager->getCookie('linkpreload') === 1) {
return false;
}
}
return true;
}
}