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. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
JsonResponse.php
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 // Encode <, >, ', &, and " characters in the JSON, making it also safe to be embedded into HTML.
031 // 15 === JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT
032 protected $encodingOptions = 15;
033
034 /**
035 * Constructor.
036 *
037 * @param mixed $data The response data
038 * @param int $status The response status code
039 * @param array $headers An array of response headers
040 */
041 public function __construct($data = null, $status = 200, $headers = array())
042 {
043 parent::__construct('', $status, $headers);
044
045 if (null === $data) {
046 $data = new \ArrayObject();
047 }
048
049 $this->setData($data);
050 }
051
052 /**
053 * Factory method for chainability.
054 *
055 * Example:
056 *
057 * return JsonResponse::create($data, 200)
058 * ->setSharedMaxAge(300);
059 *
060 * @param mixed $data The json response data
061 * @param int $status The response status code
062 * @param array $headers An array of response headers
063 *
064 * @return JsonResponse
065 */
066 public static function create($data = null, $status = 200, $headers = array())
067 {
068 return new static($data, $status, $headers);
069 }
070
071 /**
072 * Sets the JSONP callback.
073 *
074 * @param string|null $callback The JSONP callback or null to use none
075 *
076 * @return JsonResponse
077 *
078 * @throws \InvalidArgumentException When the callback name is not valid
079 */
080 public function setCallback($callback = null)
081 {
082 if (null !== $callback) {
083 // partially token from http://www.geekality.net/2011/08/03/valid-javascript-identifier/
084 // partially token from https://github.com/willdurand/JsonpCallbackValidator
085 // JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details.
086 // (c) William Durand <william.durand1@gmail.com>
087 $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u';
088 $reserved = array(
089 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while',
090 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super', 'const', 'export',
091 'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false',
092 );
093 $parts = explode('.', $callback);
094 foreach ($parts as $part) {
095 if (!preg_match($pattern, $part) || in_array($part, $reserved, true)) {
096 throw new \InvalidArgumentException('The callback name is not valid.');
097 }
098 }
099 }
100
101 $this->callback = $callback;
102
103 return $this->update();
104 }
105
106 /**
107 * Sets the data to be sent as JSON.
108 *
109 * @param mixed $data
110 *
111 * @return JsonResponse
112 *
113 * @throws \InvalidArgumentException
114 */
115 public function setData($data = array())
116 {
117 if (defined('HHVM_VERSION')) {
118 // HHVM does not trigger any warnings and let exceptions
119 // thrown from a JsonSerializable object pass through.
120 // If only PHP did the same...
121 $data = json_encode($data, $this->encodingOptions);
122 } else {
123 try {
124 if (PHP_VERSION_ID < 50400) {
125 // PHP 5.3 triggers annoying warnings for some
126 // types that can't be serialized as JSON (INF, resources, etc.)
127 // but doesn't provide the JsonSerializable interface.
128 set_error_handler(function () { return false; });
129 $data = @json_encode($data, $this->encodingOptions);
130 } else {
131 // PHP 5.4 and up wrap exceptions thrown by JsonSerializable
132 // objects in a new exception that needs to be removed.
133 // Fortunately, PHP 5.5 and up do not trigger any warning anymore.
134 if (PHP_VERSION_ID < 50500) {
135 // Clear json_last_error()
136 json_encode(null);
137 $errorHandler = set_error_handler('var_dump');
138 restore_error_handler();
139 set_error_handler(function () use ($errorHandler) {
140 if (JSON_ERROR_NONE === json_last_error()) {
141 return $errorHandler && false !== call_user_func_array($errorHandler, func_get_args());
142 }
143 });
144 }
145
146 $data = json_encode($data, $this->encodingOptions);
147 }
148
149 if (PHP_VERSION_ID < 50500) {
150 restore_error_handler();
151 }
152 } catch (\Exception $e) {
153 if (PHP_VERSION_ID < 50500) {
154 restore_error_handler();
155 }
156 if (PHP_VERSION_ID >= 50400 && 'Exception' === get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
157 throw $e->getPrevious() ?: $e;
158 }
159 throw $e;
160 }
161 }
162
163 if (JSON_ERROR_NONE !== json_last_error()) {
164 throw new \InvalidArgumentException(json_last_error_msg());
165 }
166
167 $this->data = $data;
168
169 return $this->update();
170 }
171
172 /**
173 * Returns options used while encoding data to JSON.
174 *
175 * @return int
176 */
177 public function getEncodingOptions()
178 {
179 return $this->encodingOptions;
180 }
181
182 /**
183 * Sets options used while encoding data to JSON.
184 *
185 * @param int $encodingOptions
186 *
187 * @return JsonResponse
188 */
189 public function setEncodingOptions($encodingOptions)
190 {
191 $this->encodingOptions = (int) $encodingOptions;
192
193 return $this->setData(json_decode($this->data));
194 }
195
196 /**
197 * Updates the content and headers according to the JSON data and callback.
198 *
199 * @return JsonResponse
200 */
201 protected function update()
202 {
203 if (null !== $this->callback) {
204 // Not using application/javascript for compatibility reasons with older browsers.
205 $this->headers->set('Content-Type', 'text/javascript');
206
207 return $this->setContent(sprintf('/**/%s(%s);', $this->callback, $this->data));
208 }
209
210 // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback)
211 // in order to not overwrite a custom definition.
212 if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) {
213 $this->headers->set('Content-Type', 'application/json');
214 }
215
216 return $this->setContent($this->data);
217 }
218 }
219