13
13
14
14
use Symfony \Component \HttpFoundation \Request ;
15
15
use Symfony \Component \HttpFoundation \Response ;
16
- use Symfony \Component \HttpKernel \HttpKernelInterface ;
17
16
18
17
/**
19
18
* Esi implements the ESI capabilities to Request and Response instances.
26
25
*
27
26
* @author Fabien Potencier <fabien@symfony.com>
28
27
*/
29
- class Esi implements SurrogateInterface
28
+ class Esi extends AbstractSurrogate
30
29
{
31
- private $ contentTypes ;
32
- private $ phpEscapeMap = array (
33
- array ('<? ' , '<% ' , '<s ' , '<S ' ),
34
- array ('<?php echo "<?"; ?> ' , '<?php echo "<%"; ?> ' , '<?php echo "<s"; ?> ' , '<?php echo "<S"; ?> ' ),
35
- );
36
-
37
- /**
38
- * Constructor.
39
- *
40
- * @param array $contentTypes An array of content-type that should be parsed for ESI information.
41
- * (default: text/html, text/xml, application/xhtml+xml, and application/xml)
42
- */
43
- public function __construct (array $ contentTypes = array ('text/html ' , 'text/xml ' , 'application/xhtml+xml ' , 'application/xml ' ))
44
- {
45
- $ this ->contentTypes = $ contentTypes ;
46
- }
47
-
48
30
public function getName ()
49
31
{
50
32
return 'esi ' ;
51
33
}
52
34
53
35
/**
54
- * Returns a new cache strategy instance.
55
- *
56
- * @return ResponseCacheStrategyInterface A ResponseCacheStrategyInterface instance
57
- */
58
- public function createCacheStrategy ()
59
- {
60
- return new ResponseCacheStrategy ();
61
- }
62
-
63
- /**
64
- * Checks that at least one surrogate has ESI/1.0 capability.
65
- *
66
- * @param Request $request A Request instance
67
- *
68
- * @return bool true if one surrogate has ESI/1.0 capability, false otherwise
69
- */
70
- public function hasSurrogateCapability (Request $ request )
71
- {
72
- if (null === $ value = $ request ->headers ->get ('Surrogate-Capability ' )) {
73
- return false ;
74
- }
75
-
76
- return false !== strpos ($ value , 'ESI/1.0 ' );
77
- }
78
-
79
- /**
80
- * Adds ESI/1.0 capability to the given Request.
81
- *
82
- * @param Request $request A Request instance
83
- */
84
- public function addSurrogateCapability (Request $ request )
85
- {
86
- $ current = $ request ->headers ->get ('Surrogate-Capability ' );
87
- $ new = 'symfony2="ESI/1.0" ' ;
88
-
89
- $ request ->headers ->set ('Surrogate-Capability ' , $ current ? $ current .', ' .$ new : $ new );
90
- }
91
-
92
- /**
93
- * Adds HTTP headers to specify that the Response needs to be parsed for ESI.
94
- *
95
- * This method only adds an ESI HTTP header if the Response has some ESI tags.
96
- *
97
- * @param Response $response A Response instance
36
+ * {@inheritdoc}
98
37
*/
99
38
public function addSurrogateControl (Response $ response )
100
39
{
@@ -104,30 +43,7 @@ public function addSurrogateControl(Response $response)
104
43
}
105
44
106
45
/**
107
- * Checks that the Response needs to be parsed for ESI tags.
108
- *
109
- * @param Response $response A Response instance
110
- *
111
- * @return bool true if the Response needs to be parsed, false otherwise
112
- */
113
- public function needsParsing (Response $ response )
114
- {
115
- if (!$ control = $ response ->headers ->get ('Surrogate-Control ' )) {
116
- return false ;
117
- }
118
-
119
- return (bool ) preg_match ('#content="[^"]*ESI/1.0[^"]*"# ' , $ control );
120
- }
121
-
122
- /**
123
- * Renders an ESI tag.
124
- *
125
- * @param string $uri A URI
126
- * @param string $alt An alternate URI
127
- * @param bool $ignoreErrors Whether to ignore errors or not
128
- * @param string $comment A comment to add as an esi:include tag
129
- *
130
- * @return string
46
+ * {@inheritdoc}
131
47
*/
132
48
public function renderIncludeTag ($ uri , $ alt = null , $ ignoreErrors = true , $ comment = '' )
133
49
{
@@ -145,12 +61,7 @@ public function renderIncludeTag($uri, $alt = null, $ignoreErrors = true, $comme
145
61
}
146
62
147
63
/**
148
- * Replaces a Response ESI tags with the included resource content.
149
- *
150
- * @param Request $request A Request instance
151
- * @param Response $response A Response instance
152
- *
153
- * @return Response
64
+ * {@inheritdoc}
154
65
*/
155
66
public function process (Request $ request , Response $ response )
156
67
{
@@ -210,40 +121,4 @@ public function process(Request $request, Response $response)
210
121
}
211
122
}
212
123
}
213
-
214
- /**
215
- * Handles an ESI from the cache.
216
- *
217
- * @param HttpCache $cache An HttpCache instance
218
- * @param string $uri The main URI
219
- * @param string $alt An alternative URI
220
- * @param bool $ignoreErrors Whether to ignore errors or not
221
- *
222
- * @return string
223
- *
224
- * @throws \RuntimeException
225
- * @throws \Exception
226
- */
227
- public function handle (HttpCache $ cache , $ uri , $ alt , $ ignoreErrors )
228
- {
229
- $ subRequest = Request::create ($ uri , 'get ' , array (), $ cache ->getRequest ()->cookies ->all (), array (), $ cache ->getRequest ()->server ->all ());
230
-
231
- try {
232
- $ response = $ cache ->handle ($ subRequest , HttpKernelInterface::SUB_REQUEST , true );
233
-
234
- if (!$ response ->isSuccessful ()) {
235
- throw new \RuntimeException (sprintf ('Error when rendering "%s" (Status code is %s). ' , $ subRequest ->getUri (), $ response ->getStatusCode ()));
236
- }
237
-
238
- return $ response ->getContent ();
239
- } catch (\Exception $ e ) {
240
- if ($ alt ) {
241
- return $ this ->handle ($ cache , $ alt , '' , $ ignoreErrors );
242
- }
243
-
244
- if (!$ ignoreErrors ) {
245
- throw $ e ;
246
- }
247
- }
248
- }
249
124
}
0 commit comments