1313
1414use Symfony \Component \HttpFoundation \Request ;
1515use Symfony \Component \HttpFoundation \Response ;
16- use Symfony \Component \HttpKernel \HttpKernelInterface ;
1716
1817/**
1918 * Esi implements the ESI capabilities to Request and Response instances.
2625 *
2726 * @author Fabien Potencier <fabien@symfony.com>
2827 */
29- class Esiimplements SurrogateInterface
28+ class Esiextends AbstractSurrogate
3029{
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-
4830public function getName ()
4931 {
5032return 'esi ' ;
5133 }
5234
5335/**
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}
9837 */
9938public function addSurrogateControl (Response $ response )
10039 {
@@ -104,30 +43,7 @@ public function addSurrogateControl(Response $response)
10443 }
10544
10645/**
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}
13147 */
13248public function renderIncludeTag ($ uri ,$ alt =null ,$ ignoreErrors =true ,$ comment ='' )
13349 {
@@ -145,12 +61,7 @@ public function renderIncludeTag($uri, $alt = null, $ignoreErrors = true, $comme
14561 }
14662
14763/**
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}
15465 */
15566public function process (Request $ request ,Response $ response )
15667 {
@@ -199,51 +110,6 @@ public function process(Request $request, Response $response)
199110$ response ->headers ->set ('X-Body-Eval ' ,'ESI ' );
200111
201112// remove ESI/1.0 from the Surrogate-Control header
202- if ($ response ->headers ->has ('Surrogate-Control ' )) {
203- $ value =$ response ->headers ->get ('Surrogate-Control ' );
204- if ('content="ESI/1.0" ' ==$ value ) {
205- $ response ->headers ->remove ('Surrogate-Control ' );
206- }elseif (preg_match ('#,\s*content="ESI/1.0"# ' ,$ value )) {
207- $ response ->headers ->set ('Surrogate-Control ' ,preg_replace ('#,\s*content="ESI/1.0"# ' ,'' ,$ value ));
208- }elseif (preg_match ('#content="ESI/1.0",\s*# ' ,$ value )) {
209- $ response ->headers ->set ('Surrogate-Control ' ,preg_replace ('#content="ESI/1.0",\s*# ' ,'' ,$ value ));
210- }
211- }
212- }
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- }
113+ $ this ->removeFromControl ($ response );
248114 }
249115}