Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Esi.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 10.02 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\HttpKernel\HttpCache;
013   
014  use Symfony\Component\HttpFoundation\Request;
015  use Symfony\Component\HttpFoundation\Response;
016  use Symfony\Component\HttpKernel\HttpKernelInterface;
017   
018  /**
019   * Esi implements the ESI capabilities to Request and Response instances.
020   *
021   * For more information, read the following W3C notes:
022   *
023   *  * ESI Language Specification 1.0 (http://www.w3.org/TR/esi-lang)
024   *
025   *  * Edge Architecture Specification (http://www.w3.org/TR/edge-arch)
026   *
027   * @author Fabien Potencier <fabien@symfony.com>
028   */
029  class Esi implements SurrogateInterface
030  {
031      private $contentTypes;
032      private $phpEscapeMap = array(
033          array('<?', '<%', '<s', '<S'),
034          array('<?php echo "<?"; ?>', '<?php echo "<%"; ?>', '<?php echo "<s"; ?>', '<?php echo "<S"; ?>'),
035      );
036   
037      /**
038       * Constructor.
039       *
040       * @param array $contentTypes An array of content-type that should be parsed for ESI information
041       *                            (default: text/html, text/xml, application/xhtml+xml, and application/xml)
042       */
043      public function __construct(array $contentTypes = array('text/html', 'text/xml', 'application/xhtml+xml', 'application/xml'))
044      {
045          $this->contentTypes = $contentTypes;
046      }
047   
048      public function getName()
049      {
050          return 'esi';
051      }
052   
053      /**
054       * Returns a new cache strategy instance.
055       *
056       * @return ResponseCacheStrategyInterface A ResponseCacheStrategyInterface instance
057       */
058      public function createCacheStrategy()
059      {
060          return new ResponseCacheStrategy();
061      }
062   
063      /**
064       * Checks that at least one surrogate has ESI/1.0 capability.
065       *
066       * @param Request $request A Request instance
067       *
068       * @return bool true if one surrogate has ESI/1.0 capability, false otherwise
069       */
070      public function hasSurrogateCapability(Request $request)
071      {
072          if (null === $value = $request->headers->get('Surrogate-Capability')) {
073              return false;
074          }
075   
076          return false !== strpos($value, 'ESI/1.0');
077      }
078   
079      /**
080       * Checks that at least one surrogate has ESI/1.0 capability.
081       *
082       * @param Request $request A Request instance
083       *
084       * @return bool true if one surrogate has ESI/1.0 capability, false otherwise
085       *
086       * @deprecated since version 2.6, to be removed in 3.0. Use hasSurrogateCapability() instead
087       */
088      public function hasSurrogateEsiCapability(Request $request)
089      {
090          @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the hasSurrogateCapability() method instead.', E_USER_DEPRECATED);
091   
092          return $this->hasSurrogateCapability($request);
093      }
094   
095      /**
096       * Adds ESI/1.0 capability to the given Request.
097       *
098       * @param Request $request A Request instance
099       */
100      public function addSurrogateCapability(Request $request)
101      {
102          $current = $request->headers->get('Surrogate-Capability');
103          $new = 'symfony2="ESI/1.0"';
104   
105          $request->headers->set('Surrogate-Capability', $current ? $current.', '.$new : $new);
106      }
107   
108      /**
109       * Adds ESI/1.0 capability to the given Request.
110       *
111       * @param Request $request A Request instance
112       *
113       * @deprecated since version 2.6, to be removed in 3.0. Use addSurrogateCapability() instead
114       */
115      public function addSurrogateEsiCapability(Request $request)
116      {
117          @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the addSurrogateCapability() method instead.', E_USER_DEPRECATED);
118   
119          $this->addSurrogateCapability($request);
120      }
121   
122      /**
123       * Adds HTTP headers to specify that the Response needs to be parsed for ESI.
124       *
125       * This method only adds an ESI HTTP header if the Response has some ESI tags.
126       *
127       * @param Response $response A Response instance
128       */
129      public function addSurrogateControl(Response $response)
130      {
131          if (false !== strpos($response->getContent(), '<esi:include')) {
132              $response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
133          }
134      }
135   
136      /**
137       * Checks that the Response needs to be parsed for ESI tags.
138       *
139       * @param Response $response A Response instance
140       *
141       * @return bool true if the Response needs to be parsed, false otherwise
142       */
143      public function needsParsing(Response $response)
144      {
145          if (!$control = $response->headers->get('Surrogate-Control')) {
146              return false;
147          }
148   
149          return (bool) preg_match('#content="[^"]*ESI/1.0[^"]*"#', $control);
150      }
151   
152      /**
153       * Checks that the Response needs to be parsed for ESI tags.
154       *
155       * @param Response $response A Response instance
156       *
157       * @return bool true if the Response needs to be parsed, false otherwise
158       *
159       * @deprecated since version 2.6, to be removed in 3.0. Use needsParsing() instead
160       */
161      public function needsEsiParsing(Response $response)
162      {
163          @trigger_error('The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0. Use the needsParsing() method instead.', E_USER_DEPRECATED);
164   
165          return $this->needsParsing($response);
166      }
167   
168      /**
169       * Renders an ESI tag.
170       *
171       * @param string $uri          A URI
172       * @param string $alt          An alternate URI
173       * @param bool   $ignoreErrors Whether to ignore errors or not
174       * @param string $comment      A comment to add as an esi:include tag
175       *
176       * @return string
177       */
178      public function renderIncludeTag($uri, $alt = null, $ignoreErrors = true, $comment = '')
179      {
180          $html = sprintf('<esi:include src="%s"%s%s />',
181              $uri,
182              $ignoreErrors ? ' onerror="continue"' : '',
183              $alt ? sprintf(' alt="%s"', $alt) : ''
184          );
185   
186          if (!empty($comment)) {
187              return sprintf("<esi:comment text=\"%s\" />\n%s", $comment, $html);
188          }
189   
190          return $html;
191      }
192   
193      /**
194       * Replaces a Response ESI tags with the included resource content.
195       *
196       * @param Request  $request  A Request instance
197       * @param Response $response A Response instance
198       *
199       * @return Response
200       */
201      public function process(Request $request, Response $response)
202      {
203          $type = $response->headers->get('Content-Type');
204          if (empty($type)) {
205              $type = 'text/html';
206          }
207   
208          $parts = explode(';', $type);
209          if (!in_array($parts[0], $this->contentTypes)) {
210              return $response;
211          }
212   
213          // we don't use a proper XML parser here as we can have ESI tags in a plain text response
214          $content = $response->getContent();
215          $content = preg_replace('#<esi\:remove>.*?</esi\:remove>#s', '', $content);
216          $content = preg_replace('#<esi\:comment[^>]+>#s', '', $content);
217   
218          $chunks = preg_split('#<esi\:include\s+(.*?)\s*(?:/|</esi\:include)>#', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
219          $chunks[0] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[0]);
220   
221          $i = 1;
222          while (isset($chunks[$i])) {
223              $options = array();
224              preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $chunks[$i], $matches, PREG_SET_ORDER);
225              foreach ($matches as $set) {
226                  $options[$set[1]] = $set[2];
227              }
228   
229              if (!isset($options['src'])) {
230                  throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.');
231              }
232   
233              $chunks[$i] = sprintf('<?php echo $this->surrogate->handle($this, %s, %s, %s) ?>'."\n",
234                  var_export($options['src'], true),
235                  var_export(isset($options['alt']) ? $options['alt'] : '', true),
236                  isset($options['onerror']) && 'continue' === $options['onerror'] ? 'true' : 'false'
237              );
238              ++$i;
239              $chunks[$i] = str_replace($this->phpEscapeMap[0], $this->phpEscapeMap[1], $chunks[$i]);
240              ++$i;
241          }
242          $content = implode('', $chunks);
243   
244          $response->setContent($content);
245          $response->headers->set('X-Body-Eval', 'ESI');
246   
247          // remove ESI/1.0 from the Surrogate-Control header
248          if ($response->headers->has('Surrogate-Control')) {
249              $value = $response->headers->get('Surrogate-Control');
250              if ('content="ESI/1.0"' == $value) {
251                  $response->headers->remove('Surrogate-Control');
252              } elseif (preg_match('#,\s*content="ESI/1.0"#', $value)) {
253                  $response->headers->set('Surrogate-Control', preg_replace('#,\s*content="ESI/1.0"#', '', $value));
254              } elseif (preg_match('#content="ESI/1.0",\s*#', $value)) {
255                  $response->headers->set('Surrogate-Control', preg_replace('#content="ESI/1.0",\s*#', '', $value));
256              }
257          }
258      }
259   
260      /**
261       * Handles an ESI from the cache.
262       *
263       * @param HttpCache $cache        An HttpCache instance
264       * @param string    $uri          The main URI
265       * @param string    $alt          An alternative URI
266       * @param bool      $ignoreErrors Whether to ignore errors or not
267       *
268       * @return string
269       *
270       * @throws \RuntimeException
271       * @throws \Exception
272       */
273      public function handle(HttpCache $cache, $uri, $alt, $ignoreErrors)
274      {
275          $subRequest = Request::create($uri, 'get', array(), $cache->getRequest()->cookies->all(), array(), $cache->getRequest()->server->all());
276   
277          try {
278              $response = $cache->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true);
279   
280              if (!$response->isSuccessful()) {
281                  throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $subRequest->getUri(), $response->getStatusCode()));
282              }
283   
284              return $response->getContent();
285          } catch (\Exception $e) {
286              if ($alt) {
287                  return $this->handle($cache, $alt, '', $ignoreErrors);
288              }
289   
290              if (!$ignoreErrors) {
291                  throw $e;
292              }
293          }
294      }
295  }
296