Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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

JsonResponse.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 4.45 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\HttpFoundation;
 013   
 014  /**
 015   * Response represents an HTTP response in JSON format.
 016   *
 017   * Note that this class does not force the returned JSON content to be an
 018   * object. It is however recommended that you do return an object as it
 019   * protects yourself against XSSI and JSON-JavaScript Hijacking.
 020   *
 021   * @see https://www.owasp.org/index.php/OWASP_AJAX_Security_Guidelines#Always_return_JSON_with_an_Object_on_the_outside
 022   *
 023   * @author Igor Wiedler <igor@wiedler.ch>
 024   */
 025  class JsonResponse extends Response
 026  {
 027      protected $data;
 028      protected $callback;
 029   
 030      /**
 031       * Constructor.
 032       *
 033       * @param mixed   $data    The response data
 034       * @param int     $status  The response status code
 035       * @param array   $headers An array of response headers
 036       */
 037      public function __construct($data = null, $status = 200, $headers = array())
 038      {
 039          parent::__construct('', $status, $headers);
 040   
 041          if (null === $data) {
 042              $data = new \ArrayObject();
 043          }
 044          $this->setData($data);
 045      }
 046   
 047      /**
 048       * {@inheritdoc}
 049       */
 050      public static function create($data = null, $status = 200, $headers = array())
 051      {
 052          return new static($data, $status, $headers);
 053      }
 054   
 055      /**
 056       * Sets the JSONP callback.
 057       *
 058       * @param string $callback
 059       *
 060       * @return JsonResponse
 061       *
 062       * @throws \InvalidArgumentException
 063       */
 064      public function setCallback($callback = null)
 065      {
 066          if (null !== $callback) {
 067              // taken from http://www.geekality.net/2011/08/03/valid-javascript-identifier/
 068              $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*+$/u';
 069              $parts = explode('.', $callback);
 070              foreach ($parts as $part) {
 071                  if (!preg_match($pattern, $part)) {
 072                      throw new \InvalidArgumentException('The callback name is not valid.');
 073                  }
 074              }
 075          }
 076   
 077          $this->callback = $callback;
 078   
 079          return $this->update();
 080      }
 081   
 082      /**
 083       * Sets the data to be sent as json.
 084       *
 085       * @param mixed $data
 086       *
 087       * @return JsonResponse
 088       *
 089       * @throws \InvalidArgumentException
 090       */
 091      public function setData($data = array())
 092      {
 093          // Encode <, >, ', &, and " for RFC4627-compliant JSON, which may also be embedded into HTML.
 094          $this->data = json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
 095   
 096          if (JSON_ERROR_NONE !== json_last_error()) {
 097              throw new \InvalidArgumentException($this->transformJsonError());
 098          }
 099   
 100          return $this->update();
 101      }
 102   
 103      /**
 104       * Updates the content and headers according to the json data and callback.
 105       *
 106       * @return JsonResponse
 107       */
 108      protected function update()
 109      {
 110          if (null !== $this->callback) {
 111              // Not using application/javascript for compatibility reasons with older browsers.
 112              $this->headers->set('Content-Type', 'text/javascript');
 113   
 114              return $this->setContent(sprintf('/**/%s(%s);', $this->callback, $this->data));
 115          }
 116   
 117          // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback)
 118          // in order to not overwrite a custom definition.
 119          if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) {
 120              $this->headers->set('Content-Type', 'application/json');
 121          }
 122   
 123          return $this->setContent($this->data);
 124      }
 125   
 126      private function transformJsonError()
 127      {
 128          if (function_exists('json_last_error_msg')) {
 129              return json_last_error_msg();
 130          }
 131   
 132          switch (json_last_error()) {
 133              case JSON_ERROR_DEPTH:
 134                  return 'Maximum stack depth exceeded.';
 135   
 136              case JSON_ERROR_STATE_MISMATCH:
 137                  return 'Underflow or the modes mismatch.';
 138   
 139              case JSON_ERROR_CTRL_CHAR:
 140                  return 'Unexpected control character found.';
 141   
 142              case JSON_ERROR_SYNTAX:
 143                  return 'Syntax error, malformed JSON.';
 144   
 145              case JSON_ERROR_UTF8:
 146                  return 'Malformed UTF-8 characters, possibly incorrectly encoded.';
 147   
 148              default:
 149                  return 'Unknown error.';
 150          }
 151      }
 152  }
 153