10
10
use Laminas \Http \Header \HeaderInterface ;
11
11
use Laminas \Loader \PluginClassLoader ;
12
12
use Magento \Csp \Api \Data \PolicyInterface ;
13
- use Magento \Csp \Model \Policy \ Renderer \ SimplePolicyHeaderRenderer ;
13
+ use Magento \Csp \Model \CspRenderer ;
14
14
use Magento \Framework \App \Response \HttpInterface as HttpResponse ;
15
15
use Psr \Log \LoggerInterface ;
16
16
@@ -37,26 +37,28 @@ public function __construct(
37
37
* @param null $result
38
38
*/
39
39
public function afterRender (
40
- SimplePolicyHeaderRenderer $ subject ,
40
+ CspRenderer $ subject ,
41
41
$ result ,
42
- PolicyInterface $ policy ,
43
42
HttpResponse $ response
44
43
): void {
45
44
$ headerName = $ this ->getHeaderName ($ response );
46
- /** @var HeaderInterface $header */
47
45
$ header = $ response ->getHeader ($ headerName );
48
- $ policyValue = $ header ->getFieldValue ();
46
+ if (!$ header instanceof HeaderInterface) {
47
+ return ;
48
+ }
49
+
50
+ $ headerValue = $ header ->getFieldValue ();
49
51
$ isHeaderSplittingEnabled = $ this ->config ->isHeaderSplittingEnabled ();
50
52
51
53
$ maxHeaderSize = $ this ->config ->getMaxHeaderSize ();
52
- $ currentHeaderSize = strlen ($ policyValue );
54
+ $ currentHeaderSize = strlen ($ headerValue );
53
55
54
56
if ($ isHeaderSplittingEnabled ) {
55
57
$ this ->registerCspHeaderPlugins ($ response );
56
- $ this ->splitUpCspHeaders ($ response , $ policyValue );
58
+ $ this ->splitUpCspHeaders ($ response , $ headerName , $ headerValue );
57
59
} else {
58
60
if ($ maxHeaderSize >= $ currentHeaderSize ) {
59
- $ response ->setHeader ($ headerName , $ policyValue , true );
61
+ $ response ->setHeader ($ headerName , $ headerValue , true );
60
62
} else {
61
63
$ this ->logger ->error (
62
64
sprintf (
@@ -87,33 +89,41 @@ private function registerCspHeaderPlugins(HttpResponse $response): void
87
89
/**
88
90
* Make sure that the CSP headers are handled as several headers ("multi-header")
89
91
*/
90
- private function splitUpCspHeaders (HttpResponse $ response , string $ policyValue ): void
92
+ private function splitUpCspHeaders (HttpResponse $ response , string $ headerName , string $ headerValue ): void
91
93
{
92
- $ headerName = $ this ->getHeaderName ( $ response );
94
+ $ maxHeaderSize = $ this ->config -> getMaxHeaderSize ( );
93
95
94
- if (!$ headerName ) {
95
- return ;
96
- }
96
+ $ headerParts [$ i = 0 ] = '' ;
97
97
98
- $ maxHeaderSize = $ this ->config ->getMaxHeaderSize ();
99
- $ newHeaderSize = strlen ($ policyValue );
98
+ $ policyValues = explode ('; ' , $ headerValue );
99
+ foreach ($ policyValues as $ policyValue ) {
100
+ $ policyValue = trim ($ policyValue ) . '; ' ;
101
+ $ newHeaderSize = strlen ($ headerParts [$ i ]) + strlen ($ policyValue );
100
102
101
- if ($ newHeaderSize <= $ maxHeaderSize ) {
102
- $ this ->contentHeaders [] = $ policyValue ;
103
- } else {
104
- $ this ->logger ->error (
105
- sprintf (
106
- 'Unable to set the CSP header. The header size of %d bytes exceeds the ' .
107
- 'maximum size of %d bytes. ' ,
108
- $ newHeaderSize ,
109
- $ maxHeaderSize
110
- )
111
- );
103
+ if ($ newHeaderSize <= $ maxHeaderSize ) {
104
+ $ headerParts [$ i ] .= $ policyValue ;
105
+
106
+ continue ;
107
+ }
108
+
109
+ $ headerParts [++$ i ] = $ policyValue ;
110
+ $ headerSize = strlen ($ policyValue );
111
+ if ($ headerSize > $ maxHeaderSize ) {
112
+ $ this ->logger ->error (
113
+ sprintf (
114
+ 'Unable to set the CSP header. The header size of %d bytes exceeds the ' .
115
+ 'maximum size of %d bytes. ' ,
116
+ $ headerSize ,
117
+ $ maxHeaderSize
118
+ )
119
+ );
120
+
121
+ return ;
122
+ }
112
123
}
113
124
114
- foreach ($ this ->contentHeaders as $ i => $ headerPart ) {
115
- $ isFirstEntry = ($ i === 0 );
116
- $ response ->setHeader ($ headerName , $ headerPart .'; ' , $ isFirstEntry );
125
+ foreach ($ headerParts as $ i => $ headerPart ) {
126
+ $ response ->setHeader ($ headerName , $ headerPart .'; ' , $ i === 0 );
117
127
}
118
128
}
119
129
0 commit comments